summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFeng Chen <VonChenPlus@gmail.com>2021-12-18 06:57:14 +0100
committerGitHub <noreply@github.com>2021-12-18 06:57:14 +0100
commite49184e6069a9d791d2df3c1958f5c4b1187e124 (patch)
treeb776caf722e0be0e680f67b0ad0842628162ef1c
parentImplement convert legacy to generic (diff)
parentMerge pull request #7570 from ameerj/favorites-expanded (diff)
downloadyuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar.gz
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar.bz2
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar.lz
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar.xz
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.tar.zst
yuzu-e49184e6069a9d791d2df3c1958f5c4b1187e124.zip
-rw-r--r--CMakeLists.txt10
-rw-r--r--README.md2
-rw-r--r--dist/languages/ca.ts1582
-rw-r--r--dist/languages/cs.ts1604
-rw-r--r--dist/languages/da.ts1576
-rw-r--r--dist/languages/de.ts1610
-rw-r--r--dist/languages/es.ts2517
-rw-r--r--dist/languages/fr.ts1644
-rw-r--r--dist/languages/it.ts1618
-rw-r--r--dist/languages/ja_JP.ts1608
-rw-r--r--dist/languages/ko_KR.ts1626
-rw-r--r--dist/languages/nb.ts1566
-rw-r--r--dist/languages/nl.ts1590
-rw-r--r--dist/languages/pl.ts1590
-rw-r--r--dist/languages/pt_BR.ts1612
-rw-r--r--dist/languages/pt_PT.ts1588
-rw-r--r--dist/languages/ru_RU.ts1734
-rw-r--r--dist/languages/sv.ts1582
-rw-r--r--dist/languages/tr_TR.ts1731
-rw-r--r--dist/languages/vi_VN.ts6044
-rw-r--r--dist/languages/zh_CN.ts1618
-rw-r--r--dist/languages/zh_TW.ts1794
-rw-r--r--externals/CMakeLists.txt4
m---------externals/SDL0
m---------externals/cubeb0
-rw-r--r--externals/find-modules/FindUnicorn.cmake18
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/audio_core/delay_line.cpp4
-rw-r--r--src/audio_core/delay_line.h4
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/bit_util.h7
-rw-r--r--src/common/host_memory.cpp4
-rw-r--r--src/common/input.h366
-rw-r--r--src/common/logging/filter.cpp1
-rw-r--r--src/common/logging/types.h1
-rw-r--r--src/common/settings.cpp1
-rw-r--r--src/common/settings.h15
-rw-r--r--src/common/settings_input.h70
-rw-r--r--src/common/x64/cpu_detect.cpp12
-rw-r--r--src/common/x64/native_clock.cpp36
-rw-r--r--src/core/CMakeLists.txt27
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp20
-rw-r--r--src/core/core.cpp20
-rw-r--r--src/core/core.h13
-rw-r--r--src/core/cpu_manager.cpp23
-rw-r--r--src/core/frontend/applets/controller.cpp45
-rw-r--r--src/core/frontend/applets/controller.h8
-rw-r--r--src/core/frontend/emu_window.cpp98
-rw-r--r--src/core/frontend/emu_window.h30
-rw-r--r--src/core/frontend/framebuffer_layout.cpp7
-rw-r--r--src/core/frontend/framebuffer_layout.h11
-rw-r--r--src/core/frontend/input.h217
-rw-r--r--src/core/hid/emulated_console.cpp232
-rw-r--r--src/core/hid/emulated_console.h190
-rw-r--r--src/core/hid/emulated_controller.cpp1139
-rw-r--r--src/core/hid/emulated_controller.h411
-rw-r--r--src/core/hid/emulated_devices.cpp459
-rw-r--r--src/core/hid/emulated_devices.h210
-rw-r--r--src/core/hid/hid_core.cpp214
-rw-r--r--src/core/hid/hid_core.h82
-rw-r--r--src/core/hid/hid_types.h635
-rw-r--r--src/core/hid/input_converter.cpp383
-rw-r--r--src/core/hid/input_converter.h96
-rw-r--r--src/core/hid/input_interpreter.cpp (renamed from src/core/frontend/input_interpreter.cpp)27
-rw-r--r--src/core/hid/input_interpreter.h (renamed from src/core/frontend/input_interpreter.h)54
-rw-r--r--src/core/hid/motion_input.cpp (renamed from src/input_common/motion_input.cpp)57
-rw-r--r--src/core/hid/motion_input.h (renamed from src/input_common/motion_input.h)27
-rw-r--r--src/core/hle/kernel/init/init_slab_setup.cpp2
-rw-r--r--src/core/hle/kernel/k_address_arbiter.cpp92
-rw-r--r--src/core/hle/kernel/k_auto_object.h4
-rw-r--r--src/core/hle/kernel/k_class_token.cpp5
-rw-r--r--src/core/hle/kernel/k_code_memory.cpp146
-rw-r--r--src/core/hle/kernel/k_code_memory.h66
-rw-r--r--src/core/hle/kernel/k_condition_variable.cpp245
-rw-r--r--src/core/hle/kernel/k_condition_variable.h2
-rw-r--r--src/core/hle/kernel/k_handle_table.cpp6
-rw-r--r--src/core/hle/kernel/k_handle_table.h2
-rw-r--r--src/core/hle/kernel/k_light_condition_variable.cpp80
-rw-r--r--src/core/hle/kernel/k_light_condition_variable.h58
-rw-r--r--src/core/hle/kernel/k_light_lock.cpp72
-rw-r--r--src/core/hle/kernel/k_light_lock.h2
-rw-r--r--src/core/hle/kernel/k_memory_block.h20
-rw-r--r--src/core/hle/kernel/k_page_linked_list.h4
-rw-r--r--src/core/hle/kernel/k_page_table.cpp123
-rw-r--r--src/core/hle/kernel/k_page_table.h10
-rw-r--r--src/core/hle/kernel/k_process.cpp30
-rw-r--r--src/core/hle/kernel/k_process.h1
-rw-r--r--src/core/hle/kernel/k_scheduler.cpp101
-rw-r--r--src/core/hle/kernel/k_scheduler.h2
-rw-r--r--src/core/hle/kernel/k_scheduler_lock.h10
-rw-r--r--src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h1
-rw-r--r--src/core/hle/kernel/k_server_session.cpp3
-rw-r--r--src/core/hle/kernel/k_synchronization_object.cpp151
-rw-r--r--src/core/hle/kernel/k_synchronization_object.h32
-rw-r--r--src/core/hle/kernel/k_thread.cpp246
-rw-r--r--src/core/hle/kernel/k_thread.h72
-rw-r--r--src/core/hle/kernel/k_thread_queue.cpp49
-rw-r--r--src/core/hle/kernel/k_thread_queue.h74
-rw-r--r--src/core/hle/kernel/kernel.cpp103
-rw-r--r--src/core/hle/kernel/kernel.h9
-rw-r--r--src/core/hle/kernel/service_thread.cpp33
-rw-r--r--src/core/hle/kernel/svc.cpp309
-rw-r--r--src/core/hle/kernel/svc_wrap.h27
-rw-r--r--src/core/hle/kernel/time_manager.cpp6
-rw-r--r--src/core/hle/service/am/am.cpp14
-rw-r--r--src/core/hle/service/am/am.h1
-rw-r--r--src/core/hle/service/am/applets/applet_controller.cpp19
-rw-r--r--src/core/hle/service/am/applets/applet_controller.h6
-rw-r--r--src/core/hle/service/am/applets/applets.cpp2
-rw-r--r--src/core/hle/service/audio/hwopus.cpp4
-rw-r--r--src/core/hle/service/caps/caps.h2
-rw-r--r--src/core/hle/service/friend/friend.cpp23
-rw-r--r--src/core/hle/service/glue/glue.cpp4
-rw-r--r--src/core/hle/service/glue/notif.cpp44
-rw-r--r--src/core/hle/service/glue/notif.h25
-rw-r--r--src/core/hle/service/hid/controllers/console_sixaxis.cpp65
-rw-r--r--src/core/hle/service/hid/controllers/console_sixaxis.h44
-rw-r--r--src/core/hle/service/hid/controllers/controller_base.cpp4
-rw-r--r--src/core/hle/service/hid/controllers/controller_base.h21
-rw-r--r--src/core/hle/service/hid/controllers/debug_pad.cpp72
-rw-r--r--src/core/hle/service/hid/controllers/debug_pad.h82
-rw-r--r--src/core/hle/service/hid/controllers/gesture.cpp257
-rw-r--r--src/core/hle/service/hid/controllers/gesture.h109
-rw-r--r--src/core/hle/service/hid/controllers/keyboard.cpp59
-rw-r--r--src/core/hle/service/hid/controllers/keyboard.h59
-rw-r--r--src/core/hle/service/hid/controllers/mouse.cpp64
-rw-r--r--src/core/hle/service/hid/controllers/mouse.h63
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp1760
-rw-r--r--src/core/hle/service/hid/controllers/npad.h661
-rw-r--r--src/core/hle/service/hid/controllers/stubbed.cpp6
-rw-r--r--src/core/hle/service/hid/controllers/stubbed.h13
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.cpp139
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.h86
-rw-r--r--src/core/hle/service/hid/controllers/xpad.cpp32
-rw-r--r--src/core/hle/service/hid/controllers/xpad.h61
-rw-r--r--src/core/hle/service/hid/hid.cpp463
-rw-r--r--src/core/hle/service/hid/hid.h35
-rw-r--r--src/core/hle/service/hid/ring_lifo.h54
-rw-r--r--src/core/hle/service/ldr/ldr.cpp8
-rw-r--r--src/core/hle/service/ns/ns.cpp23
-rw-r--r--src/core/hle/service/ns/ns.h7
-rw-r--r--src/core/hle/service/ns/pdm_qry.cpp69
-rw-r--r--src/core/hle/service/ns/pdm_qry.h33
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp13
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp5
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_vic.cpp10
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_vic.h3
-rw-r--r--src/core/hle/service/nvdrv/nvdata.h4
-rw-r--r--src/core/hle/service/pm/pm.cpp47
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp5
-rw-r--r--src/core/memory/cheat_engine.cpp3
-rw-r--r--src/core/perf_stats.h4
-rw-r--r--src/input_common/CMakeLists.txt60
-rwxr-xr-xsrc/input_common/analog_from_button.cpp238
-rw-r--r--src/input_common/drivers/gc_adapter.cpp (renamed from src/input_common/gcadapter/gc_adapter.cpp)489
-rw-r--r--src/input_common/drivers/gc_adapter.h135
-rw-r--r--src/input_common/drivers/keyboard.cpp112
-rw-r--r--src/input_common/drivers/keyboard.h56
-rw-r--r--src/input_common/drivers/mouse.cpp185
-rw-r--r--src/input_common/drivers/mouse.h81
-rw-r--r--src/input_common/drivers/sdl_driver.cpp926
-rw-r--r--src/input_common/drivers/sdl_driver.h (renamed from src/input_common/sdl/sdl_impl.h)65
-rw-r--r--src/input_common/drivers/tas_input.cpp320
-rw-r--r--src/input_common/drivers/tas_input.h201
-rw-r--r--src/input_common/drivers/touch_screen.cpp53
-rw-r--r--src/input_common/drivers/touch_screen.h44
-rw-r--r--src/input_common/drivers/udp_client.cpp591
-rw-r--r--src/input_common/drivers/udp_client.h (renamed from src/input_common/udp/client.h)128
-rw-r--r--src/input_common/gcadapter/gc_adapter.h168
-rw-r--r--src/input_common/gcadapter/gc_poller.cpp356
-rw-r--r--src/input_common/gcadapter/gc_poller.h78
-rw-r--r--src/input_common/helpers/stick_from_buttons.cpp317
-rw-r--r--[-rwxr-xr-x]src/input_common/helpers/stick_from_buttons.h (renamed from src/input_common/analog_from_button.h)7
-rw-r--r--src/input_common/helpers/touch_from_buttons.cpp84
-rw-r--r--src/input_common/helpers/touch_from_buttons.h (renamed from src/input_common/touch_from_button.h)7
-rw-r--r--src/input_common/helpers/udp_protocol.cpp (renamed from src/input_common/udp/protocol.cpp)2
-rw-r--r--src/input_common/helpers/udp_protocol.h (renamed from src/input_common/udp/protocol.h)75
-rw-r--r--src/input_common/input_engine.cpp362
-rw-r--r--src/input_common/input_engine.h229
-rw-r--r--src/input_common/input_mapping.cpp207
-rw-r--r--src/input_common/input_mapping.h83
-rw-r--r--src/input_common/input_poller.cpp970
-rw-r--r--src/input_common/input_poller.h217
-rw-r--r--src/input_common/keyboard.cpp121
-rw-r--r--src/input_common/keyboard.h47
-rw-r--r--src/input_common/main.cpp468
-rw-r--r--src/input_common/main.h152
-rw-r--r--src/input_common/motion_from_button.cpp34
-rw-r--r--src/input_common/motion_from_button.h25
-rw-r--r--src/input_common/mouse/mouse_input.cpp223
-rw-r--r--src/input_common/mouse/mouse_input.h116
-rw-r--r--src/input_common/mouse/mouse_poller.cpp299
-rw-r--r--src/input_common/mouse/mouse_poller.h109
-rw-r--r--src/input_common/sdl/sdl.cpp19
-rw-r--r--src/input_common/sdl/sdl.h51
-rw-r--r--src/input_common/sdl/sdl_impl.cpp1658
-rw-r--r--src/input_common/tas/tas_input.cpp455
-rw-r--r--src/input_common/tas/tas_input.h237
-rw-r--r--src/input_common/tas/tas_poller.cpp101
-rw-r--r--src/input_common/tas/tas_poller.h43
-rw-r--r--src/input_common/touch_from_button.cpp53
-rw-r--r--src/input_common/udp/client.cpp526
-rw-r--r--src/input_common/udp/udp.cpp110
-rw-r--r--src/input_common/udp/udp.h57
-rw-r--r--src/shader_recompiler/CMakeLists.txt12
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp22
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp31
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp18
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_image.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp26
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp171
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_select.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_special.cpp95
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp30
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp2
-rw-r--r--src/shader_recompiler/backend/glasm/glasm_emit_context.cpp (renamed from src/shader_recompiler/backend/glasm/emit_context.cpp)2
-rw-r--r--src/shader_recompiler/backend/glasm/glasm_emit_context.h (renamed from src/shader_recompiler/backend/glasm/emit_context.h)0
-rw-r--r--src/shader_recompiler/backend/glasm/reg_alloc.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_image.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_select.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_special.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/glsl_emit_context.cpp (renamed from src/shader_recompiler/backend/glsl/emit_context.cpp)2
-rw-r--r--src/shader_recompiler/backend/glsl/glsl_emit_context.h (renamed from src/shader_recompiler/backend/glsl/emit_context.h)0
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h4
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_select.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_special.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.cpp (renamed from src/shader_recompiler/backend/spirv/emit_context.cpp)2
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.h (renamed from src/shader_recompiler/backend/spirv/emit_context.h)0
-rw-r--r--src/shader_recompiler/environment.h4
-rw-r--r--src/video_core/CMakeLists.txt1
-rw-r--r--src/video_core/command_classes/codecs/codec.cpp86
-rw-r--r--src/video_core/gpu.cpp44
-rw-r--r--src/video_core/gpu.h5
-rw-r--r--src/video_core/host_shaders/CMakeLists.txt2
-rw-r--r--src/video_core/host_shaders/convert_abgr8_to_d24s8.frag18
-rw-r--r--src/video_core/host_shaders/convert_d24s8_to_abgr8.frag23
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp63
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h12
-rw-r--r--src/video_core/renderer_opengl/maxwell_to_gl.h1
-rw-r--r--src/video_core/renderer_vulkan/blit_image.cpp155
-rw-r--r--src/video_core/renderer_vulkan/blit_image.h25
-rw-r--r--src/video_core/renderer_vulkan/maxwell_to_vk.cpp9
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp202
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h14
-rw-r--r--src/video_core/shader_notify.cpp2
-rw-r--r--src/video_core/shader_notify.h2
-rw-r--r--src/video_core/surface.cpp7
-rw-r--r--src/video_core/surface.h14
-rw-r--r--src/video_core/texture_cache/format_lookup_table.cpp2
-rw-r--r--src/video_core/texture_cache/formatter.h2
-rw-r--r--src/video_core/texture_cache/texture_cache.h105
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h5
-rw-r--r--src/video_core/texture_cache/types.h1
-rw-r--r--src/video_core/texture_cache/util.cpp9
-rw-r--r--src/video_core/video_core.cpp6
-rw-r--r--src/video_core/video_core.h2
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp11
-rw-r--r--src/yuzu/CMakeLists.txt5
-rw-r--r--src/yuzu/applets/qt_controller.cpp155
-rw-r--r--src/yuzu/applets/qt_controller.h20
-rw-r--r--src/yuzu/applets/qt_profile_select.cpp17
-rw-r--r--src/yuzu/applets/qt_profile_select.h8
-rw-r--r--src/yuzu/applets/qt_software_keyboard.cpp135
-rw-r--r--src/yuzu/applets/qt_software_keyboard.h12
-rw-r--r--src/yuzu/applets/qt_web_browser.cpp70
-rw-r--r--src/yuzu/applets/qt_web_browser.h12
-rw-r--r--src/yuzu/bootmanager.cpp370
-rw-r--r--src/yuzu/bootmanager.h22
-rw-r--r--src/yuzu/configuration/config.cpp224
-rw-r--r--src/yuzu/configuration/configure_debug.cpp2
-rw-r--r--src/yuzu/configuration/configure_debug.ui7
-rw-r--r--src/yuzu/configuration/configure_debug_controller.cpp9
-rw-r--r--src/yuzu/configuration/configure_debug_controller.h7
-rw-r--r--src/yuzu/configuration/configure_general.cpp20
-rw-r--r--src/yuzu/configuration/configure_general.ui99
-rw-r--r--src/yuzu/configuration/configure_graphics.ui2
-rw-r--r--src/yuzu/configuration/configure_input.cpp66
-rw-r--r--src/yuzu/configuration/configure_input_advanced.cpp6
-rw-r--r--src/yuzu/configuration/configure_input_advanced.ui217
-rw-r--r--src/yuzu/configuration/configure_input_player.cpp1230
-rw-r--r--src/yuzu/configuration/configure_input_player.h57
-rw-r--r--src/yuzu/configuration/configure_input_player.ui50
-rw-r--r--src/yuzu/configuration/configure_input_player_widget.cpp715
-rw-r--r--src/yuzu/configuration/configure_input_player_widget.h173
-rw-r--r--src/yuzu/configuration/configure_input_profile_dialog.cpp4
-rw-r--r--src/yuzu/configuration/configure_motion_touch.cpp12
-rw-r--r--src/yuzu/configuration/configure_motion_touch.ui70
-rw-r--r--src/yuzu/configuration/configure_mouse_advanced.cpp276
-rw-r--r--src/yuzu/configuration/configure_mouse_advanced.h78
-rw-r--r--src/yuzu/configuration/configure_mouse_advanced.ui335
-rw-r--r--src/yuzu/configuration/configure_tas.cpp2
-rw-r--r--src/yuzu/configuration/configure_tas.ui9
-rw-r--r--src/yuzu/configuration/configure_touch_from_button.cpp27
-rw-r--r--src/yuzu/configuration/configure_touch_from_button.h5
-rw-r--r--src/yuzu/configuration/configure_vibration.cpp74
-rw-r--r--src/yuzu/configuration/configure_vibration.h3
-rw-r--r--src/yuzu/debugger/controller.cpp75
-rw-r--r--src/yuzu/debugger/controller.h38
-rw-r--r--src/yuzu/debugger/profiler.cpp2
-rw-r--r--src/yuzu/game_list.cpp39
-rw-r--r--src/yuzu/game_list.h5
-rw-r--r--src/yuzu/loading_screen.cpp4
-rw-r--r--src/yuzu/loading_screen.h4
-rw-r--r--src/yuzu/main.cpp593
-rw-r--r--src/yuzu/main.h11
-rw-r--r--src/yuzu/main.ui99
-rw-r--r--src/yuzu/uisettings.cpp4
-rw-r--r--src/yuzu/uisettings.h3
-rw-r--r--src/yuzu/util/controller_navigation.cpp177
-rw-r--r--src/yuzu/util/controller_navigation.h51
-rw-r--r--src/yuzu/util/overlay_dialog.cpp27
-rw-r--r--src/yuzu/util/overlay_dialog.h10
-rw-r--r--src/yuzu_cmd/config.cpp178
-rw-r--r--src/yuzu_cmd/default_ini.h17
-rw-r--r--src/yuzu_cmd/emu_window/emu_window_sdl2.cpp72
-rw-r--r--src/yuzu_cmd/emu_window/emu_window_sdl2.h11
-rw-r--r--src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp1
360 files changed, 42433 insertions, 26589 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6044e311a..a810e11c2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -57,7 +57,7 @@ function(check_submodules_present)
string(REGEX REPLACE "path *= *" "" module ${module})
if (NOT EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git")
message(FATAL_ERROR "Git submodule ${module} not found. "
- "Please run: git submodule update --init --recursive")
+ "Please run: \ngit submodule update --init --recursive")
endif()
endforeach()
endfunction()
@@ -131,7 +131,7 @@ add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS)
if (MSVC)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/std:c++latest>)
- # cubeb and boost still make use of deprecated result_of.
+ # boost still makes use of deprecated result_of.
add_definitions(-D_HAS_DEPRECATED_RESULT_OF)
else()
set(CMAKE_CXX_STANDARD 20)
@@ -167,7 +167,7 @@ macro(yuzu_find_packages)
set(REQUIRED_LIBS
# Cmake Pkg Prefix Version Conan Pkg
"Catch2 2.13.7 catch2/2.13.7"
- "fmt 8.0 fmt/8.0.0"
+ "fmt 8.0.1 fmt/8.0.1"
"lz4 1.8 lz4/1.9.2"
"nlohmann_json 3.8 nlohmann_json/3.8.0"
"ZLIB 1.2 zlib/1.2.11"
@@ -370,7 +370,7 @@ if (ENABLE_SDL2)
if (YUZU_USE_BUNDLED_SDL2)
# Detect toolchain and platform
if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64)
- set(SDL2_VER "SDL2-2.0.16")
+ set(SDL2_VER "SDL2-2.0.18")
else()
message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.")
endif()
@@ -390,7 +390,7 @@ if (ENABLE_SDL2)
elseif (YUZU_USE_EXTERNAL_SDL2)
message(STATUS "Using SDL2 from externals.")
else()
- find_package(SDL2 2.0.16 REQUIRED)
+ find_package(SDL2 2.0.18 REQUIRED)
# Some installations don't set SDL2_LIBRARIES
if("${SDL2_LIBRARIES}" STREQUAL "")
diff --git a/README.md b/README.md
index 2cb030aed..c09d49ca4 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ It is written in C++ with portability in mind, and we actively maintain builds f
alt="Azure Mainline CI Build Status">
</a>
<a href="https://discord.com/invite/u77vRWY">
- <img src="https://img.shields.io/discord/398318088170242053?color=%237289DA&label=yuzu&logo=discord&logoColor=white"
+ <img src="https://img.shields.io/discord/398318088170242053?color=5865F2&label=yuzu&logo=discord&logoColor=white"
alt="Discord">
</a>
</p>
diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts
index 9b58c6661..8ba93205d 100644
--- a/dist/languages/ca.ts
+++ b/dist/languages/ca.ts
@@ -656,7 +656,12 @@ p, li {white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -936,67 +941,78 @@ p, li {white-space: pre-wrap; }
<translation>General</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Percentatge de Velocitat Límit</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulació CPU Multinucli</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Confirmar la sortida mentre s&apos;està executant l&apos;emulació</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Sol·licitar l&apos;usuari en l&apos;arrencada del joc</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausa l&apos;emulació en segon pla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Ocultar el cursor del ratolí quan no està actiu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation type="unfinished"/>
</message>
@@ -1114,18 +1130,113 @@ p, li {white-space: pre-wrap; }
<translation>Estirar a la finestra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Utilitza un color de fons global</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Configura un color de fons:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Color de Fons:</translation>
</message>
@@ -1194,27 +1305,32 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Valor Predeterminat</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Valor Predeterminat</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1542,8 +1658,8 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Altre</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1552,66 +1668,75 @@ p, li {white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation type="unfinished"/>
+ <source>Mouse</source>
+ <translation>Ratolí</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Pantalla Tàctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avançat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Controlador de Depuració</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avançat</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
+ <source>Configure</source>
+ <translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
- <source>Touchscreen</source>
- <translation>Pantalla Tàctil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Altre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Ratolí</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Moviment / Tàctil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
+ <source>Requires restarting yuzu</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
- <source>Configure</source>
- <translation>Configurar</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
+ <source>Enable XInput 8 player support (disables web applet)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Controlador de Depuració</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
- <source>Requires restarting yuzu</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
- <source>Enable XInput 8 player support (disables web applet)</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Moviment / Tàctil</translation>
+ </message>
</context>
<context>
<name>ConfigureInputPlayer</name>
@@ -1626,424 +1751,440 @@ p, li {white-space: pre-wrap; }
<translation>Connectar Controlador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Joycons Duals</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon esquerra</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon Dret</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Portàtil</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Dispositiu d&apos;Entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Qualsevol</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Teclat/Ratolí</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nou</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Esborrar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Palanca Esquerra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Amunt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Esquerra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Dreta</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Abaix</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Pressionat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Rang</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Zona Morta: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Rang del Modificador: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>Creueta</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Menys</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Captura</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Més</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Inici</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Botons Frontals</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Palanca Dreta</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Zona Morta: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Rang del Modificador: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Joycons Duals</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon esquerra</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon Dret</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Portàtil</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[esperant]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
@@ -2069,85 +2210,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configurar Moviment / Tàctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilitat:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Tàctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configuració</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Utilitzar el mapeig de botons:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configuració CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Pot utilitzar qualsevol font d&apos;entrada UDP compatible amb Cemuhook per a proporcionar una entrada de moviment i de tacte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Servidor:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Més Informació</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Provar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation type="unfinished"/>
</message>
@@ -2157,146 +2288,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Més Informació&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Provant</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configurant</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Prova Exitosa</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>S&apos;han rebut dades des del servidor correctament.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Prova Fallida</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>No s&apos;han pogut rebre dades vàlides des del servidor.&lt;br&gt;Si us plau, verifiqui que el servidor està configurat correctament i que la direcció i el port són correctes. </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>La prova del UDP o la configuració de la calibració està en curs.&lt;br&gt;Si us plau, esperi a que acabi el procés.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configurar Ratolí</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Botons del Ratolí</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Endavant:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Enrere:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Esquerra:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Mig:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Dreta:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Netejar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Valors Predeterminats</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[no establert]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Restaurar Valor Predeterminat</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[pressioni una tecla]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3079,31 +3146,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3116,7 +3178,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3178,37 +3240,37 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nou Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Introdueixi el nom per al nou perfil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Esborrar Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Esborrar perfil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Renombrar Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nou nom:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[pressioni una tecla]</translation>
</message>
@@ -3628,12 +3690,12 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation type="unfinished"/>
</message>
@@ -3641,89 +3703,94 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Es recullen dades anònimes&lt;/a&gt; per ajudar a millorar yuzu. &lt;br/&gt;&lt;br/&gt;Desitja compartir les seves dades d&apos;ús amb nosaltres?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetria</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Carregant Web Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>La quantitat de shaders que s&apos;estan compilant actualment</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Velocitat d&apos;emulació actual. Valors superiors o inferiors a 100% indiquen que l&apos;emulació s&apos;està executant més ràpidament o més lentament que a la Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Quants fotogrames per segon està mostrant el joc actualment. Això variarà d&apos;un joc a un altre i d&apos;una escena a una altra.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Temps que costa emular un fotograma de la Switch, sense tenir en compte la limitació de fotogrames o la sincronització vertical. Per a una emulació òptima, aquest valor hauria de ser com a màxim de 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>ACOBLAT</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3775,656 +3842,723 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les
<translation>Ha ocorregut un error desconegut. Si us plau, consulti el registre per a més detalls.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Dades de Jocs Guardats</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Dades de Mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Error Obrint la Carpeta %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>La carpeta no existeix!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Error Obrint el Cache Transferible de Shaders</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Continguts</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Actualització</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Eliminar Entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Eliminar el joc instal·lat %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>S&apos;ha Eliminat Correctament</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>S&apos;ha eliminat correctament el joc base instal·lat.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Error eliminant %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>El joc base no està instal·lat a la NAND i no pot ser eliminat.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>S&apos;ha eliminat correctament l&apos;actualització instal·lada.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>No hi ha cap actualització instal·lada per aquest títol.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>No hi ha cap DLC instal·lat per aquest títol.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>S&apos;ha eliminat correctament %1 DLC instal·lat/s.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Eliminar la Configuració Personalitzada del Joc?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Eliminar Arxiu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Error eliminant el Cache Transferible de Shaders</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>No existeix un cache de shaders per a aquest títol.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>S&apos;ha eliminat correctament el cache transferible de shaders.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>No s&apos;ha pogut eliminar la cache transferible de shaders.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Error Eliminant la Configuració Personalitzada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>No existeix una configuració personalitzada per aquest joc.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>S&apos;ha eliminat correctament la configuració personalitzada del joc.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>No s&apos;ha pogut eliminar la configuració personalitzada del joc.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>La extracció de RomFS ha fallat!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>S&apos;ha produït un error copiant els arxius RomFS o l&apos;usuari ha cancel·lat la operació.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Completa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Esquelet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Seleccioni el Mode de Bolcat de RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Si us plau, seleccioni la forma en que desitja bolcar la RomFS.&lt;br&gt;Completa copiarà tots els arxius al nou directori mentre que&lt;br&gt;esquelet només crearà l&apos;estructura de directoris.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extraient RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Cancel·la</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Extracció de RomFS Completada Correctament!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>La operació s&apos;ha completat correctament.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Error Obrint %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Seleccionar Directori</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Propietats</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Les propietats del joc no s&apos;han pogut carregar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Executable de Switch (%1);;Tots els Arxius (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Carregar Arxiu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Obrir el Directori de la ROM extreta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Directori Seleccionat Invàlid</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>El directori que ha seleccionat no conté un arxiu &apos;main&apos;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Arxiu de Switch Instal·lable (*.nca *.nsp *.xci);;Arxiu de Continguts Nintendo (*.nca);;Paquet d&apos;enviament Nintendo (*.nsp);;Imatge de Cartutx NX (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Instal·lar Arxius</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instal·lant arxiu &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Resultats Instal·lació</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Aplicació de Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Arxiu de Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Actualització de l&apos;Aplicació del Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Paquet de Firmware (Tipus A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Paquet de Firmware (Tipus B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Joc</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Actualització Joc</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>DLC Joc</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Títol Delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Seleccioni el Tipus d&apos;Instal·lació NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Seleccioni el tipus de títol que desitja instal·lar aquest NCA com a:
(En la majoria dels casos, el valor predeterminat &apos;Joc&apos; està bé.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Ha Fallat la Instal·lació</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>El tipus de títol seleccionat per el NCA és invàlid.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Arxiu no trobat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Arxiu &quot;%1&quot; no trobat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Falta el Compte de yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Per tal d&apos;enviar un cas de prova de compatibilitat de joc, ha de vincular el seu compte de yuzu.&lt;br&gt;&lt;br/&gt;Per a vincular el seu compte de yuzu, vagi a Emulació &amp; gt; Configuració &amp; gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Error obrint URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>No es pot obrir la URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Arxiu Amiibo (%1);; Tots els Arxius (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Carregar Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Error obrint l&apos;arxiu de dades d&apos;Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>No s&apos;ha pogut obrir l&apos;arxiu de dades d&apos;Amiibo &quot;%1&quot; per a lectura.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Error llegint l&apos;arxiu de dades d&apos;Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>No s&apos;han pogut llegir completament les dades d&apos;Amiibo. S&apos;esperava llegir %1 bytes, però només s&apos;han pogut llegir %2 bytes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Error al carregar les dades d&apos;Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>No s&apos;han pogut carregar les dades d&apos;Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Captura de Pantalla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Imatge PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Velocitat: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Velocitat: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Joc: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Fotograma: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>El joc que està intentant carregar requereix d&apos;arxius addicionals de la seva Switch abans de poder jugar. &lt;br/&gt;&lt;br/&gt;Per a obtenir més informació sobre com bolcar aquests arxius, vagi a la següent pàgina de la wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Bolcar arxius del sistema i les fonts compartides des d&apos;una Consola Switch&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;Desitja tornar a la llista de jocs? Continuar amb l&apos;emulació pot provocar el tancament inesperat, dades de partides guardades corruptes o altres errors.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu no ha pogut localitzar l&apos;arxiu de sistema de la Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu no ha pogut localitzar un arxiu de sistema de la Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Arxiu del Sistema no Trobat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Falta Arxiu del Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu no ha pogut trobar les fonts compartides de la Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Fonts Compartides no Trobades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Falten les Fonts Compartides</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Error Fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu ha trobat un error fatal, consulti el registre per a obtenir més detalls. Per a més informació sobre com accedir al registre, consulti la següent pàgina: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Com carregar l&apos;arxiu de registre?&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt; Desitja tornar al llistat de jocs? Continuar amb l&apos;emulació pot provocar el tancament inesperat, dades de partides guardades corruptes o altres errors.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Trobat Error Fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Confirmi la Clau de Rederivació</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4441,37 +4575,37 @@ i opcionalment faci còpies de seguretat.
Això eliminarà els arxius de les claus generats automàticament i tornarà a executar el mòdul de derivació de claus.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Falten fusibles</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - Falta BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Falta BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - Falta PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Falten Components de Derivació</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Falten components que poden impedir que la derivació de la clau es completi. &lt;br&gt;Si us plau, segueixi &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guia d&apos;inici ràpid de yuzu&lt;/a&gt; per a obtenir totes les seves claus i jocs.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4480,39 +4614,39 @@ Això pot prendre fins a un minut depenent
del rendiment del seu sistema.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Derivant Claus</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Seleccioni el Destinatari per a Bolcar el RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Si us plau, seleccioni quin RomFS desitja bolcar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Està segur de que vol tancar yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Està segur de que vol aturar l&apos;emulació? Qualsevol progrés no guardat es perdrà.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4524,38 +4658,38 @@ Desitja tancar-lo de totes maneres?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL no disponible!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu no ha estat compilat amb suport per OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Error al inicialitzar OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4916,190 +5050,205 @@ d&apos;inici.</translation>
<translation>&amp;Emulació</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Veure</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
- <source>&amp;Tools</source>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Ajuda</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>S&amp;ortir</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pausar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Aturar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Mostrar Barra d&apos;Estat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Iniciar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5141,10 +5290,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5175,142 +5329,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[no establert]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Rotació %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Eix %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Botó %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[desconegut]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clic 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clic 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clic 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clic 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clic 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Eix GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Botó GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[sense ús]</translation>
</message>
@@ -5351,7 +5585,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5364,7 +5598,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation type="unfinished"/>
</message>
@@ -5377,7 +5611,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5390,7 +5624,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5418,7 +5652,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation type="unfinished"/>
</message>
@@ -5539,7 +5773,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5623,13 +5857,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts
index a2613e583..044b87ab8 100644
--- a/dist/languages/cs.ts
+++ b/dist/languages/cs.ts
@@ -658,7 +658,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -938,67 +943,78 @@ p, li { white-space: pre-wrap; }
<translation>Obecné</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Omezení rychlosti v procentech</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Vícejádrová emulace CPU</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Potvrzovat exit při spuštěné emulaci</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Zeptat se na uživatele při spuštění hry</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pozastavit emulaci, když je aplikace v pozadí</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Skrýt myš při neaktivitě</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Resetovat všechna nastavení</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Toto vyresetuje všechna nastavení a odstraní konfigurace pro jednotlivé hry. Složky s hrami a profily zůstanou zachovány. Přejete si pokračovat?</translation>
</message>
@@ -1116,18 +1132,113 @@ p, li { white-space: pre-wrap; }
<translation>Roztáhnout podle okna</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Použít globální barvu pozadí</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Nastavit barvu pozadí:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Barva Pozadí:</translation>
</message>
@@ -1196,28 +1307,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Výchozí</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (ROZBIJE VĚCI)</translation>
+ <source>Default</source>
+ <translation>Výchozí</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (ROZBIJE VĚCI)</translation>
+ <source>2x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (ROZBIJE VĚCI)</translation>
+ <source>4x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (ROZBIJE VĚCI)</translation>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1544,8 +1660,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Ostatní</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1554,499 +1670,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emulovat analog vstupem z klávesnice</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Povolit naklánění myší</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Citlivost myši</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Pokročilé</translation>
+ <source>Mouse</source>
+ <translation>Myš</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Dotyková obrazovka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Myš</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Pokročilé</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Pohyb / Dotyk</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Ovladač ladění</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Nastavení</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Ovladač ladění</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Ostatní</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emulovat analog vstupem z klávesnice</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Nakonfigurovat Vstup</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Připojit ovladač</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Povolit naklánění myší</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Citlivost myši</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Dual Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Levý Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Pohyb / Dotyk</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Pravý Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Nakonfigurovat Vstup</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>V rukou</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Připojit ovladač</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Vstupní zařízení</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Jakýkoliv</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Klávesnice/Myš</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Uložit</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nový</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Smazat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Levá Páčka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Nahoru</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Doleva</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Doprava</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Dolů</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Zmáčknuto</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modifikátor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Rozsah</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Deadzone: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Rozsah modifikátoru: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Capture</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Pohyb 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Pohyb 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Face Buttons</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Pravá páčka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[nenastaveno]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Přepnout tlačítko</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Převrátit osy</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Namapovat analogovou páčku</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Po stisknutí OK nejprve posuňte joystick horizontálně, poté vertikálně.
Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontálně.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Převrátit osy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Deadzone: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Rozsah modifikátoru: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Dual Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Levý Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Pravý Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>V rukou</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Ovladač GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Control Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Shake!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[čekání]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Nový profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Zadejte název profilu:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Vytvořit profil vstupu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Zadaný název profilu není platný!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Nepodařilo se vytvořit profil vstupu &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Odstranit profil vstupu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Nepodařilo se odstranit profil vstupu &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Načíst profil vstupu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Nepodařilo se načíst profil vstupu &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Uložit profil vstupu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Nepodařilo se uložit profil vstupu &quot;%1&quot;</translation>
</message>
@@ -2072,85 +2213,75 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Nastavení pohybu / dotyku</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Pohyb myší</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Citlivost:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Dotyk</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Kalibrace UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Konfigurovat </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Použít mapování tlačítek:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Nastavení CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Můžete použít jakýkoliv Cemuhook kompatibilní UDP vstupní zdroj pro poskytnutí pohybového a dotykového vstupu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Dozvědět se více</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Přidat server</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Odstranit server</translation>
</message>
@@ -2160,146 +2291,82 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Dozvědět se více&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Číslo portu obsahuje neplatné znaky</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Port musí být v rozsahu 0 až 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP adresa není platná</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>UDP server již existuje</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Není možné přidat více než 8 serverů</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testování</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Nastavování</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test byl úspěšný</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Úspěšně jsme získali data ze serveru.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test byl neúspěšný</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Nedostali jsme platná data ze serveru.&lt;br&gt;Prosím zkontrolujte, že váš server je nastaven správně a že adresa a port jsou zadány správně.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Probíhá test UDP nebo konfigurace kalibrace.&lt;br&gt;Prosím vyčkejte na dokončení.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Nastavení Myši</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Tlačítka Myši</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Vpřed:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Zpátky:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Vlevo:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Prostřed:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Vpravo:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Vyčistit</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Defaultní</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[nenastaveno]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Navrátit Základní Nastavení</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[zmačkni tlačítko]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3082,31 +3149,26 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3119,7 +3181,7 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3181,37 +3243,37 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nový profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Zadejte název nového profilu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Smazat profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Odstranit profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Přejmenovat profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nový název:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[stiskněte klávesu]</translation>
</message>
@@ -3631,12 +3693,12 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Ovladač P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Ovladač P1</translation>
</message>
@@ -3644,89 +3706,94 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymní data jsou sbírána&lt;/a&gt; pro vylepšení yuzu. &lt;br/&gt;&lt;br/&gt;Chcete s námi sdílet anonymní data?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetry</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Načítání Web Appletu...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Zakázat Web Applet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Zakázání Web Appletu způsobí, že se po zbytek emulované relace již nebude zobrazovat. To může vést k nedefinovanému chování a mělo by být použito pouze u hry Super Mario 3D All-Stars. Opravdu si přejete Web Applet zakázat?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Počet aktuálně sestavovaných shaderů</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Aktuální emulační rychlost. Hodnoty vyšší než 100% indikují, že emulace běží rychleji nebo pomaleji než na Switchi.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Kolik snímků za sekundu aktuálně hra zobrazuje. Tohle závisí na hře od hry a scény od scény.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Čas potřebný na emulaci framu scény, nepočítá se limit nebo v-sync. Pro plnou rychlost by se tohle mělo pohybovat okolo 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Zjištěno neplatné nastavení</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Ruční ovladač nelze používat v dokovacím režimu. Bude vybrán ovladač Pro Controller.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Vymazat poslední soubory</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Pokračovat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3778,657 +3845,724 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z
<translation>Nastala chyba. Koukni do logu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Uložit data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Módovat Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Chyba otevírání složky %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Složka neexistuje!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Chyba při otevírání přenositelné mezipaměti shaderů</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Obsah</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Aktualizace</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Odebrat položku</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Odebrat Nainstalovanou Hru %1? </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Úspěšně odebráno</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Úspěšně odebrán nainstalovaný základ hry.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Chyba při odstraňování %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Základ hry není nainstalovaný na NAND a nemůže být odstraněn.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Úspěšně odebrána nainstalovaná aktualizace.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Není nainstalovaná žádná aktualizace pro tento titul.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Není nainstalované žádné DLC pro tento titul.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Úspěšně odstraněno %1 nainstalovaných DLC.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Odstranit vlastní konfiguraci hry?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Odstranit soubor</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Chyba při odstraňování přenositelné mezipaměti shaderů</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Mezipaměť shaderů pro tento titul neexistuje.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Přenositelná mezipaměť shaderů úspěšně odstraněna</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Nepodařilo se odstranit přenositelnou mezipaměť shaderů</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Chyba při odstraňování vlastní konfigurace hry</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Vlastní konfigurace hry pro tento titul neexistuje.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Úspěšně odstraněna vlastní konfigurace hry.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Nepodařilo se odstranit vlastní konfiguraci hry.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Extrakce RomFS se nepovedla!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Nastala chyba při kopírování RomFS souborů, nebo uživatel operaci zrušil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Plný</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Kostra</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Vyber RomFS Dump Mode</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Vyber jak by si chtěl RomFS vypsat.&lt;br&gt;Plné zkopíruje úplně všechno, ale&lt;br&gt;kostra zkopíruje jen strukturu složky.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extrahuji RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Extrakce RomFS se povedla!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Operace byla dokončena úspěšně.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Chyba při otevírání %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Vybraná Složka</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Vlastnosti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Herní vlastnosti nemohly být načteny.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch Executable (%1);;Všechny soubory (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Načíst soubor</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Otevřít složku s extrahovanou ROM</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Vybraná složka je neplatná</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Složka kterou jste vybrali neobsahuje soubor &quot;main&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Instalovatelný soubor pro Switch (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Instalovat Soubory</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instalování souboru &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Výsledek instalace</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Abychom předešli možným konfliktům, nedoporučujeme uživatelům instalovat základní hry na paměť NAND.
Tuto funkci prosím používejte pouze k instalaci aktualizací a DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systémová Aplikace</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systémový archív</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systémový Update Aplikace</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Firmware-ový baliček (Typu A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Firmware-ový baliček (Typu B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Hra</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Update Hry</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Herní DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Title</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Vyberte typ instalace NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Vyberte typ title-u, který chcete nainstalovat tenhle NCA jako:
(Většinou základní &quot;game&quot; stačí.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Chyba v instalaci</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Tento typ pro tento NCA není platný.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Soubor nenalezen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Soubor &quot;%1&quot; nenalezen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Pokračovat</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Chybí účet yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Pro přidání recenze kompatibility je třeba mít účet yuzu&lt;br&gt;&lt;br/&gt;Pro nalinkování yuzu účtu jdi do Emulace &amp;gt; Konfigurace &amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Chyba při otevírání URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Nelze otevřít URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Soubor Amiibo (%1);; Všechny Soubory (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Načíst Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Chyba při načítání souboru Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Amiibo &quot;%1&quot; nešlo otevřít v řežimu pro čtení.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Chyba načítání Amiiba</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Načtení celého Amiiba nebylo možné. Očekáváno bylo %1 bytů, ale pouze %2 bytů se načetlo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Chyba načítání Amiiba</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Načtení Amiiba nebylo možné</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Pořídit Snímek Obrazovky</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG Image (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Rychlost: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Rychlost: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Hra: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Frame: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMÁLNÍ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU VYSOKÝ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTRÉMNÍ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU ERROR</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Hra, kterou se snažíte načíst potřebuje další data z vašeho Switche, než bude moci být načtena.&lt;br/&gt;&lt;br/&gt;Pro více informací o získání těchto souboru se koukněte na wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Získávání Systémových Archivů a Sdílených Fontu z konzole Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Přejete si odejít do listu her? Pokračování v emulaci by mohlo mít negativní účinky jako crashe, rozbité savy , nebo další bugy.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>Aplikace yuzu nenašla systémový archiv Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>Aplikace yuzu nenašla systémový archiv Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Systémový Archív Nenalezen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Chybí systémový archiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>Aplikace yuzu nenašla sdílená písma Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Sdílené Fonty Nenalezeny</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Chybí sdílené písmo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Fatální Chyba</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu narazilo na fatální chybu, prosím kouknšte do logu pro více informací. Pro více informací jak se dostat do logu se koukněte na následující stránku: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt; Jak Uploadnout Log&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Přejete si odejít do listu her? Pokračování v emulaci může mít za následek crashe, rozbité savy, nebo další bugy.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Vyskytla se kritická chyba</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Potvďte Rederivaci Klíčů</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4445,37 +4579,37 @@ a udělejte si zálohu.
Toto vymaže věechny vaše automaticky generované klíče a znova spustí modul derivace klíčů.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Chybí Fuses</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- Chybí BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Chybí BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - Chybí PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Chybé odvozené komponenty</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4484,39 +4618,39 @@ Tohle může zabrat až minutu
podle výkonu systému.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Derivuji Klíče</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Vyberte Cíl vypsaní RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Vyberte, kterou RomFS chcete vypsat.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Jste si jist, že chcete zavřít yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Jste si jist, že chcete ukončit emulaci? Jakýkolic neuložený postup bude ztracen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4528,38 +4662,38 @@ Opravdu si přejete ukončit tuto aplikaci?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL není k dispozici!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu nebylo sestaveno s OpenGL podporou.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Chyba při inicializaci OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Vaše grafická karta pravděpodobně nepodporuje OpenGL nebo nejsou nainstalovány nejnovější ovladače.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Chyba při inicializaci OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Vaše grafická karta pravděpodobně nepodporuje OpenGL 4.6 nebo nejsou nainstalovány nejnovější ovladače.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Vaše grafická karta pravděpodobně nepodporuje jedno nebo více rozšíření OpenGL. Ujistěte se prosím, že jsou nainstalovány nejnovější ovladače.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Nepodporované rozšíření:&lt;br&gt;%2</translation>
</message>
@@ -4916,190 +5050,205 @@ Screen.</source>
<translation>&amp;Emulace</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Pohled</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Resetovat Velikost Okna</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Ladění</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Nastavit velikost okna na &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Nastavit velikost okna na 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>Resetovat Velikost Okna na &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>Resetovat Velikost Okna na 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Nastavit velikost okna na &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Nastavit velikost okna na 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Ladění</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Nástroje</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Pomoc</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Instalovat soubory na NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>Načís&amp;t soubor...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>Načíst sl&amp;ožku...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>E&amp;xit</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pauza</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Znovu inicializovat klíče...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>O &amp;aplikaci yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>&amp;Režim jednoho okna</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>&amp;Nastavení</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>Zobrazit záhlaví widgetů d&amp;oku</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>Zobrazit &amp;filtrovací panel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>Zobrazit &amp;stavový řádek</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Zobrazit Staus Bar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>&amp;Celá obrazovka</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Restartovat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Načíst &amp;Amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Nahlásit kompatibilitu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Otevřít stránku s &amp;modifikacemi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>Otevřít &amp;rychlého průvodce</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>Často &amp;kladené otázky</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Otevřít složku s &amp;yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>Za&amp;chytit snímek obrazovky</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Nastavení současné hry</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5145,10 +5294,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>START/PAUSE</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5179,142 +5333,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[Nenastaveno]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Poziční klobouček %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Osa %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Tlačítko %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[Neznámá]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Klik 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Klik 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Klik 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Klik 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Klik 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC osa %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC tlačítko %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Pohyb %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL pohyb</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Klik %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[nepoužito]</translation>
</message>
@@ -5355,7 +5589,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5368,7 +5602,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Oba Joycony</translation>
</message>
@@ -5381,7 +5615,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Levý Joycon</translation>
</message>
@@ -5394,7 +5628,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Pravý Joycon</translation>
</message>
@@ -5422,7 +5656,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Handheld</translation>
</message>
@@ -5543,7 +5777,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Ovladač GameCube</translation>
</message>
@@ -5637,13 +5871,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Storno</translation>
</message>
diff --git a/dist/languages/da.ts b/dist/languages/da.ts
index c125586dd..c62fd142d 100644
--- a/dist/languages/da.ts
+++ b/dist/languages/da.ts
@@ -666,7 +666,12 @@ p, li { white-space: pre-wrap; }
<translation>Aktivér Automatisk Stub**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Dette vil automatisk blive nulstillet, når yuzu lukkes.</translation>
</message>
@@ -946,67 +951,78 @@ p, li { white-space: pre-wrap; }
<translation>Generelt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Billedfrekvensloft</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation>Kræver brug af FPS-Begrænsnings-Skift genvejstast, for at træde i kraft.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Billedfrekvensloft</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Begræns Hastighedsprocent</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Flerkerne-CPU-Emulering</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Bekræft afslutning, mens emulering kører</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Spørg efter bruger, ved opstart af spil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Sæt emulering på pause, når i baggrund</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Skjul mus ved inaktivitet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Nulstil Alle Indstillinger</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>dette nulstiller alle indstillinger og fjerner alle pr-spil-konfigurationer. Dette vil ikke slette spilmapper, -profiler, eller input-profiler. Fortsæt?</translation>
</message>
@@ -1124,18 +1140,113 @@ p, li { white-space: pre-wrap; }
<translation>Stræk til Vindue</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Brug global baggrundsfarve</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Angiv baggrundsfarve:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Baggrundsfarve:</translation>
</message>
@@ -1204,28 +1315,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Standard</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (VIL ØDELÆGGE NOGET)</translation>
+ <source>Default</source>
+ <translation>Standard</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (VIL ØDELÆGGE NOGET)</translation>
+ <source>2x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (VIL ØDELÆGGE NOGET)</translation>
+ <source>4x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (VIL ØDELÆGGE NOGET)</translation>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1552,8 +1668,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Andet</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1562,499 +1678,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emulér Analog med Tastaturinput</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Aktivér kig med mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Mus-følsomhed</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avanceret</translation>
+ <source>Mouse</source>
+ <translation>Mus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Berøringsfølsom Skærm</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mus</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avanceret</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Bevægelse / Berøring</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Fejlfindings-Styringsenhed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Konfigurér</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Fejlfindings-Styringsenhed</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Andet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emulér Analog med Tastaturinput</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Kræver genstart af yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>Aktivér XInput 8-spiller-understøttelse (deaktiverer net-applet)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Konfigurér Input</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Tilslut Styringsenhed</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Aktivér kig med mus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro-Styringsenhed</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Mus-følsomhed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Dobbelt-Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Venstre Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Bevægelse / Berøring</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Højre Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Konfigurér Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Håndholdt</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Tilslut Styringsenhed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Inputenhed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Enhver</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Tastatur/Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Gem</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Ny</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Slet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Venstre Styrepind</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Op</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Venstre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Højre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>ed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Nedtrykt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Forandrer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Rækkevidde</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Dødzone: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Forandr Rækkevidde: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>Retningskryds</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Optag</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Hjem</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Bevægelse 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Bevægelse 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Frontknapper:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Højre Styrepind</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Ryd</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[ikke indstillet]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Funktionsskifteknap</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Omvend akser</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Angiv tærskel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Vælg en værdi imellem 0% og 100%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Tilsted Analog Pind</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Bevæg, efter tryk på OK, først din styrepind vandret og så lodret.
Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Omvend akser</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Dødzone: 1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Forandringsrækkevidde: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro-Styringsenhed</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Dobbelt-Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Venstre Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Højre Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Håndholdt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube-Styringsenhed</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Styrepind</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Pind</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Ryst!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[venter]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Ny Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Indtast et profilnavn:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Opret Input-Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Det angivne profilnavn er ikke gyldigt!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Oprettelse af input-profil &quot;%1&quot; mislykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Slet Input-Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Sletning af input-profil &quot;%1&quot; mislykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Indlæs Input-Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Indlæsning af input-profil &quot;%1&quot; mislykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Gem Input-Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Lagring af input-profil &quot;%1&quot; mislykkedes</translation>
</message>
@@ -2080,85 +2221,75 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.</tra
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Konfigurér Bevægelse / Berøring</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Musebevægelse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Følsomhed:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Berøring</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP-Kalibrering:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Konfigurér</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Brug knaptildeling</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP-Konfiguration</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Du må bruge enhver Cemuhook-kompatibel input-kilde, til at give bevægelses- og berøringsinput.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Find Ud Af Mere</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Afprøv</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Tilføj Server</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Fjernserver</translation>
</message>
@@ -2168,146 +2299,82 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.</tra
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Find Ud Af Mere&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Portnummer indeholder ugyldige tegn</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Port skal være imellem 0 and 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP-adresse er ikke gyldig</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Denne UDP-server eksisterer allerede</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Ude af stand til, at tilføje mere end 8 servere</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Afprøvning</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Konfigurér</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Afprøvning Lykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Modtagelse af data fra serveren lykkedes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Afprøvning Mislykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Kunne ikke modtage gyldig data fra serveren.&lt;br&gt;Bekræft venligst, at serveren er opsat korrekt, og at adressen og porten er korrekte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP-Afprøvnings- eller -kalibreringskonfiguration er i gang.&lt;br&gt;vent venligst på, at de bliver færdige.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Konfigurér Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Museknapper</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Frem:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Tilbage:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Venstre:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Midte:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Højre:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Ryd</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Standarder</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[ikke indstillet]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Gendan Standard</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[tryk på tast]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3090,31 +3157,26 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.</tra
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Automatisk styringsenhedsprofil-ombytning</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>Loop skrift</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>Sæt eksekvering på pause under indlæsninger</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Skriftmappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Sti</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3127,7 +3189,7 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.</tra
<translation>TAS-Konfiguration</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>Vælg TAS-Indlæsningsmappe...</translation>
</message>
@@ -3189,37 +3251,37 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Ny Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Indtast navnet på den nye profil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Slet Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Slet profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Omdøb Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nyt navn:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[tryk på tast]</translation>
</message>
@@ -3639,12 +3701,12 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Styringsenhed P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Styringsenhed P1</translation>
</message>
@@ -3652,89 +3714,94 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonym data indsamles&lt;/a&gt;, for at hjælp med, at forbedre yuzu. &lt;br/&gt;&lt;br/&gt;Kunne du tænke dig, at dele dine brugsdata med os?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetri</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Indlæser Net-Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Deaktivér Net-Applet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Aktuel emuleringshastighed. Værdier højere eller lavere end 100% indikerer, at emulering kører hurtigere eller langsommere end en Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3786,655 +3853,722 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Fejl ved Åbning af %1 Mappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Mappe eksisterer ikke!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS-Udpakning Mislykkedes!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Der skete en fejl ved kopiering af RomFS-filerne, eller brugeren afbrød opgaven.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Fuld</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Skelet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Vælg RomFS-Nedfældelsestilstand</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Udpakker RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Afbryd</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS-Udpakning Lykkedes!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Fuldførelse af opgaven lykkedes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Fejl ved Åbning af %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Vælg Mappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Egenskaber</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Spil-egenskaberne kunne ikke indlæses.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch-Eksekverbar (%1);;Alle filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Indlæs Fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Åbn Udpakket ROM-Mappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Ugyldig Mappe Valgt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Installér fil &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systemapplikation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systemarkiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systemapplikationsopdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Firmwarepakke (Type A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Firmwarepakke (Type B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Spil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Spilopdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Spiludvidelse</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta-Titel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Vælg NCA-Installationstype...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Installation mislykkedes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Fil ikke fundet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Fil &quot;%1&quot; ikke fundet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Manglende yuzu-Konto</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo-Fil (%1);; Alle Filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Indlæs Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Fejl ved åbning af Amiibo-datafil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Ude af stand til, at åbne Amiibo-fil &quot;%1&quot; til indlæsning.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Fejl ved indlæsning af Amiibo-datafil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Fejl ved indlæsning af Amiibo-data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Ude af stand til, at indlæse Amiibo-data.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Optag Skærmbillede</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG-Billede (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Hastighed: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Hastighed: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Spil: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Billede: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu var ude af stand til, at lokalisere et Switch-systemarkiv. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu var ude af stand til, at lokalisere et Switch-systemarkiv. %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Systemarkiv Ikke Fundet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Systemarkiv Mangler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu var ude af stand til, at finde delte Switch-skrifttyper. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Delte Skrifttyper Ikke Fundet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Delte Skrifttyper Mangler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Fatal Fejl</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Stødte på Fatal Fejl</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4445,76 +4579,76 @@ This will delete your autogenerated key files and re-run the key derivation modu
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Er du sikker på, at du vil lukke yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Er du sikker på, at du vil stoppe emulereingen? Enhver ulagret data, vil gå tabt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4524,38 +4658,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4911,190 +5045,205 @@ Screen.</source>
<translation>&amp;Emulering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
- <source>&amp;Tools</source>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Hjælp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Vis Statuslinje</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5136,10 +5285,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5170,142 +5324,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Skift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[ikke indstillet]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Akse %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Knap %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[ukendt]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
+ <source>Down</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
+ <source>Up</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
+ <source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
+ <source>R</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
+ <source>L</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[ubrugt]</translation>
</message>
@@ -5346,7 +5580,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5359,7 +5593,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation type="unfinished"/>
</message>
@@ -5372,7 +5606,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5385,7 +5619,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5413,7 +5647,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation type="unfinished"/>
</message>
@@ -5534,7 +5768,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5618,13 +5852,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/de.ts b/dist/languages/de.ts
index ac17c0e22..2cb4c534f 100644
--- a/dist/languages/de.ts
+++ b/dist/languages/de.ts
@@ -657,7 +657,12 @@ p, li { white-space: pre-wrap; }
<translation>Auto-Stub** aktivieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -937,67 +942,78 @@ p, li { white-space: pre-wrap; }
<translation>Allgemein</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Bildratenbeschränkung</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Bildratenbeschränkung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Geschwindigkeit auf % festlegen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Multicore-CPU-Emulation</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Schließen des Emulators bestätigen, falls ein Spiel läuft</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Beim Spielstart nach Nutzer fragen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Emulation im Hintergrund pausieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Mauszeiger verstecken</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Setze alle Einstellungen zurück</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Hierdurch werden alle Einstellungen zurückgesetzt und alle spielspezifischen Konfigurationen gelöscht. Spiel-Ordner, Profile oder Eingabeprofile werden nicht gelöscht. Fortfahren?</translation>
</message>
@@ -1115,18 +1131,113 @@ p, li { white-space: pre-wrap; }
<translation>Auf Fenster anpassen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Globale Hintergrundfarbe verwenden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Hintergrundfarbe:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Hintergrundfarbe:</translation>
</message>
@@ -1195,27 +1306,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Standard</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Standard</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1543,8 +1659,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Weiteres</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1553,499 +1669,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Analog bei Tastatureingabe emulieren</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Maus-Panning aktivieren</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Maus-Empfindlichkeit</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Erweitert</translation>
+ <source>Mouse</source>
+ <translation>Maus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Touchscreen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Maus</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Erweitert</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Bewegung / Touch</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Debug Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Konfigurieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Debug Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Weiteres</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Analog bei Tastatureingabe emulieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Erfordet Neustart von yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Eingabe einrichten</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Controller verbinden</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Maus-Panning aktivieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Maus-Empfindlichkeit</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Zwei Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Linker Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Bewegung / Touch</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Rechter Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Eingabe einrichten</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Handheld</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Controller verbinden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Eingabegerät</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Alle</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Tastatur/Maus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Speichern</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Neu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Linker Analogstick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Hoch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Links</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Rechts</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Runter</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Gedrückt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modifikator</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Radius</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Deadzone: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modifikator-Radius: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>Steuerkreuz</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Screenshot</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Bewegung 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Bewegung 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Tasten</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Rechter Analogstick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Löschen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[nicht belegt]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Taste umschalten</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Achsen umkehren</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Wert zwischen 0% und 100% wählen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Analog-Stick festlegen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Nach dem Drücken von OK den Joystick zuerst horizontal, dann vertikal bewegen.
Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizontal.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Achsen umkehren</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Deadzone: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modifikator-Radius: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Zwei Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Linker Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Rechter Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Handheld</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube-Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Analog Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Schütteln!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[wartet]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Neues Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Profilnamen eingeben:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Eingabeprofil erstellen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Angegebener Profilname ist nicht gültig!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Erstellen des Eingabeprofils &quot;%1&quot; ist fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Eingabeprofil löschen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Löschen des Eingabeprofils &quot;%1&quot; ist fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Eingabeprofil laden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Laden des Eingabeprofils &quot;%1&quot; ist fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Eingabeprofil speichern</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Speichern des Eingabeprofils &quot;%1&quot; ist fehlgeschlagen</translation>
</message>
@@ -2071,85 +2212,75 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Bewegung / Touch einrichten</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Mausbewegung</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Empfindlichkeit:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP Kalibrierung:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Einrichtung</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Tastenbelegung nutzen:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP Konfiguration</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Du kannst alle Cemuhook-kompatiblen UDP-Eingabequellen für Bewegung und Touch verwenden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Mehr erfahren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Testen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Server hinzufügen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Server löschen</translation>
</message>
@@ -2159,146 +2290,82 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Mehr erfahren&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Port-Nummer hat ungültige Zeichen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Port muss zwischen 0 und 65353 liegen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP Adresse ist ungültig</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Dieser UDP-Server existiert bereits</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Es können nicht mehr als 8 Server hinzugefügt werden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Einrichten</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test erfolgreich</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Daten wurden erfolgreich vom Server empfangen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Konnte keine Daten vom Server empfangen.&lt;br&gt;Prüfe bitte, dass der Server korrekt eingerichtet wurde und dass Adresse und Port korrekt sind.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP-Test oder Kalibration wird gerade durchgeführt.&lt;br&gt;Bitte warte einen Moment.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Maus einrichten</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Maustasten</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Vorwärts:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Rückwärts:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Links:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Mitte:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Rechts:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Löschen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Standardwerte</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[nicht belegt]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Standardwert wiederherstellen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[Taste drücken]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3081,31 +3148,26 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Skript-Verzeichnis</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Pfad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3118,7 +3180,7 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta
<translation>TAS-Konfiguration</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3180,37 +3242,37 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Neues Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Neuen Namen für das Profil eingeben.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Profil löschen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Profil &quot;%1&quot; löschen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Profil umbenennen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Neuer Name:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[Knopf drücken]</translation>
</message>
@@ -3630,12 +3692,12 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Controller P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Controller P1</translation>
</message>
@@ -3643,90 +3705,95 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonyme Daten werden gesammelt,&lt;/a&gt; um yuzu zu verbessern.&lt;br/&gt;&lt;br/&gt;Möchstest du deine Nutzungsdaten mit uns teilen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetrie</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Lade Web-Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Deaktiviere die Web Applikation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Durch deaktivieren des Web-Applets wird es für den Rest der emulierten Sitzung nicht mehr angezeigt. Dies kann zu undefiniertem Verhalten führen und sollte nur mit Super Mario 3D All-Stars verwendet werden. Das Web-Applet wirklich deaktivieren?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Wie viele Shader im Moment kompiliert werden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Derzeitige Emulations-Geschwindigkeit. Werte höher oder niedriger als 100% zeigen, dass die Emulation scheller oder langsamer läuft als auf einer Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Wie viele Bilder pro Sekunde angezeigt werden variiert von Spiel zu Spiel und von Szene zu Szene. </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Zeit, die gebraucht wurde, um einen Switch-Frame zu emulieren, ohne Framelimit oder V-Sync. Für eine Emulation bei voller Geschwindigkeit sollte dieser Wert bei höchstens 16.67ms liegen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Ungültige Konfiguration erkannt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Handheld-Controller können nicht im Dock verwendet werden. Der Pro-Controller wird verwendet.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Zuletzt geladene Dateien leeren</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>TAS Aufnahme</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Fortsetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>Datei von Spieler 1 überschreiben?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3777,657 +3844,724 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf
<translation>Ein unbekannter Fehler ist aufgetreten. Bitte prüfe die Log-Dateien auf mögliche Fehlermeldungen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-Bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-Bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Speicherdaten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod-Daten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Konnte Verzeichnis %1 nicht öffnen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Verzeichnis existiert nicht!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Fehler beim Öffnen des transferierbaren Shader-Caches</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Inhalte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Update</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Eintrag entfernen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Installiertes Spiel %1 entfernen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Erfolgreich entfernt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Das Spiel wurde entfernt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Fehler beim Entfernen von %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Das Spiel ist nicht im NAND installiert und kann somit nicht entfernt werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Das Update wurde entfernt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Es ist kein Update für diesen Titel installiert.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Es sind keine DLC für diesen Titel installiert.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>%1 DLC entfernt. </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>Transferierbaren OpenGL Shader Cache löschen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Transferierbaren Vulkan Shader Cache löschen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>Alle transferierbaren Shader Caches löschen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Spiel-Einstellungen entfernen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Datei entfernen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Fehler beim Entfernen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Es existiert kein Shader-Cache für diesen Titel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Der transferierbare Shader-Cache wurde entfernt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Konnte den transferierbaren Shader-Cache nicht entfernen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>Fehler beim Entfernen der transferierbaren Shader Caches</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Fehler beim Entfernen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Es existieren keine Spiel-Einstellungen für dieses Spiel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Die Spiel-Einstellungen wurden entfernt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Die Spiel-Einstellungen konnten nicht entfernt werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS-Extraktion fehlgeschlagen!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Das RomFS konnte wegen eines Fehlers oder Abbruchs nicht kopiert werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Komplett</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Nur Ordnerstruktur</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>RomFS Extraktions-Modus auswählen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Bitte wähle, wie das RomFS gespeichert werden soll.&lt;br&gt;&quot;Full&quot; wird alle Dateien des Spiels extrahieren, während &lt;br&gt;&quot;Skeleton&quot; nur die Ordnerstruktur erstellt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>RomFS wird extrahiert...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS wurde extrahiert!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Der Vorgang wurde erfolgreich abgeschlossen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Fehler beim Öffnen von %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Verzeichnis auswählen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Einstellungen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Spiel-Einstellungen konnten nicht geladen werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch-Programme (%1);;Alle Dateien (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Datei laden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Öffne das extrahierte ROM-Verzeichnis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Ungültiges Verzeichnis ausgewählt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Das Verzeichnis, das du ausgewählt hast, enthält keine &apos;main&apos;-Datei.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Installierbares Switch-Programm (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Dateien installieren</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Datei &quot;%1&quot; wird installiert...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>NAND-Installation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Um Konflikte zu vermeiden, raten wir Nutzern davon ab, Spiele im NAND zu installieren.
Bitte nutze diese Funktion nur zum Installieren von Updates und DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systemanwendung</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systemarchiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systemanwendungsupdate</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Firmware-Paket (Typ A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Firmware-Paket (Typ B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Spiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Spiel-Update</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Spiel-DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta-Titel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Wähle den NCA-Installationstyp aus...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Bitte wähle, als was diese NCA installiert werden soll:
(In den meisten Fällen sollte die Standardeinstellung &apos;Spiel&apos; ausreichen.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Installation fehlgeschlagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Der Titel-Typ, den du für diese NCA ausgewählt hast, ist ungültig.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Datei nicht gefunden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Datei &quot;%1&quot; nicht gefunden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Fortsetzen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Fehlender yuzu-Account</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Um einen Kompatibilitätsbericht abzuschicken, musst du einen yuzu-Account mit yuzu verbinden.&lt;br&gt;&lt;br/&gt;Um einen yuzu-Account zu verbinden, prüfe die Einstellungen unter Emulation &amp;gt; Konfiguration &amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Fehler beim Öffnen der URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>URL &quot;%1&quot; kann nicht geöffnet werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>TAS Aufnahme</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Datei von Spieler 1 überschreiben?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo-Datei (%1);; Alle Dateien (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Amiibo laden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Fehler beim Öffnen der Amiibo Datei</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Die Amiibo Datei &quot;%1&quot; konnte nicht zum Lesen geöffnet werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Fehler beim Lesen der Amiibo-Daten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Amiibo-Daten können nicht vollständig gelesen werden. Es wurde erwartet, dass %1 Bytes gelesen werden, es konnten aber nur %2 Bytes gelesen werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Fehler beim Laden der Amiibo-Daten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Amiibo-Daten konnten nicht geladen werden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Screenshot aufnehmen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG Bild (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>TAS Zustand: Läuft %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>TAS Zustand: Aufnahme %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>TAS Zustand: Ungültig</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Geschwindigkeit: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Geschwindigkeit: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>Spiel: %1 FPS (Unbegrenzt)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Spiel: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Frame: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU HOCH</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTREM</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU FEHLER</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Das Spiel, dass du versuchst zu spielen, benötigt bestimmte Dateien von deiner Switch-Konsole.&lt;br/&gt;&lt;br/&gt;Um Informationen darüber zu erhalten, wie du diese Dateien von deiner Switch extrahieren kannst, prüfe bitte die folgenden Wiki-Seiten: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;System-Archive und Shared Fonts von einer Switch-Konsole extrahieren&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Willst du zur Spiele-Liste zurückkehren und die Emulation beenden? Das Fortsetzen der Emulation könnte zu Spielfehlern, Abstürzen, beschädigten Speicherdaten und anderen Fehlern führen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu konnte ein Switch Systemarchiv nicht finden. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu konnte ein Switch Systemarchiv nicht finden: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Systemarchiv nicht gefunden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Systemarchiv fehlt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu konnte die Switch Shared Fonts nicht finden. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Shared Fonts nicht gefunden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Shared Font fehlt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Schwerwiegender Fehler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Ein schwerwiegender Fehler ist aufgetreten, bitte prüfe die Log-Dateien auf mögliche Fehlermeldungen. Weitere Informationen: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Wie kann ich eine Log-Datei hochladen&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Willst du zur Spiele-Liste zurückkehren und die Emulation beenden? Das Fortsetzen der Emulation könnte zu Spielfehlern, Abstürzen, beschädigten Speicherdaten und anderen Fehlern führen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Fataler Fehler aufgetreten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Schlüsselableitung bestätigen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4440,37 +4574,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
Dieser Prozess wird die generierten Schlüsseldateien löschen und die Schlüsselableitung neu starten.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Fuses fehlen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - BOOT0 fehlt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - BCPKG2-1-Normal-Main fehlt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - PRODINFO fehlt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Derivationskomponenten fehlen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Einige Komponenten, die yuzu benötigt, um Schlüssel zu generieren, wurden nicht gefunden. &lt;br&gt;Bitte folge &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;dem yuzu Schnellstart-Guide&lt;/a&gt; um alle deine Schlüssel und Spiele zu übertragen.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4478,39 +4612,39 @@ on your system&apos;s performance.</source>
Dies könnte, je nach Leistung deines Systems, bis zu einer Minute dauern.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Schlüsselableitung</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>RomFS wählen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Wähle, welches RomFS du speichern möchtest.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Bist du sicher, dass du yuzu beenden willst?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Bist du sicher, dass du die Emulation stoppen willst? Jeder nicht gespeicherte Fortschritt geht verloren.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4522,38 +4656,38 @@ Möchtest du dies umgehen und sie trotzdem beenden?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL nicht verfügbar!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu wurde nicht mit OpenGL-Unterstützung kompiliert.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Fehler beim Initialisieren von OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Deine Grafikkarte unterstützt kein OpenGL oder du hast nicht den neusten Treiber installiert.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Fehler beim Initialisieren von OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Deine Grafikkarte unterstützt OpenGL 4.6 nicht, oder du benutzt nicht die neuste Treiberversion.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Deine Grafikkarte unterstützt anscheinend nicht eine oder mehrere von yuzu benötigten OpenGL-Erweiterungen. Bitte stelle sicher, dass du den neusten Grafiktreiber installiert hast.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Nicht unterstützte Erweiterungen:&lt;br&gt;%2</translation>
</message>
@@ -4911,190 +5045,205 @@ Screen.</source>
<translation>&amp;Emulation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Anzeige</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Fenstergöße zurücksetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Debugging</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Fenstergröße auf &amp;720p zurücksetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Fenstergröße auf 720p zurücksetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Fenstergröße auf &amp;1080p zurücksetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Fenstergröße auf 1080p zurücksetzen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Debugging</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Werkzeuge</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Hilfe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Dateien im NAND installieren...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>Datei &amp;laden...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>&amp;Verzeichnis laden...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>S&amp;chließen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Schlüssel neu initialisieren...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;Über yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>&amp;Einzelfenster-Modus</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>Kon&amp;figurieren</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>D&amp;ock-Widget-Header anzeigen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>&amp;Filterleiste anzeigen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>&amp;Statusleiste anzeigen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Statusleiste anzeigen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>Vollbild (&amp;u)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>Neusta&amp;rt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>&amp;Amiibo laden...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Kompatibilität melden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>&amp;Mods-Seite öffnen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>&amp;Schnellstart-Anleitung öffnen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;FAQ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>&amp;yuzu-Verzeichnis öffnen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Bildschirmfoto aufnehmen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>TAS &amp;konfigurieren...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>&amp;Spiel-Einstellungen ändern...</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5140,10 +5289,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>START/PAUSE</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5174,142 +5328,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Strg</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[nicht gesetzt]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hat %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Achse %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Taste %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[unbekannt]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Klick 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Klick 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Klick 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Klick 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Klick 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Achse %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC Knopf %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>TAS Achse %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>TAS Knopf %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Bewegung %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1Knopf %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL-Bewegung</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Klick %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[unbenutzt]</translation>
</message>
@@ -5350,7 +5584,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro-Controller</translation>
</message>
@@ -5363,7 +5597,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Zwei Joycons</translation>
</message>
@@ -5376,7 +5610,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Linker Joycon</translation>
</message>
@@ -5389,7 +5623,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Rechter Joycon</translation>
</message>
@@ -5417,7 +5651,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Handheld</translation>
</message>
@@ -5538,7 +5772,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>GameCube-Controller</translation>
</message>
@@ -5632,13 +5866,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
diff --git a/dist/languages/es.ts b/dist/languages/es.ts
index 2732a5923..a7583ba9f 100644
--- a/dist/languages/es.ts
+++ b/dist/languages/es.ts
@@ -36,17 +36,17 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;yuzu es un emulador experimental de código abierto de Nintendo Switch licenciado bajo GPLv2.0.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;Este software no debe ser utilizado para jugar juegos que no hayas obtenido legalmente.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;Este software no debe utilizarse para jugar juegos que no se hayan obtenido legalmente.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/aboutdialog.ui" line="118"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://yuzu-emu.org/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Website&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Source Code&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Contributors&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/blob/master/license.txt&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;License&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://yuzu-emu.org/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Sitio web&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Código fuente&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Contribuidor&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/blob/master/license.txt&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Licencia&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://yuzu-emu.org/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Sitio web&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Código fuente&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Contribuidores&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/blob/master/license.txt&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Licencia&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/aboutdialog.ui" line="134"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:7pt;&quot;&gt;&amp;quot;Nintendo Switch&amp;quot; is a trademark of Nintendo. yuzu is not affiliated with Nintendo in any way.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:7pt;&quot;&gt;&amp;quot;Nintendo Switch&amp;quot; es una marca registrada de Nintendo. yuzu no esta afiliado con Nintendo de ninguna manera.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:7pt;&quot;&gt;&amp;quot;Nintendo Switch&amp;quot; es una marca registrada de Nintendo. yuzu no esta afiliado con Nintendo de ninguna forma.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
@@ -74,7 +74,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="54"/>
<source>Configuration completed!</source>
- <translation>¡Configuración completa!</translation>
+ <translation>¡Configuración completada!</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="61"/>
@@ -98,7 +98,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="36"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Should you choose to submit a test case to the &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;yuzu Compatibility List&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, The following information will be collected and displayed on the site:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Hardware Information (CPU / GPU / Operating System)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Which version of yuzu you are running&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The connected yuzu account&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;SI decides presentar una prueba a la &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Lista de Compatibilidad de yuzu&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, La siguiente información será obtenida y mostrada en el sitio web:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Informacion de Hardware (CPU / GPU / Sistema Operativo)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Qué versión de yuzu estas utilizando&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;La cuenta de yuzu conectada&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Si deseas presentar una prueba a la &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Lista de Compatibilidad de yuzu&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, La siguiente información será obtenida y mostrada en el sitio web:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Informacion de Hardware (CPU / GPU / Sistema operativo)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Versión de yuzu que estés utilizando&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;La cuenta de yuzu conectada&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="72"/>
@@ -118,7 +118,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="96"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona con fallos gráficos o de audio menores y es jugable desde el principio hasta el final. Puede requerir de soluciones temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona con fallos gráficos o de audio menores y es jugable de principio a fin. Puede que sea necesario recurrir a arreglos temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="106"/>
@@ -128,7 +128,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="113"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions with major graphical or audio glitches, but game is playable from start to finish with workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona con importantes fallos gráficos o de audio, pero es jugable desde el principio hasta el final con soluciones temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona con fallos gráficos o de audio sustanciales, pero es jugable de principio a fin con arreglos temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="123"/>
@@ -138,17 +138,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="130"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona, pero tiene errores gráficos o de audio. Imposible progresar en ciertas áreas debido a errores incluso con soluciones temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;El juego funciona, pero tiene errores gráficos o de audio. Imposible progresar en ciertas zonas debido a fallos incluso con arreglos temporales.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="140"/>
<source>Intro/Menu</source>
- <translation>Intro/Menú</translation>
+ <translation>Intro/Menu</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="147"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;No es posible jugar a este juego debido a importantes errores gráficos o de audio. Es imposible avanzar mas allá de la pantalla de inicio.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;No es posible jugar a este juego debido a errores gráficos o de audio importantes. Es imposible avanzar mas allá de la pantalla de inicio.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="157"/>
@@ -163,7 +163,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="182"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Independent of speed or performance, how well does this game play from start to finish on this version of yuzu?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Independientemente de la velocidad o del rendimiento, ¿cómo definiría su experiencia con el juego de principio a fin en esta versión de yuzu?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Independientemente de la velocidad o del rendimiento, ¿cómo definiría su experiencia de juego de principio a fin en esta versión de yuzu?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="206"/>
@@ -183,7 +183,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.cpp" line="73"/>
<source>An error occurred while sending the Testcase</source>
- <translation>Un error a ocurrido mientras se enviaba el caso de prueba.</translation>
+ <translation>Ha ocurrido un fallo mientras se enviaba el caso de prueba.</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.cpp" line="75"/>
@@ -202,17 +202,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_audio.ui" line="28"/>
<source>Output Engine:</source>
- <translation>Motor de Salida:</translation>
+ <translation>Motor de salida:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_audio.ui" line="42"/>
<source>Audio Device:</source>
- <translation>Dispositivo de Audio:</translation>
+ <translation>Dispositivo de audio:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_audio.ui" line="70"/>
<source>Use global volume</source>
- <translation>Usar el volumen global</translation>
+ <translation>Usar volumen global</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_audio.ui" line="75"/>
@@ -276,12 +276,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="63"/>
<source>We recommend setting accuracy to &quot;Auto&quot;.</source>
- <translation>Recomendamos ajustar la precisión a &quot;Auto&quot;.</translation>
+ <translation>Recomendamos establecer la precisión en &quot;Auto&quot;.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="80"/>
<source>Unsafe CPU Optimization Settings</source>
- <translation>Ajustes del Modo Impreciso de Optimización de la CPU</translation>
+ <translation>Ajustes del Modo Impreciso de optimización de la CPU</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="86"/>
@@ -294,13 +294,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta opción mejora el rendimiento al reducir la precisión de las instrucciones fused-multiply-add en las CPU sin soporte nativo de FMA.&lt;/div&gt;
+ &lt;div&gt;Esta opción mejora el rendimiento al reducir la precisión de las instrucciones fused-multiply-add en las CPU sin soporte nativo FMA.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="101"/>
<source>Unfuse FMA (improve performance on CPUs without FMA)</source>
- <translation>Unfuse FMA (mejora el rendimiento en las CPU sin FMA)</translation>
+ <translation>Desactivar FMA (mejora el rendimiento en las CPU sin FMA)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="108"/>
@@ -314,7 +314,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="113"/>
<source>Faster FRSQRTE and FRECPE</source>
- <translation>FRSQRTE y FRECPE más rápido</translation>
+ <translation>FRSQRTE y FRECPE rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="120"/>
@@ -322,7 +322,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta opción mejora la velocidad de las funciones de punto flotante ASIMD de 32 bits al ejecutarlas con modos aproximados e incorrectos.&lt;/div&gt;
+ &lt;div&gt;Esta opción mejora la velocidad de las funciones de punto flotante ASIMD de 32 bits al ejecutarlas con métodos aproximados e incorrectos.&lt;/div&gt;
</translation>
</message>
<message>
@@ -336,13 +336,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta opción mejora la velocidad eliminando el revisor NaN. Tenga en cuenta que esto también reduce la precisión de algunas instrucciones de coma flotante&lt;/div&gt;
+ &lt;div&gt;Esta opción mejora la velocidad eliminando las comprobaciones NaN. Ten en cuenta que esto también reduce la precisión de algunas instrucciones de punto flotante.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="137"/>
<source>Inaccurate NaN handling</source>
- <translation>Manejo inexacto de NaN</translation>
+ <translation>Gestión imprecisa NaN</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="144"/>
@@ -350,18 +350,18 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta opción mejora la velocidad al eliminar un control de seguridad antes de cada lectura/escritura de memoria en el invitado. Desactivarlo podría permitir que los juegos que lean/escriban en la memoria del emulador.&lt;/div&gt;
+ &lt;div&gt;Esta opción mejora la velocidad al eliminar un control de seguridad antes de cada lectura/escritura de memoria del anfitrión. Desactivarlo podría permitir que los juegos lean/escriban en la memoria del emulador.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="149"/>
<source>Disable address space checks</source>
- <translation>Desactivar controles del espacio de direcciones</translation>
+ <translation>Desactivar comprobación del espacio de destino</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="174"/>
<source>CPU settings are available only when game is not running.</source>
- <translation>Los ajustes de la CPU sólo se encuentran disponibles cuando no se está ejecutando ningún juego.</translation>
+ <translation>Los ajustes de la CPU sólo están disponibles cuando no se esté ejecutando ningún juego.</translation>
</message>
</context>
<context>
@@ -384,7 +384,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Sólo para depurar.&lt;/span&gt;&lt;br/&gt;Si no tienes la certeza de lo que hacen, déjalas activadas. &lt;br/&gt;Esas opciones, cuando están desactivadas, sólo funcionarán cuando Depuración de CPU está activada. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Sólo para depurar.&lt;/span&gt;&lt;br/&gt;Si no estás seguro de su función, déjalas activadas. &lt;br/&gt;Estas opciones, cuando estén desactivadas, sólo funcionarán cuando la Depuración de CPU esté activada. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
@@ -394,15 +394,15 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.&lt;/div&gt;
</source>
<translation>
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Esta optimización acelera los accesos a la memoria del programa del invitado.&lt;/div&gt;
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Activando las inlines accede a PageTable::pointers en código emitido.&lt;/div&gt;
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Desactivando esto obliga a que todos los accesos a la memoria pasen por las funciones Memory::Read/Memory::Write.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Esta optimización acelera los accesos a la memoria del programa anfitrión.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Al activarlo, integra los accesos a PageTable::pointers en el código emitido.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Al desactivar esto, obliga a que todos los accesos a la memoria pasen por las funciones Memory::Read/Memory::Write.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="48"/>
<source>Enable inline page tables</source>
- <translation>Activar las tablas de páginas inline.</translation>
+ <translation>Activar las tablas de páginas integradas.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="55"/>
@@ -410,13 +410,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta optimización evita las búsquedas del despachador permitiendo que los bloques básicos emitidos salten directamente a otros bloques básicos si el PC de destino es estático.&lt;/div&gt;
+ &lt;div&gt;Esta optimización evita las búsquedas del emisor permitiendo que los bloques básicos emitidos salten directamente a otros bloques básicos si el PC de destino es estático.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="60"/>
<source>Enable block linking</source>
- <translation>Activar el enlace de bloques</translation>
+ <translation>Activar enlace de bloques</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="67"/>
@@ -424,13 +424,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This optimization avoids dispatcher lookups by keeping track potential return addresses of BL instructions. This approximates what happens with a return stack buffer on a real CPU.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esta optimización evita las búsquedas de los despachadores al rastrear las direcciones potenciales de retorno de las instrucciones de BL. Esto se aproxima a lo que sucede con un buffer de la pila de retorno en una CPU real.&lt;/div&gt;
+ &lt;div&gt;Esta optimización evita las búsquedas del emisor al rastrear las direcciones potenciales de retorno de las instrucciones BL. Esto se aproxima a lo que sucede con un buffer acumulado de retorno en una CPU real.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="72"/>
<source>Enable return stack buffer</source>
- <translation>Activar el buffer de la pila de retorno</translation>
+ <translation>Activar buffer acumulado de retorno</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="79"/>
@@ -438,13 +438,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;Enable a two-tiered dispatch system. A faster dispatcher written in assembly has a small MRU cache of jump destinations is used first. If that fails, dispatch falls back to the slower C++ dispatcher.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Habilitar un sistema de despacho de dos niveles. Un despachador más rápido escrito en ensamblado tiene un pequeño caché MRU de destinos de salto se utiliza primero. Si eso falla, el despacho vuelve al despacho más lento de C++.&lt;/div&gt;
+ &lt;div&gt;Habilitar un sistema de emisión de dos niveles. Un emisor más rápido escrito en ensamblado que tiene un pequeño caché MRU de destinos de salto se utiliza primero. Si esto falla, el emisor vuelve al emisor más lento de C++.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="84"/>
<source>Enable fast dispatcher</source>
- <translation>Activar el despachador rápido</translation>
+ <translation>Activar emisor rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="91"/>
@@ -452,13 +452,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esto habilita una optimización de IR que reduce los accesos innecesarios a la estructura del contexto de la CPU.&lt;/div&gt;
+ &lt;div&gt;Activa una optimización de IR que reduce los accesos innecesarios a la estructura del contexto de la CPU.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="96"/>
<source>Enable context elimination</source>
- <translation>Activar la eliminación del contexto</translation>
+ <translation>Activar eliminación de contexto</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="103"/>
@@ -466,13 +466,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;Enables IR optimizations that involve constant propagation.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esto habilita optimizaciones de IR que implican una propagación constante.&lt;/div&gt;
+ &lt;div&gt;Activa optimizaciones de IR que implican una propagación constante.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="108"/>
<source>Enable constant propagation</source>
- <translation>Activar la propagación constante</translation>
+ <translation>Activar propagación constante</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="115"/>
@@ -480,7 +480,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;Enables miscellaneous IR optimizations.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Esto habilita optimizaciónes misceláneas IR.&lt;/div&gt;
+ &lt;div&gt;Activa optimizaciones misceláneas IR.&lt;/div&gt;
</translation>
</message>
<message>
@@ -495,14 +495,14 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;When disabled, a misalignment is triggered on all misaligned accesses.&lt;/div&gt;
</source>
<translation>
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Cuando está activada, una desalineación sólo se activa cuando un acceso cruza el límite de una página.&lt;/div&gt;
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Cuando está desactivado, se desencadena una desalineación en todos los accesos desalineados.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Cuando esté activada, una desalineación sólo se activa cuando un acceso cruza el límite de una página.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Cuando esté desactivado, se produce una desalineación en todos los accesos desalineados.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="133"/>
<source>Enable misalignment check reduction</source>
- <translation>Activar la reducción del control de desalineación</translation>
+ <translation>Activar reducción del control de desalineación</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="140"/>
@@ -512,20 +512,20 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
</source>
<translation>
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Esta optimización acelera los accesos de memoria por el programa invitado.&lt;/div&gt;
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Activarlo causa que la lectura/escritura de la memoria invitada se haga directamente en memoria y usen el MMU del Host.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Esta optimización acelera los accesos de memoria por el programa anfitrión.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Activarlo causa que la lectura/escritura de la memoria del anfitrión se haga directamente en la memoria y utilicen el MMU del Host.&lt;/div&gt;
&lt;div style=&quot;white-space: nowrap&quot;&gt;Desactivar esto fuerza a todos los accesos de memoria a usar la Emulación del Software de MMU.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
<source>Enable Host MMU Emulation</source>
- <translation>Activar emulación de MMU del Host</translation>
+ <translation>Activar emulación MMU del Host</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="172"/>
<source>CPU settings are available only when game is not running.</source>
- <translation>Los ajustes de la CPU sólo se encuentran disponibles cuando no se está ejecutando ningún juego.</translation>
+ <translation>Los ajustes de la CPU sólo están disponibles cuando no se esté ejecutando ningún juego.</translation>
</message>
</context>
<context>
@@ -538,7 +538,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="17"/>
<source>Global Log Filter</source>
- <translation>Filtro de Registro Global</translation>
+ <translation>Filtro del registro global</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="29"/>
@@ -548,7 +548,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="36"/>
<source>Open Log Location</source>
- <translation>Abrir Ubicación del Registro</translation>
+ <translation>Abrir ubicación del archivo de registro</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="46"/>
@@ -568,7 +568,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="67"/>
<source>Arguments String</source>
- <translation>Cadena de Argumentos</translation>
+ <translation>Cadena de argumentos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="82"/>
@@ -578,17 +578,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="91"/>
<source>When checked, the graphics API enters a slower debugging mode</source>
- <translation>Cuando se marque, la API gráfica entrará en un modo de depuración más lento.</translation>
+ <translation>Cuando esté marcado, la API gráfica entrará en un modo de depuración más lento.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="94"/>
<source>Enable Graphics Debugging</source>
- <translation>Activar la Depuración de Gráficos</translation>
+ <translation>Activar depuración de gráficos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="101"/>
<source>When checked, it enables Nsight Aftermath crash dumps</source>
- <translation>Cuando se marque, activará los volcados de bloqueos de Nsight Aftermath</translation>
+ <translation>Cuando esté marcado, activará los volcados de los fallos Nsight Aftermath</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="104"/>
@@ -598,27 +598,27 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="114"/>
<source>When checked, it disables the macro Just In Time compiler. Enabling this makes games run slower</source>
- <translation>Cuando está marcado, se desactiva el compilador de macro Just In Time. Activando esto hace que los juegos se ejecuten más lento</translation>
+ <translation>Cuando esté marcado, se desactiva el compilador de macro Just In Time. Activar esto hace que los juegos se ejecuten más lento.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="117"/>
<source>Disable Macro JIT</source>
- <translation>Desactivar Macro JIT</translation>
+ <translation>Desactivar macro JIT</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="124"/>
<source>When checked, yuzu will log statistics about the compiled pipeline cache</source>
- <translation>Cuando se marque, yuzu hará un registro de las estadísticas de la tubería de caché compilada</translation>
+ <translation>Cuando esté marcado, yuzu hará un registro de las estadísticas del caché de tubería compilado </translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="127"/>
<source>Enable Shader Feedback</source>
- <translation>Activar feedback de cache</translation>
+ <translation>Activar información de shaders</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="134"/>
<source>When checked, it executes shaders without loop logic changes</source>
- <translation>Cuando se marque, se ejecutarán los shaders sin cambios de bucles lógicos.</translation>
+ <translation>Cuando esté marcado, se ejecutarán los shaders sin cambios de bucles lógicos.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="137"/>
@@ -633,12 +633,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="153"/>
<source>Enable FS Access Log</source>
- <translation>Activar Registro de FS Access</translation>
+ <translation>Activar registro de acceso FS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="160"/>
<source>Enable Verbose Reporting Services**</source>
- <translation>Habilitar Servicios de Reporte Detallados**</translation>
+ <translation>Activar servicios de reporte detallados**</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="170"/>
@@ -648,17 +648,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="176"/>
<source>Kiosk (Quest) Mode</source>
- <translation>Modo Quiosco (Quest)</translation>
+ <translation>Modo quiosco (Quest)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="183"/>
<source>Enable CPU Debugging</source>
- <translation>Activar la Depuración de CPU</translation>
+ <translation>Activar depuración de la CPU</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="190"/>
<source>Enable Debug Asserts</source>
- <translation>Habilitar declaraciones de depuración</translation>
+ <translation>Activar alertas de depuración</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="197"/>
@@ -666,9 +666,14 @@ p, li { white-space: pre-wrap; }
<translation>Activar Auto-Stub**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
- <translation>**Se reiniciará automáticamente cuando yuzu se cierre.</translation>
+ <translation>**Esto se reiniciará automáticamente cuando yuzu se cierre.</translation>
</message>
</context>
<context>
@@ -676,7 +681,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="14"/>
<source>Configure Debug Controller</source>
- <translation>Configurar el Control de Depuración</translation>
+ <translation>Configurar el controlador de depuración</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="40"/>
@@ -686,7 +691,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="47"/>
<source>Defaults</source>
- <translation>Valores Predeterminados</translation>
+ <translation>Valores predeterminados</translation>
</message>
</context>
<context>
@@ -713,7 +718,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure.ui" line="20"/>
<source>yuzu Configuration</source>
- <translation>Configuración de yuzu.</translation>
+ <translation>Configuración de yuzu</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="59"/>
@@ -735,7 +740,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="62"/>
<source>Filesystem</source>
- <translation>Sistema de Archivos</translation>
+ <translation>Sistema de archivos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="63"/>
@@ -752,12 +757,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="65"/>
<source>GraphicsAdvanced</source>
- <translation>GráficosAvanzados</translation>
+ <translation>Gráficosavanzados</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="66"/>
<source>Hotkeys</source>
- <translation>Teclas de Acceso Rápido</translation>
+ <translation>Teclas de acceso rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="67"/>
@@ -784,7 +789,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="71"/>
<source>Game List</source>
- <translation>Lista de Juegos</translation>
+ <translation>Lista de juegos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="72"/>
@@ -802,12 +807,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="17"/>
<source>Filesystem</source>
- <translation>Sistema de Archivos</translation>
+ <translation>Sistema de archivos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="25"/>
<source>Storage Directories</source>
- <translation>Directorios de Almacenamiento</translation>
+ <translation>Directorios de almacenamiento</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="31"/>
@@ -831,7 +836,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="84"/>
<source>Gamecard</source>
- <translation>Cartucho de Juegos</translation>
+ <translation>Cartucho de juego</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="90"/>
@@ -846,42 +851,42 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="107"/>
<source>Current Game</source>
- <translation>Juego Actual</translation>
+ <translation>Juego actual</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="124"/>
<source>Patch Manager</source>
- <translation>Administrador de Parches</translation>
+ <translation>Administrador de parches</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="152"/>
<source>Dump Decompressed NSOs</source>
- <translation>Volcar NSOs Descomprimidos</translation>
+ <translation>Volcar NSOs descomprimidos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="159"/>
<source>Dump ExeFS</source>
- <translation>Volcar Partición ExeFS</translation>
+ <translation>Volcar ExeFS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="168"/>
<source>Mod Load Root</source>
- <translation>Carpeta raíz de carga de Mods</translation>
+ <translation>Carpeta raíz de carga de mods</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="175"/>
<source>Dump Root</source>
- <translation>Carpeta raíz de Volcado</translation>
+ <translation>Carpeta raíz de volcado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="201"/>
<source>Caching</source>
- <translation>Cargando Caché</translation>
+ <translation>Cargando caché</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="209"/>
<source>Cache Game List Metadata</source>
- <translation>Metadatos de Lista de Juegos en Caché</translation>
+ <translation>Metadatos de lista de juegos en caché</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="216"/>
@@ -889,32 +894,32 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="128"/>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="133"/>
<source>Reset Metadata Cache</source>
- <translation>Reiniciar Caché de Metadatos</translation>
+ <translation>Reiniciar caché de metadatos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="86"/>
<source>Select Emulated NAND Directory...</source>
- <translation>Seleccione el directorio de NAND Emulado...</translation>
+ <translation>Selecciona el directorio de NAND emulado...</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="89"/>
<source>Select Emulated SD Directory...</source>
- <translation>Seleccione el directorio de SD Emulado...</translation>
+ <translation>Seleccione el directorio de SD emulado...</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="92"/>
<source>Select Gamecard Path...</source>
- <translation>Seleccione la ruta del Cartucho...</translation>
+ <translation>Seleccione la ruta del cartucho...</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="95"/>
<source>Select Dump Directory...</source>
- <translation>Seleccione Directorio para Volcar...</translation>
+ <translation>Seleccione directorio de volcado...</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="98"/>
<source>Select Mod Load Directory...</source>
- <translation>Seleccione el directorio de carga de Mod...</translation>
+ <translation>Seleccione el directorio de carga de mod...</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="125"/>
@@ -946,69 +951,80 @@ p, li { white-space: pre-wrap; }
<translation>General</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Límite de cuadros por segundo</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation>Utilizar límite global de fotogramas</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation>Establece el límite de fotogramas:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
- <translation>Se necesita el uso de la tecla de acceso rápido Cambiar Límite de FPS para que tenga efecto.</translation>
+ <translation>Es necesario el uso de la tecla de acceso rápido Cambiar límite de FPS para que tenga efecto.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Límite de fotogramas</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
- <translation>Limitar el Porcentaje de Velocidad</translation>
+ <translation>Limitar porcentaje de velocidad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulación de CPU multinúcleo </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Confirmar salida mientras se ejecuta la emulación</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Mostrar usuario actual al abrir el juego</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausar emulación cuando la ventana esté en segundo plano</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
- <translation>Ocultar el cursor del ratón cuando no está activo.</translation>
+ <translation>Ocultar el cursor en caso de inactividad.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
- <translation>Reiniciar todos los Ajustes</translation>
+ <translation>Reiniciar todos los ajustes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
- <translation>Ésto reinicia todas las configuraciones y eliminará todas las configuraciones de cada juego. No eliminará ni los directorios de juego, ni perfiles, ni perfiles de control. ¿Continuar?</translation>
+ <translation>Esto reiniciará y eliminará todas las configuraciones de los juegos. No eliminará ni los directorios de juego, ni los perfiles, ni los perfiles de los mandos. ¿Continuar?</translation>
</message>
</context>
<context>
@@ -1031,7 +1047,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="64"/>
<source>Shader Backend:</source>
- <translation>Backend de Shaders:</translation>
+ <translation>Soporte de shaders:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="92"/>
@@ -1046,12 +1062,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="156"/>
<source>Graphics Settings</source>
- <translation>Ajustes de los Gráficos</translation>
+ <translation>Ajustes de gráficos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="162"/>
<source>Use disk pipeline cache</source>
- <translation>Usar caché de shaders en tubería</translation>
+ <translation>Usar caché de shaders de tubería</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="169"/>
@@ -1076,17 +1092,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="211"/>
<source>CPU Video Decoding</source>
- <translation>Decodificación de vídeo de CPU</translation>
+ <translation>Decodificación de vídeo en la CPU</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="216"/>
<source>GPU Video Decoding (Default)</source>
- <translation>Decodificación de vídeo de GPU (Por defecto)</translation>
+ <translation>Decodificación de vídeo en GPU (Por defecto)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="242"/>
<source>Fullscreen Mode:</source>
- <translation>Modo Pantalla Completa:</translation>
+ <translation>Modo pantalla completa:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="250"/>
@@ -1096,17 +1112,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="255"/>
<source>Exclusive Fullscreen</source>
- <translation>Pantalla completa exclusiva</translation>
+ <translation>Pantalla completa</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="281"/>
<source>Aspect Ratio:</source>
- <translation>Relación de Aspecto:</translation>
+ <translation>Relación de aspecto:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="289"/>
<source>Default (16:9)</source>
- <translation>Valor Predeterminado (16:9)</translation>
+ <translation>Valor predeterminado (16:9)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="294"/>
@@ -1121,28 +1137,123 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="304"/>
<source>Stretch to Window</source>
- <translation>Estirar a la Ventana</translation>
+ <translation>Ajustar a la ventana</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>Resolución:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>x0.5 (360p/540p) [EXPERIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>x0.75 (540p/810p) [EXPERIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>x1 (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>x2 (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>x3 (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>x4 (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>x5 (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>x6 (4320p/6480p)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation>Filtro adaptable de ventana:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation>Proveedor más cercano</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation>Bilineal</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation>Bicúbico</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>Gaussiano</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>ScaleForce</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation>AMD FidelityFX™️ Super Resolution [Sólo Vulkan]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>Método de Anti-Aliasing:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>Ninguno</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Usar el color de fondo global</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Establecer el color de fondo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
- <translation>Color de Fondo:</translation>
+ <translation>Color de fondo:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.cpp" line="34"/>
<source>GLASM (Assembly Shaders, NVIDIA Only)</source>
- <translation>GLASM (Assembly Shaders, Sólo NVIDIA)</translation>
+ <translation>GLASM (Assembly shaders, sólo NVIDIA)</translation>
</message>
</context>
<context>
@@ -1160,27 +1271,27 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="25"/>
<source>Advanced Graphics Settings</source>
- <translation>Ajustes de los Gráficos Avanzados</translation>
+ <translation>Ajustes avanzados de gráficos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="46"/>
<source>Accuracy Level:</source>
- <translation>Nivel de Precisión: </translation>
+ <translation>Nivel de precisión: </translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="75"/>
<source>VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don&apos;t notice a performance difference.</source>
- <translation>VSync evita que la pantalla se distorsione, pero algunas tarjetas gráficas tienen un rendimiento menor con VSync activado. Mantenlo activado si no notas una diferencia de rendimiento.</translation>
+ <translation>El VSync evita que la pantalla se distorsione, pero algunas tarjetas gráficas tienen un menor rendimiento con el VSync activado. Mantenlo activado si no notas diferencias en el rendimiento.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="78"/>
<source>Use VSync (OpenGL only)</source>
- <translation>Usar VSync (sólo en OpenGL)</translation>
+ <translation>Usar VSync (sólo OpenGL)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="85"/>
<source>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</source>
- <translation>Activa la compilación de shaders en modo asíncrono, cuál podría reducir el tartamudeo de los shaders. Esta función es experimental.</translation>
+ <translation>Activa la compilación de shaders en modo asíncrono, lo que puede reducir la sobrecarga de shaders. Esta función es experimental.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="88"/>
@@ -1195,37 +1306,42 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="98"/>
<source>Use Fast GPU Time (Hack)</source>
- <translation>Usar Tiempo Rápido en la GPU (Hack)</translation>
+ <translation>Usar tiempo rápido en la GPU (Hack)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="120"/>
<source>Anisotropic Filtering:</source>
- <translation>Filtrado Anisotrópico:</translation>
+ <translation>Filtrado anisotrópico:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Valor Predeterminado</translation>
+ <source>Automatic</source>
+ <translation>Automático</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (ROMPERÁ COSAS)</translation>
+ <source>Default</source>
+ <translation>Valor predeterminado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (ROMPERÁ COSAS)</translation>
+ <source>2x</source>
+ <translation>x2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (ROMPERÁ COSAS)</translation>
+ <source>4x</source>
+ <translation>x4</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (ROMPERÁ COSAS)</translation>
+ <source>8x</source>
+ <translation>x8</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>x16</translation>
</message>
</context>
<context>
@@ -1233,12 +1349,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="14"/>
<source>Hotkey Settings</source>
- <translation>Configuración de Teclas de Acceso Rápido</translation>
+ <translation>Configuración de teclas de acceso rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="17"/>
<source>Hotkeys</source>
- <translation>Teclas de Acceso Rápido</translation>
+ <translation>Teclas de acceso rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="25"/>
@@ -1248,12 +1364,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="45"/>
<source>Clear All</source>
- <translation>Limpiar Todo</translation>
+ <translation>Borrar todo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="52"/>
<source>Restore Defaults</source>
- <translation>Restaurar Valores Predeterminados</translation>
+ <translation>Restaurar valores predeterminados</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
@@ -1263,7 +1379,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
<source>Hotkey</source>
- <translation>Tecla de Acceso Rápido</translation>
+ <translation>Tecla de acceso rápido</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
@@ -1274,17 +1390,17 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="96"/>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="183"/>
<source>Conflicting Key Sequence</source>
- <translation>Secuencia de Teclas en Conflicto</translation>
+ <translation>Combinación de teclas en conflicto</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="97"/>
<source>The entered key sequence is already assigned to: %1</source>
- <translation>La secuencia de teclas introducida ya ha sido asignada a: %1</translation>
+ <translation>La combinación de teclas introducida ya ha sido asignada a: %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="171"/>
<source>Restore Default</source>
- <translation>Restaurar Valor Predeterminado</translation>
+ <translation>Restaurar valor predeterminado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="172"/>
@@ -1294,7 +1410,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="184"/>
<source>The default key sequence is already assigned to: %1</source>
- <translation>La secuencia de teclas predeterminada ya ha sido asignada a: %1</translation>
+ <translation>La combinación de teclas predeterminada ya ha sido asignada a: %1</translation>
</message>
</context>
<context>
@@ -1302,7 +1418,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="14"/>
<source>ConfigureInput</source>
- <translation>ConfigurarEntrada</translation>
+ <translation>Configurarentrada</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="39"/>
@@ -1361,12 +1477,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="138"/>
<source>Console Mode</source>
- <translation>Modo de la Consola</translation>
+ <translation>Modo de la consola</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="159"/>
<source>Docked</source>
- <translation>Acoplado</translation>
+ <translation>Sobremesa</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="169"/>
@@ -1392,7 +1508,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="296"/>
<source>Controllers</source>
- <translation>Controladores</translation>
+ <translation>Mandos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="324"/>
@@ -1442,7 +1558,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="494"/>
<source>Defaults</source>
- <translation>Valores Predeterminados</translation>
+ <translation>Predeterminados</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input.ui" line="537"/>
@@ -1455,12 +1571,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="14"/>
<source>Configure Input</source>
- <translation>Configurar Controles</translation>
+ <translation>Configurar controles</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="74"/>
<source>Joycon Colors</source>
- <translation>Colores de Joycon</translation>
+ <translation>Colores de los Joycon</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="125"/>
@@ -1477,7 +1593,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1955"/>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2241"/>
<source>L Body</source>
- <translation>Lado L</translation>
+ <translation>Parte L</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="219"/>
@@ -1501,7 +1617,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2086"/>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2372"/>
<source>R Body</source>
- <translation>Lado R</translation>
+ <translation>Parte R</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="350"/>
@@ -1552,8 +1668,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Otro</translation>
+ <source>Emulated Devices</source>
+ <translation>Dispositivos Emulados</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1562,501 +1678,526 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emular entrada analógica con teclado</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Activar barrido del ratón</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Sensibilidad del Mouse</translation>
+ <source>Mouse</source>
+ <translation>Ratón</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Pantalla táctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
<source>Advanced</source>
<translation>Avanzado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
- <source>Touchscreen</source>
- <translation>Pantalla Táctil</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Ratón</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Movimiento / Táctil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Depurar controlador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Controlador de Depuración</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Otros</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emular entradas analógicas con teclado</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
- <translation>Requiere un reinicio de yuzu</translation>
+ <translation>Requiere reiniciar yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
- <translation>Activar soporte de 8 jugadores de XInput (desactiva la web applet)</translation>
+ <translation>Activar soporte de 8 jugadores XInput (desactiva la web applet)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Configurar Controles</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Conectar el Controlador</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Activar desplazamiento del ratón</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Sensibilidad del ratón</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Doble Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon Izquierdo</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Movimiento / táctil</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon Derecho</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Configurar controles</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Portátil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Conectar controlador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
- <translation>Dispositivo de Entrada</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Cualquier</translation>
+ <translation>Dispositivo de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Teclado/Ratón</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Crear</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Borrar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
- <translation>Palanca Izquierda</translation>
+ <translation>Palanca izquierda</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Arriba</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Izquierda</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Derecha</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Abajo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Presionado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Rango</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
- <translation>Zona Muerta: 0%</translation>
+ <translation>Punto muerto: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
- <translation>Rango del Modificador: 0%</translation>
+ <translation>Rango del modificador: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>Cruceta</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Menos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Captura</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Más</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Inicio</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Movimiento 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Movimiento 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
- <translation>Botones Frontales</translation>
+ <translation>Botones frontales</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
- <translation>Palanca Derecha</translation>
+ <translation>Palanca derecha</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Borrar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[no definido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Alternar botón</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Invertir ejes</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Configurar umbral</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Seleccione un valor entre 0% y 100%.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
- <translation>Configurar Mando Analógico</translation>
+ <translation>Configuración de palanca analógico</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
- <translation>Después de pulsar OK, primero mueve tu joystick de manera horizontal, y luego verticalmente.
-Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego horizontalmente.</translation>
+ <translation>Después de pulsar OK, mueve primero el joystick de manera horizontal, y luego verticalmente.
+Para invertir los ejes, mueve primero el joystick de manera vertical, y luego horizontalmente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Invertir axis</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
- <translation>Zona Muerta: %1%</translation>
+ <translation>Punto muerto: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
- <translation>Rango del Modificador: %1%</translation>
+ <translation>Rango del modificador: %1%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Controlador Pro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Joycons duales</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon izquierdo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon derecho</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Portátil</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
- <translation>Controlador GameCube</translation>
+ <translation>Controlador de GameCube</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
- <translation>Empezar / Parar</translation>
+ <translation>Inicio / Pausa</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Palanca de control</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>¡Agita!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[esperando]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
- <translation>Nuevo Perfil</translation>
+ <translation>Nuevo perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
- <translation>Introduzca un nombre de perfil:</translation>
+ <translation>Introduce un nombre de perfil:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
- <translation>Crear Perfil de Entrada</translation>
+ <translation>Crear perfil de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
- <translation>El nombre de perfil dado no es valido!</translation>
+ <translation>¡El nombre de perfil introducido no es válido!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
- <translation>Fallo al crear el perfil de entrada &quot;%1&quot;</translation>
+ <translation>Error al crear el perfil de entrada &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
- <translation>Eliminar Perfil de Entrada</translation>
+ <translation>Eliminar perfil de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
- <translation>Fallo al eliminar el perfil de entrada &quot;%1&quot;</translation>
+ <translation>Error al eliminar el perfil de entrada &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
- <translation>Cargar Perfil de Entrada</translation>
+ <translation>Cargar perfil de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
- <translation>Fallo al cargar el perfil de entrada &quot;%1&quot;</translation>
+ <translation>Error al cargar el perfil de entrada &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
- <translation>Guardar Perfil de Entrada</translation>
+ <translation>Guardar perfil de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
- <translation>Fallo al guardar el perfil de entrada &quot;%1&quot;</translation>
+ <translation>Error al guardar el perfil de entrada &quot;%1&quot;</translation>
</message>
</context>
<context>
@@ -2064,7 +2205,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="14"/>
<source>Create Input Profile</source>
- <translation>Crear Perfil de Entrada</translation>
+ <translation>Crear perfil de entrada</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="40"/>
@@ -2074,237 +2215,163 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="47"/>
<source>Defaults</source>
- <translation>Valores Predeterminados</translation>
+ <translation>Predeterminados</translation>
</message>
</context>
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
- <translation>Configurar: Movimiento / Táctil</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Movimiento del Ratón</translation>
+ <translation>Configurar: movimiento / táctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilidad:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Táctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Calibración UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Usar el mapeo de botones:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configuración CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
- <translation>Puede utilizar cualquier fuente de entrada UDP compatible con Cemuhook para proporcionar una entrada de movimiento y de tacto.</translation>
+ <translation>Puedes utilizar cualquier fuente de entrada UDP compatible con Cemuhook para proporcionar una entrada de movimiento y táctil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Servidor:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Puerto:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
- <translation>Más Información</translation>
+ <translation>Más información</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Probar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
- <translation>Añadir Servidor</translation>
+ <translation>Añadir servidor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
- <translation>Eliminar Servidor</translation>
+ <translation>Eliminar servidor</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="91"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Learn More&lt;/span&gt;&lt;/a&gt;</source>
- <translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Más Información&lt;/span&gt;&lt;/a&gt;</translation>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Más información&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
- <translation>El numero del puerto tiene caracteres invalidos</translation>
+ <translation>El número del puerto tiene caracteres que no son válidos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
- <translation>El puerto tiene que estar en el rango de 0 y 65353</translation>
+ <translation>El puerto debe estar en un rango entre 0 y 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
- <translation>Dirección IP no valida</translation>
+ <translation>Dirección IP no válida</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Este servidor UDP ya existe</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
- <translation>Incapaz de añadir mas de 8 servidores</translation>
+ <translation>No es posible añadir más de 8 servidores</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Probando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configurando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
- <translation>Prueba Existosa</translation>
+ <translation>Prueba existosa</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
- <translation>Se recibió con éxito los datos del servidor.</translation>
+ <translation>Se han recibido con éxito los datos del servidor.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Prueba fallida</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
- <translation>No pudo recibir datos válidos del servidor.&lt;br&gt;Por favor, verifique que el servidor esté configurado correctamente y que la dirección y el puerto sean correctos.</translation>
+ <translation>No se han podido recibir datos válidos del servidor.&lt;br&gt;Por favor, verifica que el servidor esté configurado correctamente y que la dirección y el puerto sean correctos.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
- <translation>La prueba de UDP o la configuración de la calibración está en curso.&lt;br&gt;Por favor, espere a que termine el proceso.</translation>
- </message>
-</context>
-<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configurar el Ratón</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Botones del Ratón</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Adelante:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Atrás:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Izquierda:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Medio:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Derecha:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Borrar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Valores Predeterminados</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[no establecido]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Restaurar Valor Predeterminado</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[pulsa un botón]</translation>
+ <translation>La prueba de UDP o la configuración de la calibración está en curso.&lt;br&gt;Por favor, espera a que termine el proceso.</translation>
</message>
</context>
<context>
@@ -2355,12 +2422,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.ui" line="92"/>
<source>Title ID</source>
- <translation>ID del Título</translation>
+ <translation>ID del título</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.ui" line="129"/>
<source>Filename</source>
- <translation>Nombre del Archivo</translation>
+ <translation>Nombre del archivo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.ui" line="156"/>
@@ -2385,7 +2452,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="64"/>
<source>Add-Ons</source>
- <translation>Complementos</translation>
+ <translation>Extras / Add-Ons</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="65"/>
@@ -2410,7 +2477,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>Gráficos avanz.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2425,7 +2492,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configuration_shared.cpp" line="93"/>
<source>Use global configuration (%1)</source>
- <translation>Usar la configuración global (%1)</translation>
+ <translation>Usar configuración global (%1)</translation>
</message>
</context>
<context>
@@ -2438,12 +2505,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.ui" line="17"/>
<source>Add-Ons</source>
- <translation>Complementos</translation>
+ <translation>Extras / Add-Ons</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="48"/>
<source>Patch Name</source>
- <translation>Nombre del Parche</translation>
+ <translation>Nombre del parche</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="49"/>
@@ -2466,22 +2533,22 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="25"/>
<source>Profile Manager</source>
- <translation>Administrador de Perfiles</translation>
+ <translation>Administrador de perfiles</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="42"/>
<source>Current User</source>
- <translation>Usuario Actual</translation>
+ <translation>Usuario actual</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="80"/>
<source>Username</source>
- <translation>Nombre de Usuario</translation>
+ <translation>Nombre de usuario</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="110"/>
<source>Set Image</source>
- <translation>Seleccionar Imagen</translation>
+ <translation>Seleccionar imagen</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="130"/>
@@ -2501,7 +2568,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="162"/>
<source>Profile management is available only when game is not running.</source>
- <translation>El sistema de perfiles solo se encuentra disponible cuando no se está ejecutando ningún juego.</translation>
+ <translation>El sistema de perfiles sólo se encuentra disponible cuando no se esté ejecutando ningún juego.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="55"/>
@@ -2514,7 +2581,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="73"/>
<source>Enter Username</source>
- <translation>Introduzca el Nombre de Usuario</translation>
+ <translation>Introduzca el nombre</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="136"/>
@@ -2524,17 +2591,17 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="198"/>
<source>Enter a username for the new user:</source>
- <translation>Introduzca un nombre para el nuevo usuario:</translation>
+ <translation>Introduce un nombre para el nuevo usuario:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="218"/>
<source>Enter a new username:</source>
- <translation>Introduzca un nuevo nombre de usuario:</translation>
+ <translation>Introduce un nuevo nombre de usuario:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="243"/>
<source>Confirm Delete</source>
- <translation> Confirmar Eliminanación</translation>
+ <translation> Confirmar eliminación</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="244"/>
@@ -2544,7 +2611,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="271"/>
<source>Select User Image</source>
- <translation>Seleccione una Imagen de Usuario</translation>
+ <translation>Selecciona una imagen de usuario</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="272"/>
@@ -2559,17 +2626,17 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="282"/>
<source>Error occurred attempting to overwrite previous image at: %1.</source>
- <translation>Ocurrió un error al intentar sobrescribir la imagen anterior en: %1.</translation>
+ <translation>Ha ocurrido un error al intentar sobrescribir la imagen anterior en: %1.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="290"/>
<source>Error deleting file</source>
- <translation>Error eliminando archivo</translation>
+ <translation>Error al eliminar el archivo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="291"/>
<source>Unable to delete existing file: %1.</source>
- <translation>No se pudo eliminar el archivo existente: %1.</translation>
+ <translation>No se puede eliminar el archivo existente: %1.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="298"/>
@@ -2579,12 +2646,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="299"/>
<source>Unable to create directory %1 for storing user images.</source>
- <translation>No se puede crear el directorio % 1 para almacenar imágenes de usuario.</translation>
+ <translation>No se puede crear el directorio %1 para almacenar imágenes de usuario.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="304"/>
<source>Error copying user image</source>
- <translation>Error al copiar la imagen del usuario.</translation>
+ <translation>Error al copiar la imagen de usuario.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="305"/>
@@ -2594,12 +2661,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>Error al redimensionar la imagen de usuario</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>No se puede cambiar el tamaño de la imagen</translation>
</message>
</context>
<context>
@@ -2632,7 +2699,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="46"/>
<source>Default</source>
- <translation>Valor Predeterminado</translation>
+ <translation>Predeterminado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="51"/>
@@ -2727,7 +2794,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="141"/>
<source>Iran</source>
- <translation>Iran</translation>
+ <translation>Irán</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="146"/>
@@ -2853,7 +2920,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="266"/>
<source>Zulu</source>
- <translation>Zulu</translation>
+ <translation>Zulú</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="280"/>
@@ -2883,17 +2950,17 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="305"/>
<source>Taiwan</source>
- <translation>Taiwan</translation>
+ <translation>Taiwán</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="313"/>
<source>Time Zone:</source>
- <translation>Zona Horaria</translation>
+ <translation>Zona horaria:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="320"/>
<source>Note: this can be overridden when region setting is auto-select</source>
- <translation>Nota: esto puede ser ignorado cuando la opción de región está en &quot;autoseleccionar&quot;</translation>
+ <translation>Nota: esto puede ser reemplazado si la opción de región está en &quot;autoseleccionar&quot;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="324"/>
@@ -2913,7 +2980,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="339"/>
<source>German (Deutsch)</source>
- <translation>Alemán (Deutsch)</translation>
+ <translation>Alemán (deutsch)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="344"/>
@@ -2938,7 +3005,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="364"/>
<source>Dutch (Nederlands)</source>
- <translation>Holandés (Nederlands)</translation>
+ <translation>Holandés (nederlands)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="369"/>
@@ -2958,12 +3025,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="384"/>
<source>British English</source>
- <translation>Inglés Británico</translation>
+ <translation>Inglés británico</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="389"/>
<source>Canadian French</source>
- <translation>Francés Canadiense</translation>
+ <translation>Francés canadiense</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="394"/>
@@ -2973,22 +3040,22 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="399"/>
<source>Simplified Chinese</source>
- <translation>Chino Simplificado</translation>
+ <translation>Chino simplificado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="404"/>
<source>Traditional Chinese (正體中文)</source>
- <translation>Chino Tradicional (正體中文)</translation>
+ <translation>Chino tradicional (正體中文)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="409"/>
<source>Brazilian Portuguese (português do Brasil)</source>
- <translation>Portugués Brasileño (português do Brasil)</translation>
+ <translation>Portugués brasileño (português do Brasil)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="417"/>
<source>Custom RTC</source>
- <translation>RTC Personalizado</translation>
+ <translation>RTC personalizado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="424"/>
@@ -3008,7 +3075,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="444"/>
<source>Stereo</source>
- <translation>Estereo</translation>
+ <translation>Estéreo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="449"/>
@@ -3018,12 +3085,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="457"/>
<source>Console ID:</source>
- <translation>ID de la Consola:</translation>
+ <translation>ID de la consola:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="464"/>
<source>Sound output mode</source>
- <translation>Modo de salida del sonido:</translation>
+ <translation>Método de salida de sonido:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="478"/>
@@ -3038,12 +3105,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="540"/>
<source>System settings are available only when game is not running.</source>
- <translation>Los ajustes del sistema solo se encuentran disponibles cuando no se está ejecutando ningún juego.</translation>
+ <translation>Los ajustes del sistema sólo se encuentran disponibles cuando no se esté ejecutando ningún juego.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.cpp" line="166"/>
<source>This will replace your current virtual Switch with a new one. Your current virtual Switch will not be recoverable. This might have unexpected effects in games. This might fail, if you use an outdated config savegame. Continue?</source>
- <translation>Esto reemplazará tu Switch virtual con una nueva. Tu Switch virtual actual no será recuperable. Esto podría causar efectos inesperados en determinados juegos. Si usas un archivo de configuración obsoleto, esto podría fallar. ¿Continuar?</translation>
+ <translation>Esto reemplazará tu Switch virtual con una nueva. Tu Switch virtual actual no será recuperable. Esto podría causar efectos inesperados en determinados juegos. Si usas un archivo de guardado de configuración obsoleto, esto podría fallar. ¿Continuar?</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.cpp" line="170"/>
@@ -3053,7 +3120,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_system.cpp" line="178"/>
<source>Console ID: 0x%1</source>
- <translation>ID de Consola: 0x%1</translation>
+ <translation>ID de consola: 0x%1</translation>
</message>
</context>
<context>
@@ -3066,17 +3133,17 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lee la entrada de los controles de los scripts en el mismo formato que los scripts TAS-nx.&lt;br/&gt;Para una mejor explicación, consulta la&lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;página de ayuda&lt;/span&gt;&lt;/a&gt; en la web de yuzu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lee la entrada de los controles de los scripts en el mismo formato que los scripts TAS-nx.&lt;br/&gt;Para una mejor explicación, consulta la&lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;página de ayuda&lt;/span&gt;&lt;/a&gt; en la página web de yuzu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
<source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
- <translation>Para comprobar qué teclas de acceso rápido controlan la reproducción/grabación, por favor, comprueba la configuración de las Teclas de Acceso Rápido (Configuración -&gt; General -&gt; Teclas de Acceso Rápido)</translation>
+ <translation>Para comprobar qué teclas de acceso rápido controlan la reproducción/grabación, por favor, revisa la configuración de las Teclas de acceso rápido (Configuración -&gt; General -&gt; Teclas de acceso rápido)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
<source>WARNING: This is an experimental feature.&lt;br/&gt;It will not play back scripts frame perfectly with the current, imperfect syncing method.</source>
- <translation>AVISO: Ésto es una característica experimental.&lt;br/&gt;No va a reproducir scripts perfectamente con el métido actual e imperfecto de sincronización.</translation>
+ <translation>AVISO: Esto es una característica experimental.&lt;br/&gt;No se reproducirán los scripts perfectamente con el método actual e imperfecto de sincronización.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="51"/>
@@ -3086,35 +3153,30 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="57"/>
<source>Enable TAS features</source>
- <translation>Activar características de TAS</translation>
+ <translation>Activar características TAS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Cambio automático de perfil de controlador</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>Repetir script en bucle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
- <translation>Pausar ejecución durante cargas</translation>
+ <translation>Pausar ejecución durante las cargas</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Directorio de scripts</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Ruta</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3124,12 +3186,12 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_tas.cpp" line="20"/>
<source>TAS Configuration</source>
- <translation>Configuración de TAS</translation>
+ <translation>Configuración TAS</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
- <translation>Seleccione el directorio de carga de TAS...</translation>
+ <translation>Selecciona el directorio de carga TAS...</translation>
</message>
</context>
<context>
@@ -3137,7 +3199,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="14"/>
<source>Configure Touchscreen Mappings</source>
- <translation>Configurar las Asignaciones de la Pantalla Táctil</translation>
+ <translation>Configurar las asignaciones de la pantalla táctil</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="22"/>
@@ -3147,7 +3209,7 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="48"/>
<source>New</source>
- <translation>Crear</translation>
+ <translation>Nuevo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="61"/>
@@ -3163,13 +3225,13 @@ Para invertir los ejes, primero mueve tu joystick de manera vertical, y luego ho
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="92"/>
<source>Click the bottom area to add a point, then press a button to bind.
Drag points to change position, or double-click table cells to edit values.</source>
- <translation>Haz clic en el área inferior para añadir un punto, y luego presiona un botón para unir.
-Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas de la tabla para editar los valores.</translation>
+ <translation>Haz clic en el área inferior para añadir un punto, y luego presiona un botón para vincularlo.
+Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de la tabla para editar los valores.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="116"/>
<source>Delete Point</source>
- <translation>Borrar Punto</translation>
+ <translation>Borrar punto</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="80"/>
@@ -3189,37 +3251,37 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
- <translation>Crear Perfíl</translation>
+ <translation>Crear perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
- <translation>Introduzca un nombre para el nuevo perfíl:</translation>
+ <translation>Introduce un nombre para el nuevo perfil:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
- <translation>Borrar Perfíl</translation>
+ <translation>Borrar perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
- <translation>¿Borrar Perfíl %1?</translation>
+ <translation>¿Borrar el perfil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
- <translation>Renombrar Perfíl</translation>
+ <translation>Renombrar perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nuevo nombre:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[presionar tecla]</translation>
</message>
@@ -3234,27 +3296,27 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="26"/>
<source>Warning: The settings in this page affect the inner workings of yuzu&apos;s emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing.</source>
- <translation>Advertencia: Los ajustes en esta página afectarán al funcionamiento de la pantalla táctil emulada de yuzu. Cambiarlas podría resultar en un comportamiento inapropiado, como que la pantalla táctil deje de funcionar parcialmente. Se recomienda usar esta pestaña sólo si sabes lo que estás haciendo.</translation>
+ <translation>Advertencia: Los ajustes en esta página afectarán al funcionamiento interno de la pantalla táctil emulada de yuzu. Cambiarlos puede dar lugar a un comportamiento imprevisto, como que la pantalla táctil deje de funcionar o funcione parcialmente. Sólo debes utilizar esta página si sabes lo que estás haciendo.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="52"/>
<source>Touch Parameters</source>
- <translation>Parámetros Táctil</translation>
+ <translation>Parámetros táctil</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="71"/>
<source>Touch Diameter Y</source>
- <translation>Diámetro Táctil Y</translation>
+ <translation>Diámetro táctil Y</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="91"/>
<source>Touch Diameter X</source>
- <translation>Diámetro Táctil X</translation>
+ <translation>Diámetro táctil X</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="98"/>
<source>Rotational Angle</source>
- <translation>Ángulo Rotacional</translation>
+ <translation>Ángulo rotacional</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="132"/>
@@ -3309,22 +3371,22 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="36"/>
<source>Filename</source>
- <translation>Nombre del Archivo</translation>
+ <translation>Nombre del archivo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="37"/>
<source>Filetype</source>
- <translation>Tipo de Archivo</translation>
+ <translation>Tipo de archivo</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="38"/>
<source>Title ID</source>
- <translation>ID del Título</translation>
+ <translation>ID del título</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="39"/>
<source>Title Name</source>
- <translation>Nombre del Título</translation>
+ <translation>Nombre del título</translation>
</message>
</context>
<context>
@@ -3337,7 +3399,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="17"/>
<source>UI</source>
- <translation>IU</translation>
+ <translation>Interfaz</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="23"/>
@@ -3347,12 +3409,12 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="31"/>
<source>Note: Changing language will apply your configuration.</source>
- <translation>Nota: Cambiar el idioma guardará tu configuración actual.</translation>
+ <translation>Nota: cambiar el idioma afectará a tu configuración actual.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="43"/>
<source>Interface language:</source>
- <translation>Lenguage de la Interfaz:</translation>
+ <translation>Idioma de la interfaz:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="57"/>
@@ -3362,12 +3424,12 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="74"/>
<source>Game List</source>
- <translation>Lista de Juegos</translation>
+ <translation>Lista de juegos</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="82"/>
<source>Show Add-Ons Column</source>
- <translation>Mostrar Columna de Accesorios</translation>
+ <translation>Mostrar columna de extras/Add-Ons</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="91"/>
@@ -3382,27 +3444,27 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="119"/>
<source>Row 1 Text:</source>
- <translation>Texto de la Fila 1:</translation>
+ <translation>Texto de fila 1:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="133"/>
<source>Row 2 Text:</source>
- <translation>Texto de la Fila 2:</translation>
+ <translation>Texto de fila 2:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="150"/>
<source>Screenshots</source>
- <translation>Capturas de Pantalla</translation>
+ <translation>Capturas de pantalla</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="158"/>
<source>Ask Where To Save Screenshots (Windows Only)</source>
- <translation>Pregunte Dónde Guardar las Capturas de Pantalla (sólo para Windows)</translation>
+ <translation>Preguntar dónde guardar las capturas de pantalla (sólo en Windows)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="167"/>
<source>Screenshots Path: </source>
- <translation>Trayectoria de las Capturas de Pantalla:</translation>
+ <translation>Ruta de las capturas de pantalla:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="177"/>
@@ -3412,7 +3474,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="93"/>
<source>Select Screenshots Path...</source>
- <translation>Selecciona la Trayectoria de las Capturas de Pantalla:</translation>
+ <translation>Selecciona la ruta de las capturas de pantalla:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="173"/>
@@ -3430,7 +3492,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_vibration.ui" line="14"/>
<source>Configure Vibration</source>
- <translation>Configurar Vibración</translation>
+ <translation>Configurar vibración</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_vibration.ui" line="23"/>
@@ -3497,7 +3559,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_vibration.ui" line="502"/>
<source>Enable Accurate Vibration</source>
- <translation>Habilitar Vibración Precisa</translation>
+ <translation>Activar vibración precisa</translation>
</message>
</context>
<context>
@@ -3515,12 +3577,12 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="25"/>
<source>yuzu Web Service</source>
- <translation>Servicio Web de yuzu</translation>
+ <translation>Servicio web de yuzu</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="31"/>
<source>By providing your username and token, you agree to allow yuzu to collect additional usage data, which may include user identifying information.</source>
- <translation>Al proporcionar su nombre de usuario y token, das tu consentimiento a que yuzu recopile datos de uso adicionales, que pueden incluir información de identificación del usuario.</translation>
+ <translation>Al proporcionar el nombre de usuario y el token, aceptas que yuzu recopile datos de uso adicionales, que pueden incluir información de identificación del usuario.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="49"/>
@@ -3566,7 +3628,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="140"/>
<source>Telemetry ID:</source>
- <translation>ID de Telemetría:</translation>
+ <translation>ID de telemetría:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="156"/>
@@ -3581,7 +3643,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="176"/>
<source>Show Current Game in your Discord Status</source>
- <translation>Mostrar el juego actual en tu estado de Discord</translation>
+ <translation>Mostrar el juego actual en el estado de Discord</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="69"/>
@@ -3602,7 +3664,7 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="81"/>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="126"/>
<source>Telemetry ID: 0x%1</source>
- <translation>ID de Telemetría: 0x%1</translation>
+ <translation>ID de telemetría: 0x%1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="92"/>
@@ -3613,12 +3675,12 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="118"/>
<source>Token not verified</source>
- <translation>No se pudo verificar el token</translation>
+ <translation>Token no verificado</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="119"/>
<source>Token was not verified. The change to your token has not been saved.</source>
- <translation>El token pudo ser verificado. El cambio realizado a su token no se ha guardado.</translation>
+ <translation>El token no se puede verificar. Los cambios realizados en tu token no se ha guardado.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="145"/>
@@ -3628,124 +3690,129 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="167"/>
<source>Verification failed</source>
- <translation>Verificación fallida</translation>
+ <translation>Error de verificación</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.cpp" line="168"/>
<source>Verification failed. Check that you have entered your token correctly, and that your internet connection is working.</source>
- <translation>Verificación fallida. Compruebe que ha ingresado el token correctamente, y que esté funcionando su conexión a internet.</translation>
+ <translation>Error de verificación. Comprueba que has introducido el token correctamente, y que esté funcionando correctamente tu conexión a internet.</translation>
</message>
</context>
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Controlador J1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
- <translation>Controlador J1</translation>
+ <translation>&amp;Controlador J1</translation>
</message>
</context>
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
- <translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Se recogen datos anónimos&lt;/a&gt; para ayudar a mejorar yuzu. &lt;br/&gt;&lt;br/&gt;¿Quieres compartir tus datos de uso con nosotros?</translation>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Los datos de uso anónimos se recogen&lt;/a&gt; para ayudar a mejorar yuzu. &lt;br/&gt;&lt;br/&gt;¿Deseas compartir tus datos de uso con nosotros?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetría </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
- <translation>Cargando Web Applet...</translation>
+ <translation>Cargando Web applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
- <translation>Desactivar Web Applet</translation>
+ <translation>Desactivar Web applet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
- <translation>Desactivar la web applet causará que ésta no se muestre nunca más durante el resto de la sesión. Puede causar comportamientos indefinidos y sólo debe ser usado con Super Mario 3D All-Stars. ¿De verdad quieres desactivar la web applet?</translation>
+ <translation>Desactivar la web applet causará que ésta no se muestre más durante el resto de la sesión. Puede causar comportamientos imprevistos y sólo debe ser usado con Super Mario 3D All-Stars. ¿De verdad quieres desactivar la web applet?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>La cantidad de shaders que se están construyendo actualmente</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>El multiplicador de escala de resolución seleccionado actualmente.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>La velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se está ejecutando más rápido o más lento que en una Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
- <translation>Cuántos fotogramas por segundo está mostrando el juego actualmente. Esto variará de un juego a otro y de una escena a otra.</translation>
+ <translation>La cantidad de fotogramas por segundo que se está mostrando el juego actualmente. Esto variará de un juego a otro y de una escena a otra.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tiempo que lleva emular un fotograma de la Switch, sin tener en cuenta la limitación de fotogramas o sincronización vertical. Para una emulación óptima, este valor debería ser como máximo de 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
- <translation>Configuración invalida detectada</translation>
+ <translation>Configuración no válida detectada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
- <translation>El controlador del modo portátil no puede ser usado en modo dock. Se elegirá Pro controller en su lugar.</translation>
+ <translation>El controlador del modo portátil no puede ser usado en el modo sobremesa. Se seleccionará el controlador Pro en su lugar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
- <translation>ESTACIONADO</translation>
+ <translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
- <translation>&amp;Limpiar Archivos Recientes</translation>
+ <translation>&amp;Eliminar archivos recientes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>Grabación TAS</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Continuar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>¿Sobreescribir archivo del Jugador 1?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Pausar</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
<source>Warning Outdated Game Format</source>
- <translation>Advertencia Formato de Juego Obsoleto</translation>
+ <translation>Advertencia: formato del juego obsoleto</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1286"/>
<source>You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.&lt;br&gt;&lt;br&gt;For an explanation of the various Switch formats yuzu supports, &lt;a href=&apos;https://yuzu-emu.org/wiki/overview-of-switch-game-formats&apos;&gt;check out our wiki&lt;/a&gt;. This message will not be shown again.</source>
- <translation>Está utilizando el formato de directorio de ROM deconstruido para este juego, que es un formato desactualizado que ha sido reemplazado por otros, como NCA, NAX, XCI o NSP. Los directorios de ROM deconstruidos carecen de íconos, metadatos y soporte de actualización.&lt;br&gt;&lt;br&gt;Para obtener una explicación de los diversos formatos de Switch que soporta yuzu,&lt;a href=&apos;https://yuzu-emu.org/wiki/overview-of-switch-game-formats&apos;&gt;echa un vistazo a nuestra wiki&lt;/a&gt;. Este mensaje no se volverá a mostrar.</translation>
+ <translation>Está utilizando el formato de directorio de ROM deconstruido para este juego, que es un formato desactualizado que ha sido reemplazado por otros, como los NCA, NAX, XCI o NSP. Los directorios de ROM deconstruidos carecen de íconos, metadatos y soporte de actualizaciones.&lt;br&gt;&lt;br&gt;Para ver una explicación de los diversos formatos de Switch que soporta yuzu,&lt;a href=&apos;https://yuzu-emu.org/wiki/overview-of-switch-game-formats&apos;&gt;echa un vistazo a nuestra wiki&lt;/a&gt;. Este mensaje no se volverá a mostrar.</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1298"/>
@@ -3761,12 +3828,12 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<message>
<location filename="../../src/yuzu/main.cpp" line="1303"/>
<source>An error occurred initializing the video core.</source>
- <translation>Se produjo un error al inicializar el núcleo de video.</translation>
+ <translation>Se ha producido un error al inicializar el núcleo de video.</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1304"/>
<source>yuzu has encountered an error while running the video core, please see the log for more details.For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.Ensure that you have the latest graphics drivers for your GPU.</source>
- <translation>yuzu ha encontrado un error al ejecutar el núcleo de video, consulte el registro para obtener más detalles. Para obtener más información sobre cómo acceder al registro, consulte la siguiente página: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Cómo cargar el archivo de registro.&lt;/a&gt; Asegúrese de tener los últimos controladores de gráficos para su GPU.</translation>
+ <translation>yuzu ha encontrado un error al ejecutar el núcleo de video, consulta el registro para obtener más detalles. Para obtener más información sobre cómo acceder al archivo de registro, consulte la siguiente página: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Cómo cargar el archivo de registro.&lt;/a&gt; Asegúrate de tener los últimos controladores de gráficos para la GPU.</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1322"/>
@@ -3778,374 +3845,370 @@ Arrastre los puntos para cambiar de posición, o haga doble clic en las celdas d
<location filename="../../src/yuzu/main.cpp" line="1325"/>
<source>%1&lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to redump your files.&lt;br&gt;You can refer to the yuzu wiki&lt;/a&gt; or the yuzu Discord&lt;/a&gt; for help.</source>
<comment>%1 signifies an error string.</comment>
- <translation>%1&lt;br&gt;Por favor, sique &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guía de inicio rápido de yuzu&lt;/a&gt; para revolcar tus archivos.&lt;br&gt;Puedes consultar la wiki de yuzu&lt;/a&gt; o el Discord de yuzu&lt;/a&gt; para obtener ayuda.</translation>
+ <translation>%1&lt;br&gt;Por favor, sigue &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guía de inicio rápido de yuzu&lt;/a&gt; para revolcar los archivos.&lt;br&gt;Puedes consultar la wiki de yuzu&lt;/a&gt; o el Discord de yuzu&lt;/a&gt; para obtener ayuda.</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1336"/>
<source>An unknown error occurred. Please see the log for more details.</source>
- <translation>Error desconocido. Por favor, consulte el registro para ver más detalles.</translation>
+ <translation>Error desconocido. Por favor, consulte el archivo de registro para ver más detalles.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
- <translation>Datos de Juegos Guardados</translation>
+ <translation>Datos de guardado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
- <translation>Datos de Mods</translation>
+ <translation>Datos de mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Error al abrir la carpeta %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>¡La carpeta no existe!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
- <translation>Error al Abrir el Caché Transferible de Shaders</translation>
+ <translation>Error al abrir el caché transferible de shaders</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>No se pudo crear el directorio de la caché de los shaders para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Contenidos</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Actualización</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
- <translation>Eliminar el Título</translation>
+ <translation>Eliminar entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
- <translation>Eliminar el Juego Instalado %1?</translation>
+ <translation>¿Eliminar el juego instalado %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
- <translation>Se Eliminó con Éxito</translation>
+ <translation>Se ha eliminado con éxito</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
- <translation>Se eliminó con éxito el juego de base instalado.</translation>
+ <translation>Se ha eliminado con éxito el juego base instalado.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
- <translation>Error en la eliminación de %1</translation>
+ <translation>Error al eliminar %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>El juego base no está instalado en el NAND y no se puede eliminar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
- <translation>Se eliminó con éxito la actualización instalada.</translation>
+ <translation>Se ha eliminado con éxito la actualización instalada.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>No hay ninguna actualización instalada para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>No hay ningún DLC instalado para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
- <translation>Se eliminó con éxito %1 DLC instalado(s).</translation>
+ <translation>Se ha eliminado con éxito %1 DLC instalado(s).</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
- <translation>¿Desea eliminar el Caché Transferible de Shaders de OpenGL?</translation>
+ <translation>¿Deseas eliminar el caché transferible de shaders de OpenGL?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
- <translation>¿Desea eliminar el Caché Transferible de Shaders de Vulkan?</translation>
+ <translation>¿Deseas eliminar el caché transferible de shaders de Vulkan?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
- <translation>¿Desea eliminar todas las Cachés Transferibles de Shaders?</translation>
+ <translation>¿Deseas eliminar todo el caché transferible de shaders?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
- <translation>¿Desea Eliminar la Configuración Personalizada del Juego?</translation>
+ <translation>¿Deseas eliminar la configuración personalizada del juego?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
- <translation>Eliminar Archivo</translation>
+ <translation>Eliminar archivo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
- <translation>Error al Eliminar el Caché Transferible de Shaders</translation>
+ <translation>Error al eliminar la caché de shaders transferibles</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
- <translation>No existe un Caché de shaders para este título.</translation>
+ <translation>No existe caché de shaders para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
- <translation>El Caché Transferible de Shaders fue eliminado con éxito.</translation>
+ <translation>El caché de shaders transferibles se ha eliminado con éxito.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
- <translation>No se ha podido eliminar el caché de shaders transferibles.</translation>
+ <translation>No se ha podido eliminar la caché de shaders transferibles.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
- <translation>Error al Eliminar las Cachés Transferibles de Shaders</translation>
+ <translation>Error al eliminar las cachés de shaders transferibles</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
- <translation>Cachés transferibles de shaders eliminadas con éxito.</translation>
+ <translation>Cachés de shaders transferibles eliminadas con éxito.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
- <translation>No se ha podido eliminar el directorio de cachés transferibles de shaders.</translation>
+ <translation>No se ha podido eliminar el directorio de cachés de shaders transferibles.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
- <translation>Error al Eliminar la Configuración Personalizada del Juego</translation>
+ <translation>Error al eliminar la configuración personalizada del juego</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>No existe una configuración personalizada para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Se eliminó con éxito la configuración personalizada del juego.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>No se ha podido eliminar la configuración personalizada del juego.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
- <translation>¡La extracción de RomFS falló!</translation>
+ <translation>¡La extracción de RomFS ha fallado!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
- <translation>Se produjo un error al copiar los archivos RomFS o el usuario canceló la operación.</translation>
+ <translation>Se ha producido un error al copiar los archivos RomFS o el usuario ha cancelado la operación.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Completo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
- <translation>Base</translation>
+ <translation>Esquema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
- <translation>Elegir modo para volcar el RomFS</translation>
+ <translation>Elegir método de volcado de RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
- <translation>Seleccione la forma en que desea volcar el RomFS. &lt;br&gt;Copiará todos los archivos en el nuevo directorio &lt;br&gt; mientras que el esqueleto solo creará la estructura del directorio.</translation>
+ <translation>Seleccione la forma en que quieras volcar el RomFS. &lt;br&gt;Copiará todos los archivos en el nuevo directorio &lt;br&gt; mientras que el esqueleto solo creará la estructura del directorio.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
- <translation>No hay suficiente espacio en %1 para extraer el RomFS. Por favor, libere espacio o elige otro directorio de volcado en Emulación &gt; Configuración &gt; Sistema &gt; Sistema de archivos &gt; Raíz de volcado</translation>
+ <translation>No hay suficiente espacio en %1 para extraer el RomFS. Por favor, libera espacio o elige otro directorio de volcado en Emulación &gt; Configuración &gt; Sistema &gt; Sistema de archivos &gt; Raíz de volcado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extrayendo RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
- <translation>¡La extracción RomFS tuvo éxito!</translation>
+ <translation>¡La extracción RomFS ha tenido éxito!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>La operación se completó con éxito.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Error al intentar abrir %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
- <translation>Seleccionar Directorio</translation>
+ <translation>Seleccionar directorio</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Propiedades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
- <translation>No se pudieron cargar las propiedades del juego.</translation>
+ <translation>No se pueden cargar las propiedades del juego.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Ejecutable de Switch (%1);;Todos los archivos (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Cargar archivo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Abrir el directorio de la ROM extraída</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
- <translation>Directorio no válido seleccionado</translation>
+ <translation>Directorio seleccionado no válido</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>El directorio que ha seleccionado no contiene ningún archivo &apos;main&apos;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
- <translation>Archivo de Switch Instalable (*.nca *.nsp *.xci);;Archivo de Contenidos Nintendo (*.nca);;Paquete de Envío Nintendo (*.nsp);;Imagen de Cartucho NX (*.xci)</translation>
+ <translation>Archivo de Switch Instalable (*.nca *.nsp *.xci);;Archivo de contenidos de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
- <translation>Instalar Archivos</translation>
+ <translation>Instalar archivos</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>%n archivo(s) restantes</numerusform><numerusform>%n archivo(s) restantes</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instalando el archivo &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
- <translation>Instalar Resultados</translation>
+ <translation>Instalar resultados</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
- <translation>Para evitar posibles conflictos, no recomendamos instalar juegos base en la NAND. Por favor, usa sólo esta característica para instalar actualizaciones y DLC.</translation>
+ <translation>Para evitar posibles conflictos, no recomendamos a los usuarios que instalen juegos base en el NAND.
+Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n archivo(s) recién instalado/s
-</numerusform><numerusform>%n archivo(s) recién instalado/s
+</numerusform><numerusform>%n archivo(s) instalado/s recientemente
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n archivo(s) recién sobreescrito/s
-</numerusform><numerusform>%n archivo(s) recién sobreescrito/s
+</numerusform><numerusform>%n archivo(s) sobrescrito/s recientemente
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n archivo(s) no se instaló/instalaron
@@ -4153,295 +4216,367 @@ Please, only use this feature to install updates and DLC.</source>
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Aplicación del sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
- <translation>Archivo del Sistema</translation>
+ <translation>Archivo del sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Actualización de la aplicación del sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
- <translation>Paquete de Firmware (Tipo A)</translation>
+ <translation>Paquete de firmware (Tipo A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
- <translation>Paquete de Firmware (Tipo B)</translation>
+ <translation>Paquete de firmware (Tipo B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Juego</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
- <translation>Actualización del juego</translation>
+ <translation>Actualización de juego</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
- <translation>DLC del Juego</translation>
+ <translation>DLC del juego</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
- <translation>Titulo Delta</translation>
+ <translation>Titulo delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Seleccione el tipo de instalación NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
- <translation>Seleccione el tipo de título en el que desea instalar este NCA como:
-(En la mayoría de los casos, el &apos;Juego&apos; predeterminado está bien).</translation>
+ <translation>Seleccione el tipo de título en el que deseas instalar este NCA como:
+(En la mayoría de los casos, el &apos;Juego&apos; predeterminado está bien).</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Fallo en la instalación</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>El tipo de título que seleccionó para el NCA no es válido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Archivo no encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Archivo &quot;%1&quot; no encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Continuar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>Aceptar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Falta la cuenta de Yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
- <translation>Para enviar un caso de prueba de compatibilidad de juegos, debe vincular su cuenta de yuzu.&lt;br&gt;&lt;br/&gt; Para vincular su cuenta yuzu, vaya a Emulación &amp; gt; Configuración &amp; gt; Web.</translation>
+ <translation>Para enviar un caso de prueba de compatibilidad de juegos, debes vincular tu cuenta de yuzu.&lt;br&gt;&lt;br/&gt; Para vincular tu cuenta de yuzu, ve a Emulación &amp;gt; Configuración &amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Error al abrir la URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>No se puede abrir la URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>Grabación TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>¿Sobrescribir archivo del jugador 1?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
- <translation>Archivo Amiibo (%1);; Todos los archivos (*.*)</translation>
+ <translation>Archivo amiibo (%1);; Todos los archivos (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Cargar amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
- <translation>Error al abrir el archivo de datos de Amiibo</translation>
+ <translation>Error al abrir el archivo de datos amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
- <translation>No se puede abrir el archivo de Amiibo &quot;%1&quot; para leer.</translation>
+ <translation>No se puede abrir el archivo amiibo &quot;%1&quot; para leer.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
- <translation>Error al leer el archivo de datos de Amiibo</translation>
+ <translation>Error al leer el archivo de datos amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
- <translation>No se pueden leer completamente los datos de Amiibo. Se esperaban leer %1 bytes, pero solo se pudo leer %2 bytes.</translation>
+ <translation>No se puede leer completamente los datos Amiibo. Se esperaban leer %1 bytes, pero solo se puede leer %2 bytes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
- <translation>Error al cargar los datos de Amiibo</translation>
+ <translation>Error al cargar los datos Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
- <translation>No se pueden cargar los datos de Amiibo.</translation>
+ <translation>No se pueden cargar los datos Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
- <translation>Captura de Pantalla</translation>
+ <translation>Captura de pantalla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Imagen PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
- <translation>Estado TAS: Ejecutando %1/%2</translation>
+ <translation>Estado TAS: ejecutando %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
- <translation>Estado TAS: Grabando %1</translation>
+ <translation>Estado TAS: grabando %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
- <translation>Estado TAS: Idle %1/%2</translation>
+ <translation>Estado TAS: inactivo %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
- <translation>Estado TAS: Nulo</translation>
+ <translation>Estado TAS: nulo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation>&amp;Parar de ejecutar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Iniciar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation>Pausar g&amp;rabación</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation>G&amp;rabar</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
- <translation><numerusform>Creando: %n shader(s)</numerusform><numerusform>Creando: %n shader(s)</numerusform></translation>
+ <translation><numerusform>Creando: %n shader(s)</numerusform><numerusform>Construyendo: %n shader(s)</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>Escalado: %1x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Velocidad: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Velocidad: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
- <translation>Juego: %1 FPS (Desbloqueado)</translation>
+ <translation>Juego: %1 FPS (desbloqueado)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Juego: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Fotogramas: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU ALTA</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTREMA</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU ERROR</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation>PROVEEDOR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation>BILINEAL</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation>BICÚBICO</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>GAUSSIANO</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation>SCALEFORCE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation>FSR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>NO AA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
- <translation>El juego que estás intentando cargar requiere de archivos adicionales de su Switch antes de poder jugar. &lt;br/&gt;&lt;br/&gt;Para obtener más información sobre cómo obtener estos archivos, ve a la siguiente página de la wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Volcar archivos del sistema y las fuentes compartidas desde una Consola Switch. &lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;¿Quieres volver a la lista de juegos? Continuar con la emulación puede provocar fallos, datos de guardado dañados u otros errores.</translation>
+ <translation>El juego que estás intentando cargar requiere archivos adicionales de tu Switch antes de poder jugar. &lt;br/&gt;&lt;br/&gt;Para obtener más información sobre cómo obtener estos archivos, ve a la siguiente página de la wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Volcar archivos del sistema y las fuentes compartidas desde una Consola Switch. &lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;¿Quieres volver a la lista de juegos? Continuar con la emulación puede provocar fallos, datos de guardado corrompidos u otros errores.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu no pudo localizar el archivo de sistema de la Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu no pudo localizar un archivo de sistema de la Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
- <translation>Archivo del Sistema No Encontrado</translation>
+ <translation>Archivo del sistema no encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
- <translation>Falta Archivo del Sistema</translation>
+ <translation>Faltan archivos del sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
- <translation>yuzu no pudo encontrar las Fuentes Compartidas de la Switch. %1</translation>
+ <translation>yuzu no pudo encontrar las fuentes compartidas de la Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Fuentes compartidas no encontradas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
- <translation>Faltan las Fuentes Compartidas</translation>
+ <translation>Faltan fuentes compartidas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
- <translation>Error Fatal</translation>
+ <translation>Error fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
- <translation>yuzu ha encontrado un error fatal, consulte el registro para obtener más detalles. Para obtener más información sobre cómo acceder al registro, consulte la siguiente página: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;¿Cómo cargar el archivo de registro?&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt; La emulación continua puede provocar fallos, datos de guardado dañados u otros errores.</translation>
+ <translation>yuzu ha encontrado un error fatal, consulta el registro para obtener más detalles. Para obtener más información sobre cómo acceder al registro, consulta la siguiente página: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;¿Cómo cargar el archivo de registro?&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt; Continuar con la emulación puede provocar fallos, datos de guardado corruptos u otros errores.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
- <translation>Error Fatal Encontrado</translation>
+ <translation>Error fatal encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
- <translation>Confirma la Clave de Rederivación</translation>
+ <translation>Confirmar la clave de rederivación</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4449,46 +4584,46 @@ Please make sure this is what you want
and optionally make backups.
This will delete your autogenerated key files and re-run the key derivation module.</source>
- <translation>Estás a punto de forzar todas tus claves.
+ <translation>Estás a punto de forzar la rederivación de todas tus claves.
Si no sabes qué es esto,
es una acción potencialmente destructiva.
-Por favor, asegúrese de que esto
-es lo que desea hacer si es necesario.
+Por favor, asegúrate de que esto
+es lo que quieres hacer si es necesario.
- Esto eliminará los archivos de las claves generados automáticamente y volverá a ejecutar el módulo de derivación de claves.</translation>
+ Esto eliminará los archivos de las claves generadas automáticamente y volverá a ejecutar el módulo de derivación de claves.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
- <translation>Falta fuses</translation>
+ <translation>Faltan fuses</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- Falta BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Falta BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - Falta PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
- <translation>Faltan Componentes de Derivación</translation>
+ <translation>Faltan componentes de derivación</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Faltan componentes que pueden impedir que la derivación de la clave se complete. &lt;br&gt;Por favor siga &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guía de inicio rápido de yuzu&lt;/a&gt; para conseguir todas tus llaves y juegos.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>Faltan las claves de encriptación. &lt;br&gt;Por favor, sigue &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guía rápida de yuzu&lt;/a&gt; para obtener todas tus claves, firmware y juegos.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4497,84 +4632,84 @@ Esto puede llevar unos minutos dependiendo
del rendimiento de su sistema.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Obtención de claves</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Selecciona el destinatario para volcar el RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
- <translation>Por favor, seleccione los RomFS que desea volcar.</translation>
+ <translation>Por favor, seleccione los RomFS que deseas volcar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>¿Estás seguro de que quieres cerrar yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>¿Estás seguro de que quieres detener la emulación? Cualquier progreso no guardado se perderá.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
- <translation>La aplicación que se está ejecutando actualmente ha solicitado que yuzu no sea cerrado.
+ <translation>La aplicación que se está ejecutando actualmente ha solicitado que yuzu no se cierre.
-¿Desea cerrarlo de todas formas?</translation>
+¿Quieres salir de todas formas?</translation>
</message>
</context>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>¡OpenGL no está disponible!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu no ha sido compilado con soporte de OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>¡Error al inicializar OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
- <translation>Tu GPU no soporta OpenGL o no tienes instalados los últimos controladores gráficos.</translation>
+ <translation>Tu GPU no soporta OpenGL, o no tienes instalados los últimos controladores gráficos.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>¡Error al iniciar OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Tu GPU no soporta OpenGL 4.6, o no tienes instalado el último controlador de la tarjeta gráfica.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
- <translation>Es posible que su GPU no soporte una o más extensiones OpenGL requeridas. Por favor, asegúrese de tener el último controlador de la tarjeta gráfica.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Extensiones no soportadas:&lt;br&gt;%2</translation>
+ <translation>Es posible que la GPU no soporte una o más extensiones necesarias de OpenGL . Por favor, asegúrate de tener los últimos controladores de la tarjeta gráfica.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Extensiones no soportadas:&lt;br&gt;%2</translation>
</message>
</context>
<context>
@@ -4592,12 +4727,12 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="333"/>
<source>Add-ons</source>
- <translation>Complementos</translation>
+ <translation>Extras/Add-ons</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="335"/>
<source>File type</source>
- <translation>Tipo de Archivo</translation>
+ <translation>Tipo de archivo</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="336"/>
@@ -4612,12 +4747,12 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="510"/>
<source>Start Game</source>
- <translation>Empezar Juego</translation>
+ <translation>Iniciar juego</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="512"/>
<source>Start Game without Custom Configuration</source>
- <translation>Empezar Juego sin Configuración Personalizada</translation>
+ <translation>Iniciar juego sin la configuración personalizada</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="514"/>
@@ -4627,12 +4762,12 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="515"/>
<source>Open Mod Data Location</source>
- <translation>Abrir ubicación de Mods</translation>
+ <translation>Abrir ubicación de los mods</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="517"/>
<source>Open Transferable Pipeline Cache</source>
- <translation>Abrir Caché Transferible de Shaders de Tubería</translation>
+ <translation>Abrir caché transferible de shaders en tubería</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="519"/>
@@ -4642,7 +4777,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="520"/>
<source>Remove Installed Update</source>
- <translation>Eliminar la Actualización Instalada</translation>
+ <translation>Eliminar la actualización instalada</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="521"/>
@@ -4652,27 +4787,27 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="522"/>
<source>Remove Custom Configuration</source>
- <translation>Eliminar Configuración Personalizada</translation>
+ <translation>Eliminar la configuración personalizada</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="523"/>
<source>Remove OpenGL Pipeline Cache</source>
- <translation>Eliminar Caché de Tubería de OpenGL</translation>
+ <translation>Eliminar caché en tubería de OpenGL</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="524"/>
<source>Remove Vulkan Pipeline Cache</source>
- <translation>Eliminar Caché de Tubería de Vulkan</translation>
+ <translation>Eliminar caché en tubería de Vulkan</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="526"/>
<source>Remove All Pipeline Caches</source>
- <translation>Eliminar todas las cachés de tubería</translation>
+ <translation>Eliminar todas las cachés en tubería</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="527"/>
<source>Remove All Installed Contents</source>
- <translation>Eliminar Todos los Contenidos Instalados</translation>
+ <translation>Eliminar todo el contenido instalado</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="528"/>
@@ -4688,12 +4823,12 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="531"/>
<source>Copy Title ID to Clipboard</source>
- <translation>Copiar ID de título al portapapeles</translation>
+ <translation>Copiar la ID del título al portapapeles</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="532"/>
<source>Navigate to GameDB entry</source>
- <translation>Navegar a la entrada de BD del juego</translation>
+ <translation>Ir a la sección de bases de datos del juego</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="534"/>
@@ -4708,22 +4843,22 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="607"/>
<source>Remove Game Directory</source>
- <translation>Eliminar Directorio de Juegos</translation>
+ <translation>Eliminar directorio de juegos</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="626"/>
<source>▲ Move Up</source>
- <translation>▲ Mover Hacia Arriba</translation>
+ <translation>▲ Mover hacia arriba</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="627"/>
<source>▼ Move Down</source>
- <translation>▼ Mover Hacia Abajo</translation>
+ <translation>▼ Mover hacia abajo</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="628"/>
<source>Open Directory Location</source>
- <translation>Abrir Ubicación del Directorio</translation>
+ <translation>Abrir ubicación del directorio</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="673"/>
@@ -4754,8 +4889,8 @@ sin ninguna solución necesaria.</translation>
<location filename="../../src/yuzu/game_list_p.h" line="152"/>
<source>Game functions with minor graphical or audio glitches and is playable from start to finish. May require some
workarounds.</source>
- <translation>El juego funciona con fallos gráficos o de audio menores y se puede jugar de principio a fin. Puede requerir de
-soluciones temporales.</translation>
+ <translation>El juego funciona con fallos gráficos o de audio menores y es jugable de principio a fin. Puede que sea necesario
+recurrir a arreglos temporales.</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="153"/>
@@ -4766,8 +4901,8 @@ soluciones temporales.</translation>
<location filename="../../src/yuzu/game_list_p.h" line="153"/>
<source>Game functions with major graphical or audio glitches, but game is playable from start to finish with
workarounds.</source>
- <translation>El juego funciona con importantes fallos gráficos o de audio, pero el juego se puede jugar de principio a fin con
-soluciones temporales.</translation>
+ <translation>El juego funciona con fallos gráficos o de audio sustanciales, pero el juego es jugable de principio a fin con
+arreglos temporales.</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="154"/>
@@ -4778,19 +4913,19 @@ soluciones temporales.</translation>
<location filename="../../src/yuzu/game_list_p.h" line="154"/>
<source>Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches
even with workarounds.</source>
- <translation>El juego funciona, pero con importantes fallos gráficos o de audio. Es imposible avanzar en zonas específicas
-incluso con soluciones temporales.</translation>
+ <translation>El juego funciona, pero tiene errores gráficos o de audio. Es imposible avanzar en ciertas zonas debido a fallos
+incluso con arreglos temporales.</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="155"/>
<source>Intro/Menu</source>
- <translation>Intro/Menú</translation>
+ <translation>Intro/Menu</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="155"/>
<source>Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start
Screen.</source>
- <translation>No es posible jugar a este juego debido a importantes errores gráficos o de audio. Es imposible avanzar mas allá de la pantalla
+ <translation>No es posible jugar a este juego debido a errores gráficos o de audio importantes. Es imposible avanzar mas allá de la pantalla
de inicio.</translation>
</message>
<message>
@@ -4819,7 +4954,7 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="846"/>
<source>Double-click to add a new folder to the game list</source>
- <translation>Haga doble clic para agregar un nuevo directorio a la lista de juegos.</translation>
+ <translation>Haz doble clic para agregar un nuevo directorio a la lista de juegos.</translation>
</message>
</context>
<context>
@@ -4832,12 +4967,12 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="128"/>
<source>Filter:</source>
- <translation>Filtrar:</translation>
+ <translation>Búsqueda:</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="131"/>
<source>Enter pattern to filter</source>
- <translation>Introduce patrón para filtrar</translation>
+ <translation>Introduce un patrón para buscar</translation>
</message>
</context>
<context>
@@ -4845,12 +4980,12 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/install_dialog.cpp" line="31"/>
<source>Please confirm these are the files you wish to install.</source>
- <translation>Por favor, confirme que estos son los archivos que desea instalar.</translation>
+ <translation>Por favor, confirma que estos son los archivos que desea instalar.</translation>
</message>
<message>
<location filename="../../src/yuzu/install_dialog.cpp" line="34"/>
<source>Installing an Update or DLC will overwrite the previously installed one.</source>
- <translation>Instalando una Actualización o DLC reemplazará la que está instalada anteriormente.</translation>
+ <translation>Instalar una actualización o DLC reemplazará la que se instaló previamente.</translation>
</message>
<message>
<location filename="../../src/yuzu/install_dialog.cpp" line="38"/>
@@ -4878,17 +5013,17 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/loading_screen.ui" line="84"/>
<source>Loading Shaders 387 / 1628</source>
- <translation>Cargando Shaders 387 / 1628</translation>
+ <translation>Cargando shaders 387 / 1628</translation>
</message>
<message>
<location filename="../../src/yuzu/loading_screen.ui" line="121"/>
<source>Loading Shaders %v out of %m</source>
- <translation>Cargando Shaders %v de %m</translation>
+ <translation>Cargando shaders %v de %m</translation>
</message>
<message>
<location filename="../../src/yuzu/loading_screen.ui" line="135"/>
<source>Estimated Time 5m 4s</source>
- <translation>Tiempo Estimado 5m 4s</translation>
+ <translation>Tiempo estimado 5m 4s</translation>
</message>
<message>
<location filename="../../src/yuzu/loading_screen.cpp" line="91"/>
@@ -4898,7 +5033,7 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/loading_screen.cpp" line="92"/>
<source>Loading Shaders %1 / %2</source>
- <translation>Cargando Shaders %1 / %2</translation>
+ <translation>Cargando shaders %1 / %2</translation>
</message>
<message>
<location filename="../../src/yuzu/loading_screen.cpp" line="93"/>
@@ -4926,7 +5061,7 @@ de inicio.</translation>
<message>
<location filename="../../src/yuzu/main.ui" line="48"/>
<source>&amp;Recent Files</source>
- <translation>&amp;Archivos Recientes</translation>
+ <translation>&amp;Archivos recientes</translation>
</message>
<message>
<location filename="../../src/yuzu/main.ui" line="67"/>
@@ -4934,189 +5069,204 @@ de inicio.</translation>
<translation>&amp;Emulación</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Ver</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
- <translation>&amp;Reiniciar Tamaño de Ventana</translation>
+ <translation>&amp;Reiniciar tamaño de ventana</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Depuración</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
- <translation>Reiniciar Tamaño de Ventana a &amp;720p</translation>
+ <translation>Reiniciar el tamaño de la ventana a &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
- <translation>Reiniciar Tamaño de Ventana a 720p</translation>
+ <translation>Reiniciar el tamaño de la ventana a 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
- <translation>Reiniciar Tamaño de Ventana a &amp;900p</translation>
+ <translation>Reiniciar el tamaño de la ventana a &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
- <translation>Reiniciar Tamaño de Ventana a 900p</translation>
+ <translation>Reiniciar el tamaño de la ventana a 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
- <translation>Reiniciar Tamaño de Ventana a &amp;1080p</translation>
+ <translation>Reiniciar el tamaño de la ventana a &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
- <translation>Reiniciar Tamaño de Ventana a 1080p</translation>
+ <translation>Reiniciar el tamaño de la ventana a 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Depuración</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Herramientas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation>&amp;TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Ayuda</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
- <translation>&amp;Instalar Archivos al NAND...</translation>
+ <translation>&amp;Instalar archivos en NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
- <translation>C&amp;argar Archivo...</translation>
+ <translation>C&amp;argar archivo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
- <translation>Cargar &amp;Carpera</translation>
+ <translation>Cargar &amp;carpeta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>S&amp;alir</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pausar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Detener</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Reiniciando claves...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;Acerca de yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
- <translation>Modo &amp;Ventana</translation>
+ <translation>Modo &amp;ventana</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
- <translation>Con&amp;figure...</translation>
+ <translation>Con&amp;figurar...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>Mostrar complementos de cabecera del D&amp;ock </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
- <translation>Mostrar Barra de &amp;Filtro</translation>
+ <translation>Mostrar barra de &amp;búsqueda</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
- <translation>Mostrar Barra de &amp;Estado</translation>
+ <translation>Mostrar barra de &amp;estado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
- <translation>Mostrar Barra de Estado</translation>
+ <translation>Mostrar barra de estado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>P&amp;antalla completa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Reiniciar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
- <translation>Cargar &amp;Amibo</translation>
+ <translation>Cargar &amp;Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
- <translation>&amp;Reporte de Compatibilidad</translation>
+ <translation>&amp;Reporte de compatibilidad</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
- <translation>Abrir Página de &amp;Mods</translation>
+ <translation>Abrir página de &amp;mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
- <translation>Abrir Guía de &amp;Inicio Rápido</translation>
+ <translation>Abrir guía de &amp;inicio rápido</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;Preguntas frecuentes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Abrir la carpeta de &amp;yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
- <translation>&amp;Captura de Pantalla</translation>
+ <translation>&amp;Captura de pantalla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>Configurar &amp;TAS...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation>&amp;Configurar TAS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
- <translation>Configurar J&amp;uego actual...</translation>
+ <translation>Configurar j&amp;uego actual...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Iniciar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation>&amp;Reiniciar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation>G&amp;rabar</translation>
</message>
</context>
<context>
@@ -5163,9 +5313,14 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
- <translation>INICIAR/PARAR</translation>
+ <translation>INICIO/PAUSAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5178,17 +5333,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/game_list_p.h" line="252"/>
<source>Installed NAND Titles</source>
- <translation>Títulos instalados en la NAND</translation>
+ <translation>Títulos instalados en NAND</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="260"/>
<source>System Titles</source>
- <translation>Títulos del Sistema</translation>
+ <translation>Títulos del sistema</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="303"/>
<source>Add New Game Directory</source>
- <translation>Agregar un Nuevo Directorio de Juegos</translation>
+ <translation>Añadir un nuevo directorio de juegos</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="326"/>
@@ -5197,142 +5352,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
- <translation>[no establecido]</translation>
+ <translation>[no definido]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Rotación %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Eje %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Botón %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[desconocido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation>Izquierda</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation>Derecha</translation>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clic 0</translation>
+ <source>Down</source>
+ <translation>Abajo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clic 1</translation>
+ <source>Up</source>
+ <translation>Arriba</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clic 2</translation>
+ <source>Z</source>
+ <translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clic 3</translation>
+ <source>R</source>
+ <translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clic 4</translation>
+ <source>L</source>
+ <translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Eje GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Botón GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>TAS Axis %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation>L1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation>L2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation>L3</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>TAS Btn %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation>R1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Movimiento %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation>R2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1Button %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation>R3</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>Movimiento SDL</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation>Círculo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Click %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation>Cuadrado</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation>Triángulo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation>Opciones</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation>%1%2Botón %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[no usado]</translation>
</message>
@@ -5342,12 +5577,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="14"/>
<source>Controller Applet</source>
- <translation>Controller Applet</translation>
+ <translation>Controlador Applet</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="129"/>
<source>Supported Controller Types:</source>
- <translation>Tipos de Controladores Soportados:</translation>
+ <translation>Tipos de controladores soportados:</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="282"/>
@@ -5373,7 +5608,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Controlador Pro</translation>
</message>
@@ -5386,9 +5621,9 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
- <translation>Joycons Dobles</translation>
+ <translation>Joycons duales</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="524"/>
@@ -5399,9 +5634,9 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
- <translation>Joycon Izquierdo</translation>
+ <translation>Joycon izquierdo</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="529"/>
@@ -5412,9 +5647,9 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
- <translation>Joycon Derecho</translation>
+ <translation>Joycon derecho</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="538"/>
@@ -5426,7 +5661,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1881"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2078"/>
<source>Use Current Config</source>
- <translation>Usar Configuracion Actual</translation>
+ <translation>Usar configuración actual</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="615"/>
@@ -5440,7 +5675,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Portátil</translation>
</message>
@@ -5472,7 +5707,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2272"/>
<source>Console Mode</source>
- <translation>Modo Consola</translation>
+ <translation>Modo consola</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2293"/>
@@ -5561,9 +5796,9 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
- <translation>Controlador GameCube</translation>
+ <translation>Controlador de GameCube</translation>
</message>
</context>
<context>
@@ -5573,21 +5808,21 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_error.cpp" line="35"/>
<location filename="../../src/yuzu/applets/qt_error.cpp" line="50"/>
<source>Error Code: %1-%2 (0x%3)</source>
- <translation>Código de Error: %1-%2 (0x%3)</translation>
+ <translation>Código de error: %1-%2 (0x%3)</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_error.cpp" line="26"/>
<source>An error has occurred.
Please try again or contact the developer of the software.</source>
<translation>Ha ocurrido un error.
-Por favor, intentelo de nuevo o contacta con el desarrollador del software.</translation>
+Por favor, inténtalo de nuevo o contacta con el desarrollador del software.</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_error.cpp" line="39"/>
<source>An error occurred on %1 at %2.
Please try again or contact the developer of the software.</source>
<translation>Ha ocurrido un error en %1 a las %2
-Por favor, inténtelo de nuevo o contacta con el desarrollador del software.</translation>
+Por favor, inténtalo de nuevo o contacta con el desarrollador del software.</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_error.cpp" line="54"/>
@@ -5634,12 +5869,12 @@ Por favor, inténtelo de nuevo o contacta con el desarrollador del software.</tr
<message>
<location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="14"/>
<source>Software Keyboard</source>
- <translation>Software del Teclado</translation>
+ <translation>Software del teclado</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="199"/>
<source>Enter Text</source>
- <translation>Introducir Texto</translation>
+ <translation>Introducir texto</translation>
</message>
<message>
<location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="479"/>
@@ -5655,13 +5890,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>Aceptar</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@@ -5671,7 +5906,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/util/sequence_dialog/sequence_dialog.cpp" line="11"/>
<source>Enter a hotkey</source>
- <translation>Ingrese combinación de teclas de acceso rápido</translation>
+ <translation>Introduce una combinación de teclas</translation>
</message>
</context>
<context>
@@ -5679,7 +5914,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="150"/>
<source>Call stack</source>
- <translation>Pila de Llamadas</translation>
+ <translation>Llamadas acumuladas</translation>
</message>
</context>
<context>
@@ -5687,7 +5922,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="129"/>
<source>waiting for mutex 0x%1</source>
- <translation>esperando por mutex 0x%1</translation>
+ <translation>esperando al mutex 0x%1</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="136"/>
@@ -5705,12 +5940,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="231"/>
<source>waiting for all objects</source>
- <translation>esperando todos los objetos</translation>
+ <translation>esperando a todos los objetos</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="232"/>
<source>waiting for one of the following objects</source>
- <translation>esperando uno de los siguientes objetos</translation>
+ <translation>esperando a uno de los siguientes objetos</translation>
</message>
</context>
<context>
@@ -5741,12 +5976,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="261"/>
<source>sleeping</source>
- <translation>dormido</translation>
+ <translation>reposando</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="264"/>
<source>waiting for IPC reply</source>
- <translation>esperando para respuesta IPC</translation>
+ <translation>esperando respuesta IPC</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="267"/>
@@ -5831,12 +6066,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="362"/>
<source>last running ticks = %1</source>
- <translation>Últimos ticks consecutivos = %1</translation>
+ <translation>últimos ticks consecutivos = %1</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="370"/>
<source>not waiting for mutex</source>
- <translation>no esperando por mutex</translation>
+ <translation>no esperando al mutex</translation>
</message>
</context>
<context>
@@ -5844,7 +6079,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="394"/>
<source>waited by thread</source>
- <translation>esperado por hilo</translation>
+ <translation>esperado por el hilo</translation>
</message>
</context>
<context>
@@ -5852,7 +6087,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="468"/>
<source>&amp;Wait Tree</source>
- <translation>&amp;Árbol de Espera</translation>
+ <translation>&amp;Árbol de espera</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts
index 89aed0e6c..4ae16542c 100644
--- a/dist/languages/fr.ts
+++ b/dist/languages/fr.ts
@@ -183,7 +183,7 @@ p, li { white-space: pre-wrap; }&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot;
<message>
<location filename="../../src/yuzu/compatdb.cpp" line="73"/>
<source>An error occurred while sending the Testcase</source>
- <translation>Une erreur est survenue en envoyant le cas de test</translation>
+ <translation>Une erreur est survenue lors de l&apos;envoi du cas-type</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.cpp" line="75"/>
@@ -320,13 +320,13 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Cette option améliore la vitesse des fonctions à virgule flottante 32 bits ASIMD en utilisant des modes d&apos;arrondis incorrects.&lt;/div&gt;
+ &lt;div&gt;Cette option améliore la vitesse des fonctions à virgule flottante 32 bits ASIMD en utilisant des modes d&apos;arrondissement incorrects.&lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="125"/>
<source>Faster ASIMD instructions (32 bits only)</source>
- <translation>Instructions ASIMD plus rapides (seulement 32 bits)</translation>
+ <translation>Instructions ASIMD plus rapides (32 bits seulement)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="132"/>
@@ -382,7 +382,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Pour le débogage seulement.&lt;/span&gt;&lt;br/&gt;Si vous n&apos;êtes pas sûr(e) de ce qu&apos;ils font, gardez les tous activés.&lt;br/&gt;Ces paramètres, quand ils sont désactivés, prennent effet seulement quand le Débogage CPU est activé. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Pour le débogage seulement.&lt;/span&gt;&lt;br/&gt;Si vous n&apos;êtes pas sûr(e) de ce qu&apos;ils font, gardez les tous activés.&lt;br/&gt;Ces paramètres, lorsque désactivés, prennent effet seulement quand le Débogage CPU est activé. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
@@ -541,7 +541,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="29"/>
<source>Show Log in Console</source>
- <translation>Afficher le log dans la console</translation>
+ <translation>Afficher le relevé d&apos;événements dans la console</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="36"/>
@@ -551,7 +551,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="46"/>
<source>When checked, the max size of the log increases from 100 MB to 1 GB</source>
- <translation>Quand coché, la taille maximum du log augmente de 100 MB à 1 GB</translation>
+ <translation>Lorsque coché, la taille maximum du relevé d&apos;événements augmente de 100 Mo à 1 Go</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="49"/>
@@ -576,7 +576,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="91"/>
<source>When checked, the graphics API enters a slower debugging mode</source>
- <translation>Quand coché, l&apos;API graphique entre dans un mode de débug plus lent</translation>
+ <translation>Lorsque coché, l&apos;API graphique entre dans un mode de débogage plus lent</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="94"/>
@@ -596,7 +596,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="114"/>
<source>When checked, it disables the macro Just In Time compiler. Enabling this makes games run slower</source>
- <translation>Quand coché, cela désactive le compilateur de macros JIT. L&apos;activer ralentit les jeux</translation>
+ <translation>Lorsque coché, désactive le compilateur de macros JIT. L&apos;activer ralentit les jeux</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="117"/>
@@ -664,7 +664,12 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<translation>Activer l&apos;Auto-Stub**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Ce sera réinitialisé automatiquement quand yuzu fermera.</translation>
</message>
@@ -944,67 +949,78 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<translation>Général </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Limite du &apos;frame rate&apos;</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation>Requière l&apos;utilisation du raccourci Basculer la Limite des IPS pour être pris en compte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Limite du &apos;frame rate&apos;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Limiter la vitesse en pourcentages</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulation CPU Multicœur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Confirmer la sortie pendent l&apos;émulation en cours</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Demander un utilisateur au lancement d&apos;un jeu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Mettre en pause l’émulation lorsque mis en arrière plan </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Cacher la souris en cas d&apos;inavtivité</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Réinitialiser Tous les Paramètres</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Ceci réinitialise tout les paramètres et supprime toutes les configurations par jeu. Cela ne va pas supprimer les répertoires de jeu, les profils, ou les profils d&apos;entrée. Continuer ?</translation>
</message>
@@ -1079,7 +1095,7 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="216"/>
<source>GPU Video Decoding (Default)</source>
- <translation>Décodage Vidéo sur le CPU (par défaut)</translation>
+ <translation>Décodage Vidéo sur le GPU (par défaut)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="242"/>
@@ -1122,18 +1138,113 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
<translation>Étirer à la fenêtre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>Résolution :</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [EXPÉRIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [EXPÉRIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation>Filtre de fenêtre adaptatif</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation>Plus proche voisin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation>Bilinéaire</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation>Bicubique</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>Gaussien</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>ScaleForce</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation>AMD FidelityFX™️ Super Resolution [Vulkan seulement]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>Méthode d&apos;anticrénelage :</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>Aucune</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Utiliser une couleur d&apos;arrière plan globale</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Définir la couleur d&apos;arrière plan:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Couleur de L’arrière plan :</translation>
</message>
@@ -1202,28 +1313,33 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Défaut</translation>
+ <source>Automatic</source>
+ <translation>Automatique</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (VA BRISER DES TRUCS)</translation>
+ <source>Default</source>
+ <translation>Défaut</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (VA BRISER DES TRUCS)</translation>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (VA BRISER DES TRUCS)</translation>
+ <source>4x</source>
+ <translation>4x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (VA BRISER DES TRUCS)</translation>
+ <source>8x</source>
+ <translation>8x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>16x</translation>
</message>
</context>
<context>
@@ -1550,8 +1666,8 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Autres</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1560,499 +1676,524 @@ Cette option améliore la vitesse en réduisant la précision des instructions f
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emuler l&apos;analogique avec une entrée clavier</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Activer le mouvement panorama avec la souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Sensibilité de la souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avancé</translation>
+ <source>Mouse</source>
+ <translation>Souris</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Écran tactile</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Souris</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avancé</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>La motion / Toucher</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Déboguer les manettes</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Configurer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Déboguer les manettes</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Autres</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emuler l&apos;analogique avec une entrée clavier</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Nécessite de redémarrer yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>Activer le support de 8 joueurs avecc XInput (désactiver l&apos;appliquette web)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Configurer les touches</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Connecter la manette</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Activer le mouvement panorama avec la souris</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Sensibilité de la souris</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Deux Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon de gauche</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>La motion / Toucher</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon de droit</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Configurer les touches</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Mode Portable</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Connecter la manette</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Périphérique d&apos;entrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>N&apos;importe quel</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Clavier/Souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Sauvegarde</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nouveau</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Stick Gauche</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Haut</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Gauche</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Droite</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Bas</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Appuyé</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificateur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Portée</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Zone morte: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modification de la course: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>Pavé directionnel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Moins</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Capturer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Mouvement 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Mouvement 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Boutons</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Stick Droit</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Effacer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[non défini]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Bouton d&apos;activation</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Inverser l&apos;axe</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Définir le seuil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Choisissez une valeur entre 0% et 100%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Mapper le stick analogique</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Après avoir appuyé sur OK, bougez d&apos;abord votre joystick horizontalement, puis verticalement.
Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis horizontalement.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Inverser l&apos;axe</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Zone morte: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modification de la course: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Deux Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon de gauche</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon de droit</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Mode Portable</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Manette GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Stick de contrôle </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Secouez !</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[en attente]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Nouveau Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Entrez un nom de profil :</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Créer un profil d&apos;entrée </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Le nom de profil donné est invalide !</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Échec de la création du profil d&apos;entrée &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Supprimer le profil d&apos;entrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Échec de la suppression du profil d&apos;entrée &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Charger le profil d&apos;entrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Échec du chargement du profil d&apos;entrée &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Sauvegarder le profil d&apos;entrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Échec de la sauvegarde du profil d&apos;entrée &quot;%1&quot;</translation>
</message>
@@ -2078,85 +2219,75 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configurer le contrôle par mouvement / tactile</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Mouvement de souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilité:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Tactile</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Calibration UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configurer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Utiliser le mappage des boutons:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configurer CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Vous pouvez utiliser n&apos;importe quelle source d&apos;entrée UDP compatible Cemuhook pour fournir le contrôle par mouvement et l&apos;entrée tactile</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Serveur:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Plus d&apos;informations</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Tester</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Ajouter un serveur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Retirer un serveur</translation>
</message>
@@ -2166,146 +2297,82 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Plus d&apos;informations&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Le numéro de port contient des caractères invalides</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Le port doit être entre 0 et 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>L&apos;adresse IP n&apos;est pas valide</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Ce serveur UDP existe déjà</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Impossible d&apos;ajouter plus de 8 serveurs</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Essai</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configuration</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test réussi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Données reçues du serveur avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test échoué</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Impossible de recevoir des données valides du serveur.&lt;br&gt;Veuillez vérifier que le serveur est correctement configuré et que l&apos;adresse et le port sont corrects.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Le test UDP ou la configuration de l&apos;étalonnage est en cours.&lt;br&gt;Veuillez attendre qu&apos;ils se terminent.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configuration de la souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Boutons de la souris</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Avant :</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Arrière :</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Gauche :</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Milieu :</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Droite :</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Effacer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Défauts</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[pas défini]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Réinitialiser </translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[appuyez sur une touche]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -2408,7 +2475,7 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>Adv. Graphiques</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2592,12 +2659,12 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>Erreur de redimensionnement de l&apos;image utilisateur</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>Impossible de redimensionner l&apos;image</translation>
</message>
</context>
<context>
@@ -3064,12 +3131,12 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lit l&apos;entrée du contrôleur à partir des scripts dans le même format que &apos;TAS-nx&apos; &lt;br/&gt; Pour une explication plus détaillée, veuillez consulter le &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;page d&apos;aide &lt;/span&gt;&lt;/a&gt;sur le site Yuzu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
<source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
- <translation type="unfinished"/>
+ <translation>Pour vérifier quelles touches de raccourci contrôlent la lecture/l&apos;enregistrement, veuillez vous reporter aux paramètres des touches de raccourci (Configurer -&gt; Général -&gt; Touches de raccourci).</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
@@ -3088,31 +3155,26 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Changer automatiquement le profile de la manette</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>Script de boucle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>Mettre en pause l&apos;exécution pendant le chargement</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Dossier de script</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Chemin</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3125,7 +3187,7 @@ Pour inverser les axes, bougez d&apos;abord votre joystick verticalement, puis h
<translation>Configuration du TAS</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>Sélectionner le dossier de chargement du TAS...</translation>
</message>
@@ -3187,37 +3249,37 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nouveau profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Saisissez le nom du nouveau profil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Supprimer le profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Supprimer le profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Renommer le profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nouveau nom:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[appuyez sur une touche]</translation>
</message>
@@ -3637,12 +3699,12 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Contrôleur joueur 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Contrôleur joueur 1</translation>
</message>
@@ -3650,90 +3712,95 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Des données anonymes sont collectées&lt;/a&gt; pour aider à améliorer yuzu. &lt;br/&gt;&lt;br/&gt;Voulez-vous partager vos données d&apos;utilisations avec nous ?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Télémétrie</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Chargement du Web Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Désactiver l&apos;applet web</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Désactiver l&apos;applet web l&apos;empêchera de s&apos;afficher à nouveau pour le reste de la session émulée. Cela peut causer des comportements indéfinis et ne devrait être utilisé qu&apos;avec Super Mario 3D All-Stars. Voulez-vous vraiment désactiver l&apos;applet web?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>La quantité de shaders en cours de construction</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>Le multiplicateur de mise à l&apos;échelle de résolution actuellement sélectionné.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Valeur actuelle de la vitesse de l&apos;émulation. Des valeurs plus hautes ou plus basses que 100% indique que l&apos;émulation fonctionne plus vite ou plus lentement qu&apos;une véritable Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Combien d&apos;image par seconde le jeu est en train d&apos;afficher. Ceci vas varier de jeu en jeu et de scènes en scènes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Temps pris pour émuler une image par seconde de la switch, sans compter le limiteur d&apos;image par seconde ou la synchronisation verticale. Pour une émulation à pleine vitesse, ceci devrait être au maximum à 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Configuration invalide détectée</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Contrôleur portable ne peut pas être utilisé en mode téléviseur. La manette Pro sera sélectionnée.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>MODE TV</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Effacer les fichiers récents</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>Enregistrement TAS</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Continuer</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>Ecraser le fichier du joueur 1 ?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3784,657 +3851,724 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce
<translation>Une erreur inconnue est survenue. Veuillez consulter le journal des logs pour plus de détails.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Démarrer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Enregistrer les données</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Donnés du Mod</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Erreur dans l&apos;ouverture du dossier %1.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Le dossier n&apos;existe pas !</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Erreur lors de l&apos;ouverture des Shader Cache Transferable</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>Impossible de créer le dossier de cache du shader pour ce jeu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Contenus</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Mise à jour</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Supprimer l&apos;entrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Supprimer le jeu installé %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Supprimé avec succès</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Suppression du jeu de base installé avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Erreur lors de la suppression %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Le jeu de base n&apos;est pas installé dans la NAND et ne peut pas être supprimé.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Suppression de la mise à jour installée avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Il n&apos;y a pas de mise à jour installée pour ce titre.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Il n&apos;y a pas de DLC installé pour ce titre.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Suppression de %1 DLC installé(s) avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>Supprimer la Cache OpenGL de Shader Transférable?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Supprimer la Cache Vulkan de Shader Transférable?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>Supprimer Toutes les Caches de Shader Transférable?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Supprimer la configuration personnalisée du jeu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Supprimer fichier</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Erreur lors de la suppression du cache de shader transférable</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Un shader cache pour ce titre n&apos;existe pas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Suppression du cache de shader transférable avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Échec de la suppression du cache de shader transférable.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>Erreur durant la Suppression des Caches de Shader Transférable</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>Suppression des caches de shader transférable effectuée avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>Impossible de supprimer le dossier de la cache de shader transférable.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Erreur lors de la suppression de la configuration personnalisée</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Il n&apos;existe pas de configuration personnalisée pour ce titre.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Suppression de la configuration de jeu personnalisée avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Échec de la suppression de la configuration personnalisée du jeu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>L&apos;extraction de la RomFS a échoué !</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Une erreur s&apos;est produite lors de la copie des fichiers RomFS ou l&apos;utilisateur a annulé l&apos;opération.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Plein</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Squelette</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Sélectionnez le mode d&apos;extraction de la RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Veuillez sélectionner la manière dont vous souhaitez que le fichier RomFS soit extrait.&lt;br&gt;Full copiera tous les fichiers dans le nouveau répertoire, tandis que&lt;br&gt;skeleton créera uniquement la structure de répertoires.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation>Il n&apos;y a pas assez d&apos;espace libre dans %1 pour extraire la RomFS. Veuillez libérer de l&apos;espace ou sélectionner un autre dossier d&apos;extraction dans Émulation &gt; Configuration &gt; Système &gt; Système de fichier &gt; Extraire la racine</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extraction de la RomFS ...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Extraction de la RomFS réussi !</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>L&apos;opération s&apos;est déroulée avec succès.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Erreur lors de l&apos;ouverture %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Sélectionner un répertoire</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Propriétés</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Les propriétés du jeu n&apos;ont pas pu être chargées.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Exécutable Switch (%1);;Tous les fichiers (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Charger un fichier</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Ouvrir le dossier des ROM extraites</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Destination sélectionnée invalide</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Le répertoire que vous avez sélectionné ne contient pas de fichier &quot;main&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Fichier Switch installable (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Installer les fichiers</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>%n fichier restant</numerusform><numerusform>%n fichiers restants</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Installation du fichier &quot;%1&quot; ...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Résultats d&apos;installation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Pour éviter d&apos;éventuels conflits, nous déconseillons aux utilisateurs d&apos;installer des jeux de base sur la NAND.
Veuillez n&apos;utiliser cette fonctionnalité que pour installer des mises à jour et des DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n fichier a été nouvellement installé</numerusform><numerusform>%n fichiers ont été nouvellement installés</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n fichier a été écrasé</numerusform><numerusform>%n fichiers ont été écrasés</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n fichier n&apos;a pas pu être installé</numerusform><numerusform>%n fichiers n&apos;ont pas pu être installés</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Application Système</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Archive Système</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Mise à jour de l&apos;application système</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Paquet micrologiciel (Type A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Paquet micrologiciel (Type B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Jeu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Mise à jour de jeu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>DLC de jeu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Titre Delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Sélectionner le type d&apos;installation du NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Veuillez sélectionner le type de titre auquel vous voulez installer ce NCA :
(Dans la plupart des cas, le titre par défaut : &apos;Jeu&apos; est correct.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Échec de l&apos;installation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Le type de titre que vous avez sélectionné pour le NCA n&apos;est pas valide.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Fichier non trouvé</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Fichier &quot;%1&quot; non trouvé</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Continuer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Compte yuzu manquant</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Pour soumettre un test de compatibilité pour un jeu, vous devez lier votre compte yuzu.&lt;br&gt;&lt;br/&gt;Pour lier votre compte yuzu, aller à Emulation &amp;gt; Configuration&amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Erreur lors de l&apos;ouverture de l&apos;URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Impossible d&apos;ouvrir l&apos;URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>Enregistrement TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Ecraser le fichier du joueur 1 ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Fichier Amiibo (%1);; Tous les fichiers (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Charger un Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Erreur lors de l&apos;ouverture du fichier de données Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Impossible d&apos;ouvrir le fichier Amiibo &quot;%1&quot; à lire.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Erreur lors de la lecture du fichier de données Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Impossible de lire entièrement les données Amiibo. On s&apos;attend à lire %1 octets, mais il n&apos;a pu lire que %2 octets</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Erreur lors du chargement des données Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Impossible de charger les données Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Capture d&apos;écran</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Image PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>Etat du TAS : En cours d&apos;exécution %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>Etat du TAS : Enregistrement %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation>Etat du TAS : Inactif %1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>Etat du TAS : Invalide</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>Compilation: %n shader</numerusform><numerusform>Compilation: %n shaders</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>Échelle : %1x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Vitesse : %1% / %2% </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Vitesse : %1% </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>Jeu: %1 IPS (Débloqué)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Jeu : %1 FPS </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Frame : %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU HAUT</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTRÊME</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU ERREUR</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation>PLUS PROCHE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation>BILINÉAIRE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation>BICUBIQUE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>GAUSSIEN</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation>SCALEFORCE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation>FSR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>AUCUN AA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Le jeu que vous essayez de charger a besoin de fichiers additionnels que vous devez extraire depuis votre Switch avant de jouer.&lt;br/&gt;&lt;br/&gt;Pour plus d&apos;information sur l&apos;extraction de ces fichiers, veuillez consulter la page du wiki suivante : &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Extraction des archives système et des Shared Fonts depuis la Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Voulez-vous quitter la liste des jeux ? Une émulation continue peut entraîner des crashs, la corruption de données de sauvegarde ou d’autres bugs.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu n&apos;a pas été capable de localiser un système d&apos;archive Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu n&apos;a pas été capable de localiser un système d&apos;archive Switch. %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Archive système introuvable</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Archive Système Manquante</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>Yuzu n&apos;a pas été capable de localiser les polices partagées de la Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Les polices partagées non pas été trouvées</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Polices Partagée Manquante</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Erreur fatale</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu a rencontré une erreur fatale, veuillez consulter les logs pour plus de détails. Pour plus d&apos;informations sur l&apos;accès aux logs, veuillez consulter la page suivante : &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt; Comment télécharger le fichier des logs &lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Voulez-vous quitter la liste des jeux ? Une émulation continue peut entraîner des crashs, la corruption de données de sauvegarde ou d’autres bugs.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Erreur Fatale rencontrée</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Confirmer la réinstallation de la clé</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4451,37 +4585,37 @@ et éventuellement faites des sauvegardes.
Cela supprimera vos fichiers de clé générés automatiquement et ré exécutera le module d&apos;installation de clé.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Fusibles manquants</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- BOOT0 manquant</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- BCPKG2-1-Normal-Main manquant</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- PRODINFO manquant</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Composants de dérivation manquants</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Il manque des composants qui peuvent empêcher la dérivation de clé de se terminer. &lt;br&gt;Veuillez suivre&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;le guide de démarrage rapide de yuzu&lt;/a&gt; pour obtenir toutes vos clés et tous vos jeux.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>Les clés de chiffrement sont manquantes. &lt;br&gt;Veuillez suivre &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;le guide de démarrage rapide yuzu&lt;/a&gt; pour obtenir tous vos clés, firmware et jeux.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4490,39 +4624,39 @@ Cela peut prendre jusqu&apos;à une minute en fonction
des performances de votre système.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Installation des clés</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Sélectionner la cible d&apos;extraction du RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Veuillez sélectionner quel RomFS vous voulez extraire.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Êtes vous sûr de vouloir fermer yuzu ?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Êtes-vous sûr d&apos;arrêter l&apos;émulation ? Tout progrès non enregistré sera perdu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4534,38 +4668,38 @@ Voulez-vous ignorer ceci and quitter quand même ?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL n&apos;est pas disponible!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu n&apos;a pas été compilé avec le support OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Erreur lors de l&apos;initialisation d&apos;OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Votre GPU peut ne pas prendre en charge OpenGL, ou vous n&apos;avez pas les derniers pilotes graphiques.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Erreur lors de l&apos;initialisation d&apos;OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Votre GPU peut ne pas prendre en charge OpenGL 4.6 ou vous ne disposez pas du dernier pilote graphique: %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Votre GPU peut ne pas prendre en charge une ou plusieurs extensions OpenGL requises. Veuillez vous assurer que vous disposez du dernier pilote graphique.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Extensions non prises en charge:&lt;br&gt;%2</translation>
</message>
@@ -4925,190 +5059,205 @@ Screen.</source>
<translation>&amp;Émulation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Vue</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Réinitialiser la taille de la fenêtre</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Débogage</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>&amp;Réinitialiser la taille de la fenêtre à 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Réinitialiser la taille de la fenêtre à 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>Réinitialiser la taille de la fenêtre à &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>Réinitialiser la taille de la fenêtre à 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Réinitialiser la taille de la fenêtre à &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Réinitialiser la taille de la fenêtre à 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Débogage</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Outils</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Aide</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Installer des fichiers sur la NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>&amp;Charger un fichier...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>&amp;Charger un dossier</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>Q&amp;uitter</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Démarrer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Arrêter</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Réinitialiser les clés...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;À propos de yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>&amp;Mode fenêtre unique</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>&amp;Configurer...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>&amp;Afficher les en-têtes du widget Dock</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>&amp;Afficher la barre de filtre</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>&amp;Afficher la barre d&apos;état</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Afficher la barre d&apos;état</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>P&amp;lein écran</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Redémarrer</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Charger un &amp;Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Signaler la compatibilité</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Ouvrir la &amp;Page des Mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>Ouvrir le &amp;Guide de Démarrage rapide</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;FAQ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Ouvrir le &amp;Dossier de Yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Capture d&apos;écran</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>Configurer le &amp;TAS...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Configurer le J&amp;eu actuel...</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Démarrer</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5154,10 +5303,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>Démarrer/Pause </translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5188,142 +5342,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Maj</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[non défini]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Chapeau %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Axe %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Bouton %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[inconnu]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clic 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clic 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clic 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clic 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clic 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Axe GameCube %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Bouton GameCube %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>Axe TAS %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>Btn TAS %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Mouvement %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1Bouton %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL Motion</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Clic %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[inutilisé]</translation>
</message>
@@ -5364,7 +5598,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5377,7 +5611,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Deux Joycons</translation>
</message>
@@ -5390,7 +5624,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Joycon gauche</translation>
</message>
@@ -5403,7 +5637,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Joycon droit</translation>
</message>
@@ -5431,7 +5665,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Portable</translation>
</message>
@@ -5552,7 +5786,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Manette GameCube</translation>
</message>
@@ -5646,13 +5880,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
diff --git a/dist/languages/it.ts b/dist/languages/it.ts
index 9934199c7..7511099b1 100644
--- a/dist/languages/it.ts
+++ b/dist/languages/it.ts
@@ -378,7 +378,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Solo durante il debug.&lt;/span&gt;&lt;br/&gt;Se non sei sicuro su cosa facciano queste opzioni, lasciale tutte attive.&lt;br/&gt;Queste opzioni avranno effetto solo se la modalità di Debug della CPU è attiva&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
@@ -654,7 +654,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -934,67 +939,78 @@ p, li { white-space: pre-wrap; }
<translation>Generale</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Percentuale Limite Velocità</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulazione CPU Multicore</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Richiedi conferma di uscire mentre l&apos;emulazione è in corso</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Richiedi utente all&apos;avvio di un gioco</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausa emulazione quando in background</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Nascondi il puntatore del mouse se inattivo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Resetta tutte le impostazioni</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Questo resetta tutte le impostazioni e rimuove tutte le configurazioni per gioco. Questo, non cancellerà le cartelle di gioco, i profili o i profili di input. Vuoi Procedere ?</translation>
</message>
@@ -1112,18 +1128,113 @@ p, li { white-space: pre-wrap; }
<translation>Allunga a finestra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Usa il colore di sfondo globale</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Imposta colore dello sfondo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Colore Sfondo:</translation>
</message>
@@ -1192,27 +1303,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Predefinito</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Predefinito</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1540,8 +1656,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Altro</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1550,499 +1666,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emula le levette analogiche con la tastiera</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Abilita mouse panning</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Sensibilità del mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avanzate</translation>
+ <source>Mouse</source>
+ <translation>Mouse</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Touchscreen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mouse</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avanzate</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Movimento/tocco</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Debug Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Configura</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Debug Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Altro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emula le levette analogiche con la tastiera</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Configura Input</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Controller connesso</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Abilita mouse panning</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Sensibilità del mouse</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Due Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon sinistro</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Movimento/tocco</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon destro</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Configura Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Portatile</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Controller connesso</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Dispositivo input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Qualsiasi</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Tastiera/mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profilo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Salva</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nuovo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Elimina</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Stick Sinistro</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Su</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Sinistra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Destra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Giù</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Premuto</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificatore</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Raggio</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Zona morta: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modifica raggio: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Meno</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Cattura</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Più</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Movimento 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Movimento 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Pulsanti Frontali</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Stick Destro</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Cancella</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[non impostato]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Premi il bottone</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Inverti assi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Mappa la levetta analogica</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Dopo aver premuto OK, prima muovi la levetta orizzontalmente, e poi verticalmente.
Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalmente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Inverti assi</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Zona morta: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modifica raggio: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Due Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon sinistro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon destro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Portatile</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Controller GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Inizia / Interrompi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Levetta di Controllo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>Levetta C</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Scuoti!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[in attesa]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Nuovo Profilo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Inserisci un nome profilo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Crea un profilo di Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Il nome profilo dato non è valido!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Impossibile creare il profilo di input &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Elimina un profilo di Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Impossibile eliminare il profilo di input &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Carica un profilo di Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Impossibile caricare il profilo di input &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Salva un profilo di Input</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Impossibile creare il profilo di input &quot;%1&quot;</translation>
</message>
@@ -2068,85 +2209,75 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configura movimento/tocco</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Movimento del mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilità:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Calibrazione UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configura</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Usa mappatura pulsanti</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configurazione CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Dovresti utilizzare qualsiasi sorgente di ingresso UDP compatibile con Cemuhook per fornire input di movimento e tocco.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Porta:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Per saperne di più</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Aggiungi un Server</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Rimuovi un Server</translation>
</message>
@@ -2156,146 +2287,82 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Per saperne di più&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Il numero di porta ha caratteri non validi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>La valore della porta deve essere compreso tra 0 e 65353 inclusi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>Indirizzo IP non valido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Questo server UDP esiste già</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Impossibile aggiungere più di 8 server</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configurando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test riuscito</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Ricevuti con successo dati dal server.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test fallito</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Impossibile ricevere dati validi dal server.&lt;br&gt; Verificare che il server sia impostato correttamente e che indirizzo e porta siano corretti.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>È in corso il test UDP o la configurazione della calibrazione,&lt;br&gt; attendere che finiscano.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configura Mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Pulsanti Mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Avanti:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Indietro:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Sinistro:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Centrale:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Destro:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Cancella</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Predefiniti</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[non impostato]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Ripristina Predefinito</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[premi un pulsante]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3049,12 +3116,12 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="11"/>
<source>TAS</source>
- <translation type="unfinished"/>
+ <translation>TAS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Gli script vengono letti seguendo lo stesso formato degli script di TAS-nx.&lt;br/&gt;Per saperne di più, puoi consultare &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;questa pagina&lt;/span&gt;&lt;/a&gt;sul sito di yuzu.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
@@ -3064,45 +3131,40 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
<source>WARNING: This is an experimental feature.&lt;br/&gt;It will not play back scripts frame perfectly with the current, imperfect syncing method.</source>
- <translation type="unfinished"/>
+ <translation>IMPORTANTE: questa funzione è ancora in fase sperimentale.&lt;br/&gt;Gli script NON verranno riprodotti perfettamente.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="51"/>
<source>Settings</source>
- <translation type="unfinished"/>
+ <translation>Impostazioni</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="57"/>
<source>Enable TAS features</source>
- <translation type="unfinished"/>
+ <translation>Attiva le funzioni di TASing</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
- <translation type="unfinished"/>
+ <translation>Cartella degli script</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3115,7 +3177,7 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3177,37 +3239,37 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nuovo Profilo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Inserisci il nome per il nuovo profilo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Elimina Profilo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Elimina profilo %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Rinomina Profilo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nuovo nome:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[premi pulsante]</translation>
</message>
@@ -3297,7 +3359,7 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="36"/>
<source>Filename</source>
- <translation type="unfinished"/>
+ <translation>Nome del file</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="37"/>
@@ -3307,12 +3369,12 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="38"/>
<source>Title ID</source>
- <translation type="unfinished"/>
+ <translation>ID del gioco (Title ID)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.cpp" line="39"/>
<source>Title Name</source>
- <translation type="unfinished"/>
+ <translation>Nome del gioco</translation>
</message>
</context>
<context>
@@ -3627,12 +3689,12 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Controller P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Controller P1</translation>
</message>
@@ -3640,90 +3702,95 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Vengono raccolti dati anonimi&lt;/a&gt; per aiutarci a migliorare yuzu. &lt;br/&gt;&lt;br/&gt;Desideri condividere i tuoi dati di utilizzo con noi?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetria</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Caricamento Web Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Disabilita l&apos;Applet Web</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>La disabilitazione dell&apos;applet Web farà sì che non venga più mostrata per il resto della sessione emulata. Questo può portare a un comportamento indefinito e dovrebbe essere usato solo con Super Mario 3D All-Stars. Sei sicuro di voler disabilitare l&apos;applet web?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Il numero di shaders al momento in costruzione</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Velocità corrente dell&apos;emulazione. Valori più alti o più bassi di 100% indicano che l&apos;emulazione sta funzionando più velocemente o lentamente rispetto a una Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Quanti frame al secondo il gioco mostra attualmente. Questo varia da gioco a gioco e da situazione a situazione.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tempo utilizzato per emulare un frame della Switch, non contando i limiti ai frame o il v-sync.
Per un&apos;emulazione alla massima velocità, il valore dev&apos;essere al massimo 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Trovata configurazione invalida</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Il controller Handheld non può essere utilizzato in modalità docked. Verrà selezionato il controller Pro.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Cancella i File Recenti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Continua</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3775,658 +3842,725 @@ Per un&apos;emulazione alla massima velocità, il valore dev&apos;essere al mass
<translation>E&apos; stato riscontrato un errore sconosciuto. Visualizza il log per maggiori dettagli.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Avvia</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Dati di Salvataggio</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Dati delle Mod</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Errore nell&apos;Apertura della Cartella %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>La cartella non esiste!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Errore nell&apos;Apertura della Cache Shader Trasferibile</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Contenuti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Aggiorna</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Rimuovi voce</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Rimuovere i giochi installati %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Rimosso con successo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Rimosso con successo il gioco base installato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Errore durante la rimozione %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Il gioco base non è installato su NAND e non può essere rimosso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Aggiornamento rimosso on successo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Non c&apos;è alcun aggiornamento installato per questo gioco.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Non c&apos;è alcun DLC installato per questo gioco.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Rimossi con successo %1 DLC installati.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Rimuovere la configurazione personalizzata del gioco?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Rimuovi file?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Errore rimuovendo la shader cache trasferibile.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Una cache di shader per questo titolo non esiste.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Rimossa con successo la shader cache trasferibile.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Impossibile rimuovere la cache dello shader trasferibile.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Errore rimuovendo la configurazione personalizzata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Una configurazione personalizzata per questo gioco non esiste.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Rimossa con successo la configurazione personalizzata del gioco.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Impossibile rimuovere la configurazione personalizzata del gioco</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Estrazione RomFS Fallita!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>C&apos;è stato un errore nella copia dei file del RomFS o l&apos;operazione è stata annullata dall&apos;utente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Completa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Scheletro.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Seleziona Modalità Estrazione RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Seleziona come vorresti estrarre il RomFS. &lt;br&gt;Completo copierà tutti i file in una nuova cartella mentre&lt;br&gt;scheletro creerà solamente le cartelle e le sottocartelle.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Estrazione RomFS in corso...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Estrazione RomFS Riuscita!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>L&apos;operazione è stata completata con successo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Errore nell&apos;Apertura di %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Seleziona Cartella</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Proprietà</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Le proprietà del gioco non sono potute essere caricate.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Eseguibile Switch (%1);;Tutti i File (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Carica File</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Apri Cartella ROM Estratta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Cartella Selezionata Non Valida</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>La cartella che hai selezionato non contiene un file &quot;main&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>File installabili Switch (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Installa files</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Installazione del file &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Installa risultati</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Per evitare possibli conflitti, scoraggiamo gli utenti dall&apos;installare giochi base su NAND.
Per favore, usare questa funzione solo per installare aggiornamenti e DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Applicazione di Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Archivio di Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Aggiornamento Applicazione di Sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Pacchetto Firmware (Tipo A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Pacchetto Firmware (Tipo B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Gioco</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Aggiornamento di Gioco</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>DLC Gioco</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Titolo Delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Seleziona il Tipo di Installazione NCA</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Seleziona il tipo del file NCA da installare:
(Nella maggior parte dei casi, il predefinito &apos;Gioco&apos; va bene.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Installazione Fallita</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Il tipo che hai selezionato per l&apos;NCA non è valido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>File non trovato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>File &quot;%1&quot; non trovato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Continua</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Account di yuzu non trovato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Per segnalare la compatibilità di un gioco, devi collegare il tuo account yuzu. &lt;br&gt;&lt;br/&gt;Per collegare il tuo account yuzu, vai su Emulazione &amp;gt;
Configurazione &amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Errore aprendo l&apos;URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Impossibile aprire l&apos;URL &quot;% 1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Vuoi sovrascrivere lo script del giocatore 1?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>File Amiibo (%1);; Tutti I File (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Carica Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Errore nell&apos;apertura del file dati Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Impossibile aprire e leggere il file Amiibo &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Errore nella lettura dei dati del file Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Impossibile leggere tutti i dati dell&apos;Amiibo. E&apos; stato possibile leggere solamente %2 byte di %1.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Errore nel caricamento dei dati dell&apos;Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Impossibile caricare i dati dell&apos;Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Cattura Screenshot</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Immagine PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Velocità: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Velocità: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Gioco: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Frame: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Il gioco che stai provando a caricare richiede ulteriori file che devono essere estratti dalla tua Switch prima di poter giocare. &lt;br/&gt;&lt;br/&gt;Per maggiori informazioni sull&apos;estrazione di questi file, visualizza la seguente pagina della wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Estrazione di Archivi di Sistema e Font Condivisi da una Console Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vuoi uscire e tornare alla lista dei giochi? Continuare l&apos;emulazione potrebbe risultare in crash, salvataggi corrotti o altri bug.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu non ha potuto individuare un archivio di sistema della Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu non ha potuto individuare un archivio di sistema della Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Archivio di Sistema Non Trovato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Archivio di Sistema Mancante</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu non ha potuto individuare i font condivisi della Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Font Condivisi Non Trovati</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Font Condivisi Mancanti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Errore Fatale</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu ha riscontrato un errore fatale, visualizza il log per maggiori dettagli. Per maggiori informazioni su come accedere al log, visualizza la seguente pagina: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Come Caricare Il File Log&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vuoi uscire e tornare alla lista dei giochi? Continuare l&apos;emulazione potrebbe risultare in crash, salvataggi corrotti o altri bug.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Errore Fatale riscontrato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Conferma Riderivazione Chiave</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4443,37 +4577,37 @@ e facoltativamente fai dei backup.
Questo eliminerà i tuoi file di chiavi autogenerati e ri-avvierà il processo di derivazione delle chiavi.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Fusi mancanti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - Manca BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Manca BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- Manca PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Componenti di derivazione mancanti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Mancano componenti che potrebbero impedire il completamento della derivazione della chiave. &lt;br&gt;Segui &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;la guida rapida di yuzu&lt;/a&gt; per ottenere tutte le chiavi e i giochi.&lt;br&gt;&lt;br&gt;&lt;small&gt;(% 1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4482,39 +4616,39 @@ Questa operazione potrebbe durare fino a un minuto in
base alle prestazioni del tuo sistema.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Derivazione Chiavi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Seleziona Target dell&apos;Estrazione del RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Seleziona quale RomFS vorresti estrarre.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Sei sicuro di voler chiudere yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Sei sicuro di voler fermare l&apos;emulazione? Tutti i progressi non salvati verranno perduti.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4526,38 +4660,38 @@ Desideri uscire comunque?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL non disponibile!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu non è stato compilato con il supporto OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Errore durante l&apos;inizializzazione di OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>La tua GPU potrebbe non supportare OpenGL, o non hai installato l&apos;ultima versione dei driver video.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Errore durante l&apos;inizializzazione di OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>La tua GPU potrebbe non supportare una o più estensioni OpenGL richieste. Assicurati di avere gli ultimi driver grafici.&lt;br&gt;&lt;br&gt;Estensioni non supportate:&lt;br&gt;</translation>
</message>
@@ -4915,190 +5049,205 @@ Iniziale.</translation>
<translation>&amp;Emulazione</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Visualizza</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>Debugging</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Ripristina le dimensioni della finestra a &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Ripristina le dimensioni della finestra a 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Ripristina le dimensioni della finestra a &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Ripristina le dimensioni della finestra a 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>Debugging</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>Strumenti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Aiuto</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>Installa i file su NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>Carica File...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>Carica Cartella...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>&amp;Esci</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Avvia</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pausa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>Ri-inizializzando le chiavi...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>Riguardo yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>Modalità Finestra Singola</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>Configura...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>Visualizza le Intestazioni del Dock dei Widget</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>Mostra Barra Filtri</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>Mostra Barra Stato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Mostra Barra Stato</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>Schermo intero</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Riavvia</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Carica &amp;Amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Segnala la Compatibilità</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Apri la pagina delle mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>Apri la guida rapida</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>Domande frequenti</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Apri la cartella di yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>Cattura schermo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Configura il gioco in uso..</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Avvia</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5144,10 +5293,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>INIZIA/INTERROMPI</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5178,142 +5332,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[non impostato]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hat %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Asse %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Pulsante %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[sconosciuto]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clicca 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clicca 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clicca 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clicca 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clicca 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Assi GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Pulsanti GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Mavimento %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>Movimento SDL</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Click %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[inutilizzato]</translation>
</message>
@@ -5354,7 +5588,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5367,7 +5601,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Doppi Joycon</translation>
</message>
@@ -5380,7 +5614,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Joycon Sinistro</translation>
</message>
@@ -5393,7 +5627,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Joycon Destro</translation>
</message>
@@ -5421,7 +5655,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Portatile</translation>
</message>
@@ -5542,7 +5776,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Controller GameCube</translation>
</message>
@@ -5636,13 +5870,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts
index aa8dbec5e..f641f99ed 100644
--- a/dist/languages/ja_JP.ts
+++ b/dist/languages/ja_JP.ts
@@ -656,7 +656,12 @@ p, li { white-space: pre-wrap; }
<translation>自動スタブの有効化**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**yuzuを終了したときに自動的にリセットされます.</translation>
</message>
@@ -936,67 +941,78 @@ p, li { white-space: pre-wrap; }
<translation>全般</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>エミュレーション速度の制限</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>マルチコアCPUエミュレーション</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>エミュレーション停止時に確認</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>ゲーム起動時に確認を表示</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>バックグラウンド時にエミュレーションを一時停止</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>非アクティブ時にマウスカーソルを隠す</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>すべての設定をリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation type="unfinished"/>
</message>
@@ -1114,18 +1130,113 @@ p, li { white-space: pre-wrap; }
<translation>ウィンドウに合わせる</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>共通設定を使用</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>背景色の設定:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>背景色:</translation>
</message>
@@ -1194,28 +1305,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>デフォルト</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (破綻の可能性あり)</translation>
+ <source>Default</source>
+ <translation>デフォルト</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (破綻の可能性あり)</translation>
+ <source>2x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (破綻の可能性あり)</translation>
+ <source>4x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (破綻の可能性あり)</translation>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1542,8 +1658,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>その他</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1552,499 +1668,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>キーボードでアナログ入力をエミュレート</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>マウス感度</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>高度な設定</translation>
+ <source>Mouse</source>
+ <translation>マウス</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>タッチスクリーン</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>マウス</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>高度な設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>モーション / タッチ</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>デバッグ用コントローラ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>デバッグ用コントローラ</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>その他</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>キーボードでアナログ入力をエミュレート</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>yuzuの再起動が必要</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>XInput 8プレイヤーサポートの有効化 (webアプレットの無効化)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>入力設定</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>有効</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Proコントローラ</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>マウス感度</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Joy-Con(L/R)</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joy-Con(L)</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>モーション / タッチ</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joy-Con(R)</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>入力設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>携帯モード</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>有効</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>入力デバイス</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>すべての入力デバイス</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>キーボード / マウス</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>プロファイル</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>保存</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>新規</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>削除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Lスティック</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>上</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>左</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>右</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>押下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>変更</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>範囲</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>デッドゾーン:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>変更範囲:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>方向ボタン</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>-</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>キャプチャー</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>+</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>HOME</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>モーション1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>モーション2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>ABXYボタン</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Rスティック</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>クリア</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[未設定]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>軸を反転</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>しきい値を設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>0%から100%の間の値を選択してください</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>アナログスティックをマップ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>OKを押したあと, まずジョイスティックを水平方向に動かし, 次に垂直方向に動かしてください.
軸を反転させる場合は, 最初に垂直方向に動かし, 次に水平方向に動かしてください.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>軸を反転</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>デッドゾーン:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>変更範囲:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Proコントローラ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Joy-Con(L/R)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joy-Con(L)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joy-Con(R)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>携帯モード</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>ゲームキューブコントローラ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>Cスティック</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[待機中]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>新規プロファイル</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>プロファイル名を入力:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>入力プロファイルを作成</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>プロファイル名が無効です!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>入力プロファイル &quot;%1&quot; の作成に失敗しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>入力プロファイルを削除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>入力プロファイル &quot;%1&quot; の削除に失敗しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>入力プロファイルをロード</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>入力プロファイル &quot;%1&quot; のロードに失敗しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>入力プロファイルをセーブ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>入力プロファイル &quot;%1&quot; のセーブに失敗しました</translation>
</message>
@@ -2070,85 +2211,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>モーション / タッチ設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>マウスモーション</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>感度:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>タッチの設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>ボタンマッピングを使用:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDPの設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>モーションとタッチの入力元として、Cemuhook互換のUDP入力ソースを使用します。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>サーバー:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>ポート:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>詳細情報</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>テスト</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>サーバを追加</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>サーバを削除</translation>
</message>
@@ -2158,146 +2289,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;詳細情報&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>ポート番号に無効な文字が含まれています</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>ポート番号は0から65353の間で設定してください</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IPアドレスが無効です</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>このUDPサーバはすでに存在してます</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>8個以上のサーバを追加することはできません</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>テスト中...</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>設定中...</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>テスト成功</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>サーバーからのデータ受信に成功しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>テスト失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>有効なデータを受信できませんでした。&lt;br&gt;サーバーが正しくセットアップされ、アドレスとポートが正しいことを確認してください。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDPテストまたはキャリブレーション実行中です。&lt;br&gt;完了までお待ちください。</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>マウス設定</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>マウスボタン</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>進む:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>戻る:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>左:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>中央:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>右:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>消去</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>デフォルト</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[未設定]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>デフォルトに戻す</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[キーを入力]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3080,31 +3147,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>コントローラプロファイルを自動で切り替え</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>スクリプトを繰り返し実行</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>ロード中は実行を一時停止</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>スクリプトディレクトリ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>パス</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3117,7 +3179,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>TAS 設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>TAS ロードディレクトリを選択...</translation>
</message>
@@ -3179,37 +3241,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>新規プロファイル</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>プロファイル名を入力</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>プロファイルの削除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>プロファイル%1を削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>プロファイルのリネーム</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>新しいプロファイル名:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[キーを押す]</translation>
</message>
@@ -3629,12 +3691,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>コントローラ P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>コントローラ P1(&amp;C)</translation>
</message>
@@ -3642,90 +3704,95 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>yuzuを改善するための&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;匿名データが収集されました&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;統計情報データを共有しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>テレメトリ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Webアプレットをロード中...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Webアプレットの無効化</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>ビルド中のシェーダー数</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>現在のエミュレーション速度。値が100%より高いか低い場合、エミュレーション速度がSwitchより速いか遅いことを示します。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>ゲームが現在表示している1秒あたりのフレーム数。これはゲームごと、シーンごとに異なります。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Switchフレームをエミュレートするのにかかる時間で、フレームリミットやV-Syncは含まれません。フルスピードエミュレーションの場合、最大で16.67ミリ秒になります。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>無効な設定を検出しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>携帯コントローラはドックモードで使用できません. Proコントローラが選択されます.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>最近のファイルをクリア(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation> TAS 記録中</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>プレイヤー1のファイルを上書きしますか?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3776,659 +3843,726 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>不明なエラーが発生しました。詳細はログを確認して下さい。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>開始</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>データのセーブ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Modデータ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>”%1”フォルダを開けませんでした</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>フォルダが存在しません!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>シェーダキャッシュを開けませんでした</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>このタイトル用のシェーダキャッシュディレクトリの作成に失敗しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>コンテンツ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>アップデート</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>エントリ削除</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>インストールされているゲーム%1を削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>削除しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>インストールされたゲームを正常に削除しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>%1削除エラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>ゲームはNANDにインストールされていないため、削除できません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>インストールされたアップデートを正常に削除しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>このタイトルのアップデートはインストールされていません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>このタイトルにはDLCがインストールされていません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>%1にインストールされたDLCを正常に削除しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>転送可能なOpenGLシェーダキャッシュを削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>転送可能なVulkanシェーダキャッシュを削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>転送可能なすべてのシェーダキャッシュを削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>カスタムゲーム設定を削除しますか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>ファイル削除</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>転送可能なシェーダーキャッシュの削除エラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>このタイトル用のシェーダキャッシュは存在しません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>転送可能なシェーダーキャッシュが正常に削除されました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>転送可能なシェーダーキャッシュを削除できませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>転送可能なシェーダキャッシュの削除エラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>転送可能なシェーダキャッシュを正常に削除しました.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>転送可能なシェーダキャッシュディレクトリの削除に失敗しました.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>カスタム設定の削除エラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>このタイトルのカスタム設定は存在しません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>カスタムゲーム設定を正常に削除しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>カスタムゲーム設定の削除に失敗しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFSの解析に失敗しました!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>RomFSファイルをコピー中にエラーが発生したか、ユーザー操作によりキャンセルされました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>フル</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>スケルトン</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>RomFSダンプモードの選択</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>RomFSのダンプ方法を選択してください。&lt;br&gt;”完全”はすべてのファイルが新しいディレクトリにコピーされます。&lt;br&gt;”スケルトン”はディレクトリ構造を作成するだけです。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>RomFSを解析中...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>キャンセル</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS解析成功!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>操作は成功しました。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>”%1”を開けませんでした</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>ディレクトリの選択</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>プロパティ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>ゲームプロパティをロード出来ませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch実行ファイル (%1);;すべてのファイル (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>ファイルのロード</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>展開されているROMディレクトリを開く</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>無効なディレクトリが選択されました</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>選択されたディレクトリに”main”ファイルが見つかりませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>インストール可能なスイッチファイル (*.nca *.nsp *.xci);;任天堂コンテンツアーカイブ (*.nca);;任天堂サブミッションパッケージ (*.nsp);;NXカートリッジイメージ (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>ファイルのインストール</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>&quot;%1&quot;ファイルをインストールしています・・・</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>インストール結果</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n ファイルが新たにインストールされました
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n ファイルが上書きされました
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n ファイルのインストールに失敗しました
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>システムアプリケーション</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>システムアーカイブ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>システムアプリケーションアップデート</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>ファームウェアパッケージ(Type A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>ファームウェアパッケージ(Type B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>ゲーム</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>ゲームアップデート</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>ゲームDLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>差分タイトル</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>NCAインストール種別を選択・・・</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>インストールするNCAタイトル種別を選択して下さい:
(ほとんどの場合、デフォルトの”ゲーム”で問題ありません。)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>インストール失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>選択されたNCAのタイトル種別が無効です。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>ファイルが存在しません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>ファイル”%1”が存在しません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>yuzuアカウントが存在しません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>ゲームの互換性テストケースを送信するには、yuzuアカウントをリンクする必要があります。&lt;br&gt;&lt;br/&gt;yuzuアカウントをリンクするには、エミュレーション > 設定 > Web から行います。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>URLオープンエラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>URL&quot;%1&quot;を開けません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation> TAS 記録中</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>プレイヤー1のファイルを上書きしますか?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>amiiboファイル (%1);;すべてのファイル (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>amiiboのロード</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>amiiboデータファイルを開けませんでした</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>amiiboデータファイル”%1”を読み込めませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>amiiboデータファイルを読み込み中にエラーが発生した</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>amiiboデータを完全には読み取ることができませんでした。%1バイトを読み込もうとしましたが、%2バイトしか読み取れませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>amiiboデータ読み込み中にエラーが発生しました</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>amiiboデータをロードできませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>スクリーンショットのキャプチャ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG画像 (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>TAS 状態: 実行中 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>TAS 状態: 記録中 %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation>TAS 状態: アイドル %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>TAS 状態: 無効</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>構築中: %n シェーダー</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>速度:%1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>速度:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>ゲーム:%1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>フレーム:%1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU HIGH</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTREME</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU ERROR</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>ロードしようとしているゲームはプレイする前に、追加のファイルを必要とします。それはSwitchからダンプする必要があります。&lt;br/&gt;&lt;br/&gt;これらのファイルのダンプの詳細については、次のWikiページを参照してください:&lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;スイッチコンソールからのシステムアーカイブと共有フォントをダンプする&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;ゲームリストに戻りますか?エミュレーションを続けると、クラッシュ、保存データの破損、またはその他のバグが発生する可能性があります。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzuはSwitchのシステムアーカイブ &quot;%1&quot; を見つけられませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzuはSwitchのシステムアーカイブ &quot;%1&quot; &quot;%2&quot; を見つけられませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>システムアーカイブが見つかりません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>システムアーカイブが見つかりません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzuはSwitchの共有フォント &quot;%1&quot; を見つけられませんでした。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>共有フォントが存在しません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>共有フォントが存在しません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>致命的なエラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzuが致命的なエラーを検出しました。詳細については、ログを参照してください。ログへのアクセスの詳細については、次のページを参照してください。&lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;ログファイルをアップロードする方法&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;ゲームリストに戻りますか?エミュレーションを続けると、クラッシュ、保存データの破損、またはその他のバグが発生する可能性があります。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>致命的なエラー発生</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>キーの再取得確認</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4445,37 +4579,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
これにより、自動生成されたキーファイルが削除され、キー導出モジュールが再実行されます。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>ヒューズがありません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - BOOT0がありません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - BCPKG2-1-Normal-Mainがありません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - PRODINFOがありません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>派生コンポーネントがありません</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>コンポーネントが見つからず、キーの導出が完了しない可能性があります。&lt;br&gt;ゲームとキーを取得するために、&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzuクイックスタートガイド&lt;/a&gt;の手順に従って下さい。&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4484,39 +4618,39 @@ on your system&apos;s performance.</source>
1分以上かかります。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>派生キー</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>RomFSダンプターゲットの選択</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>ダンプしたいRomFSを選択して下さい。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>yuzuを終了してもよろしいですか?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>エミュレーションを停止してもよろしいですか?セーブされていない進行状況は失われます。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4528,38 +4662,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGLは使用できません!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzuはOpenGLサポート付きでコンパイルされていません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>OpenGL初期化エラー</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>GPUがOpenGLをサポートしていないか、グラフィックスドライバーが最新ではありません。</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>OpenGL4.6初期化エラー!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>GPUがOpenGL4.6をサポートしていないか, グラフィックスドライバーが最新ではありません.&lt;br&gt;&lt;br&gt;GL レンダラ:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>GPUが1つ以上の必要なOpenGL拡張機能をサポートしていない可能性があります. 最新のグラフィックドライバを使用していることを確認してください.&lt;br&gt;&lt;br&gt;GL レンダラ:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;サポートされていない拡張機能:&lt;br&gt;%2</translation>
</message>
@@ -4916,190 +5050,205 @@ Screen.</source>
<translation>エミュレーション(&amp;E)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>表示(&amp;V)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>ウインドウサイズをリセット(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>デバッグ(&amp;D)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>ウインドウサイズを&amp;720Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>ウインドウサイズを720Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>ウインドウサイズを&amp;900Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>ウインドウサイズを900Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>ウインドウサイズを&amp;1080Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>ウインドウサイズを1080Pにリセット</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>デバッグ(&amp;D)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>ツール(&amp;T)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>ヘルプ(&amp;H)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>ファイルをNANDにインストール...(&amp;I)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>ファイルをロード...(&amp;L)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>フォルダをロード...(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>終了(&amp;E)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>実行(&amp;S)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>中断(&amp;P)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>停止(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>鍵を再初期化...(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>yuzuについて(&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>シングルウインドウモード(&amp;W)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>設定...(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>ドックウィジェットヘッダの表示(&amp;O)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>フィルタバーを表示(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>ステータスバーを表示(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>ステータスバーの表示</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>全画面表示(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>再実行(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>&amp;Amiiboをロード...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>互換性を報告(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>&amp;Modページを開く</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>クイックスタートガイドを開く(&amp;Q)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;FAQ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>&amp;yuzuフォルダを開く</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>スクリーンショットをキャプチャ(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>&amp;TASを設定...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>現在のゲームを設定...(&amp;U)</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>実行(&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5141,10 +5290,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5175,142 +5329,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[未設定]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>十字キー %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>軸 %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>ボタン %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[不明]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>クリック0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>クリック1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>クリック2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>クリック3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>クリック4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Axis %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC ボタン %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>モーション %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1ボタン %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDLモーション</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[未使用]</translation>
</message>
@@ -5351,7 +5585,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Proコントローラ</translation>
</message>
@@ -5364,7 +5598,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Joy-Con(L/R)</translation>
</message>
@@ -5377,7 +5611,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Joy-Con(L)</translation>
</message>
@@ -5390,7 +5624,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Joy-Con(R)</translation>
</message>
@@ -5418,7 +5652,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>携帯モード</translation>
</message>
@@ -5539,7 +5773,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>ゲームキューブコントローラ</translation>
</message>
@@ -5628,13 +5862,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>キャンセル</translation>
</message>
diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts
index 10bfd647d..ddd450583 100644
--- a/dist/languages/ko_KR.ts
+++ b/dist/languages/ko_KR.ts
@@ -658,7 +658,12 @@ p, li { white-space: pre-wrap; }
<translation>자동 스텁 활성화**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Yuzu가 종료되면 자동으로 재설정됩니다.</translation>
</message>
@@ -938,67 +943,78 @@ p, li { white-space: pre-wrap; }
<translation>일반</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>프레임 속도 제한</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation>사용하려면 FPS Limiter Toggle 핫키를 사용해야 합니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>프레임 속도 제한</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>속도 퍼센트 제한</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>멀티 코어 CPU 에뮬레이션</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>에뮬레이터가 작동 중일 때 종료 시 확인</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>게임 부팅시 유저 선택 화면 표시</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>백그라운드에 있을 시 에뮬레이션 일시중지</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>비활성 상태일 때 마우스 숨기기</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>모든 설정 초기화</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>모든 환경 설정과 게임별 맞춤 설정이 초기화됩니다. 게임 디렉토리나 프로필, 또는 입력 프로필은 삭제되지 않습니다. 진행하시겠습니까?</translation>
</message>
@@ -1116,18 +1132,113 @@ p, li { white-space: pre-wrap; }
<translation>창에 맞게 늘림</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>전역 배경색 사용</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>배경색 설정:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>배경색:</translation>
</message>
@@ -1196,28 +1307,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>기본값</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (실행에 문제가 있을 수 있습니다)</translation>
+ <source>Default</source>
+ <translation>기본값</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (실행에 문제가 있을 수 있습니다)</translation>
+ <source>2x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (실행에 문제가 있을 수 있습니다)</translation>
+ <source>4x</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (실행에 문제가 있을 수 있습니다)</translation>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -1544,8 +1660,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>기타</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1554,499 +1670,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>키보드 입력으로 아날로그 입력 에뮬레이션</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>마우스 패닝 활성화</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>마우스 감도</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>고급</translation>
+ <source>Mouse</source>
+ <translation>마우스</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>터치 스크린</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>마우스</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>고급</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>모션 컨트롤/ 터치</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>디버그 컨트롤러</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>디버그 컨트롤러</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>기타</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>키보드 입력으로 아날로그 입력 에뮬레이션</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>yuzu를 다시 시작해야 합니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>XInput 8 플레이어 지원 활성화(웹 애플릿 비활성화)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>입력 설정</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>컨트롤러 연결</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>마우스 패닝 활성화</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>프로 컨트롤러</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>마우스 감도</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>듀얼 조이콘</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>왼쪽 조이콘</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>모션 컨트롤/ 터치</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>오른쪽 조이콘</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>입력 설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>휴대</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>컨트롤러 연결</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>입력 장치</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>모든 장치</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>키보드/마우스</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>프로필</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>저장</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>새로 생성</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>삭제</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>L 스틱</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>위쪽</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>왼쪽</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>오른쪽</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>아래쪽</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>누르기</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>수정자</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>범위</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>데드존: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>수정자 범위: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-패드</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>-</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>캡쳐</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>+</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>홈</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>모션 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>모션 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>A/B/X/Y버튼</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>R 스틱</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>초기화</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[설정 안 됨]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>토글 버튼</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>축 뒤집기</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>임계값 설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>0%에서 100% 안의 값을 고르세요</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>아날로그 스틱 맵핑</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>OK 버튼을 누른 후에 먼저 조이스틱을 수평으로 움직이고, 그 다음 수직으로 움직이세요.
축을 뒤집으려면 수직으로 먼저 움직인 뒤에 수평으로 움직이세요.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>축 뒤집기</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>데드존: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>수정자 범위: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>프로 컨트롤러</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>듀얼 조이콘</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>왼쪽 조이콘</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>오른쪽 조이콘</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>휴대</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube 컨트롤러</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>시작 / 일시 정지</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>컨트롤 스틱</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>흔드세요!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[대기중]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>새 프로필</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>프로필 이름을 입력하세요:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>입력 프로필 생성</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>해당 프로필 이름은 사용할 수 없습니다!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; 입력 프로필 생성 실패</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>입력 프로필 삭제</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; 입력 프로필 삭제 실패</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>입력 프로필 불러오기</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; 입력 프로필 불러오기 실패</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>입력 프로필 저장</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; 입력 프로필 저장 실패</translation>
</message>
@@ -2072,85 +2213,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>모션 설정 / 터치</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>마우스 모션</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>감도:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>터치</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP 조정:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>버튼 매핑 사용:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP 설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Cemuhook 호환이 가능한 모든 UDP 인풋 장치를 모션 컨트롤과 터치 입력용으로 사용할 수 있습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>서버:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>포트:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>자세히 알아보기</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>테스트</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>서버 추가</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>원격 서버</translation>
</message>
@@ -2160,146 +2291,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;자세히 알아보기&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>포트 번호에 유효하지 않은 글자가 있습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>포트 번호는 0부터 65353까지이어야 합니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP 주소가 유효하지 않습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>해당 UDP 서버는 이미 존재합니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>8개보다 많은 서버를 추가하실 수는 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>테스트 중</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>설정 중</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>테스트 성공</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>서버에서 성공적으로 데이터를 받았습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>테스트 실패</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>서버에서 유효한 데이터를 수신할 수 없습니다.&lt;br&gt;서버가 올바르게 설정되어 있고 주소와 포트가 올바른지 확인하십시오.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP 테스트와 교정 설정이 진행 중입니다.&lt;br&gt;끝날 때까지 기다려주세요.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>마우스 설정</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>마우스 버튼</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>앞:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>뒤:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>왼쪽:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>중앙:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>오른쪽:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>비우기</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>기본값</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[설정 안됨]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>초기화</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[키 입력]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -2402,7 +2469,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>고급 그래픽</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2586,12 +2653,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>사용자 이미지 크기 조정 오류</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>이미지 크기를 조정할 수 없습니다</translation>
</message>
</context>
<context>
@@ -3058,12 +3125,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;TAS-nx 스크립트와 동일한 형식의 스크립트에서 컨트롤러 입력을 읽습니다.&lt;br/&gt;더 자세한 설명은 yuzu 웹사이트에 있는 &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt;를 참조하세요.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
<source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
- <translation type="unfinished"/>
+ <translation>재생/녹화를 제어하는 ​​단축키를 확인하려면 단축키 설정(설정 -&gt; 일반 -&gt; 단축키)을 참조하십시오.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
@@ -3082,31 +3149,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>자동 컨트롤러 프로필 교체</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>반복 스크립트</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>로드 중 실행 일시 중지</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>스크립트 주소</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>주소</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3119,7 +3181,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>TAS 설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>TAS 로드 디렉토리 선택...</translation>
</message>
@@ -3181,37 +3243,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>새 프로필</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>새 프로필의 이름을 적으시오.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>프로필 삭제하기</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>%1 프로필을 삭제하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>프로필 이름 재설정</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>새 이름:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[키 입력]</translation>
</message>
@@ -3631,12 +3693,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>컨트롤러 P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>컨트롤러 P1(&amp;C)</translation>
</message>
@@ -3644,90 +3706,95 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>yuzu를 개선하기 위해 &lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;익명 데이터가 수집됩니다.&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;사용 데이터를 공유하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>원격 측정</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>웹 애플릿을 로드하는 중...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>웹 애플릿 비활성화</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>웹 애플릿을 비활성화할 시 앞으로 에뮬레이트할 때 해당 화면이 더 이상 뜨지 않습니다. 이는 알 수 없는 문제를 일으킬 수 있으며 Super Mario 3D All-Stars에만 사용해야 합니다. 웹 애플릿을 정말로 비활성화 하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>현재 생성중인 셰이더의 양</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>현재 에뮬레이션 속도. 100%보다 높거나 낮은 값은 에뮬레이션이 Switch보다 빠르거나 느린 것을 나타냅니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>게임이 현재 표시하고 있는 초당 프레임 수입니다. 이것은 게임마다 다르고 장면마다 다릅니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>프레임 제한이나 수직 동기화를 계산하지 않고 Switch 프레임을 에뮬레이션 하는 데 걸린 시간. 최대 속도로 에뮬레이트 중일 때에는 대부분 16.67 ms 근처입니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>유효하지 않은 설정 감지</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>휴대 모드용 컨트롤러는 거치 모드에서 사용할 수 없습니다. 프로 컨트롤러로 대신 선택됩니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>거치 모드</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>Clear Recent Files(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>TAS 레코딩</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>계속(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>플레이어 1의 파일을 덮어쓰시겠습니까?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3778,660 +3845,727 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참고하십시오.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64비트)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32비트)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>시작</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>세이브 데이터</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>모드 데이터</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>%1 폴더 열기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>폴더가 존재하지 않습니다!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>전달 가능한 셰이더 캐시 열기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>이 타이틀에 대한 셰이더 캐시 디렉토리를 생성하지 못했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>컨텐츠</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>업데이트</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>항목 제거</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>설치된 게임을 삭제 %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>삭제 완료</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>설치된 기본 게임을 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>삭제 중 오류 발생 %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>기본 게임은 NAND에 설치되어 있지 않으며 제거 할 수 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>설치된 업데이트를 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>이 타이틀에 대해 설치된 업데이트가 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>이 타이틀에 설치된 DLC가 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>설치된 %1 DLC를 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>OpenGL 전송 가능한 셰이더 캐시를 삭제하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Vulkan 전송 가능한 셰이더 캐시를 삭제하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>모든 전송 가능한 셰이더 캐시를 삭제하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>사용자 지정 게임 구성을 제거 하시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>파일 제거</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>전달 가능한 셰이더 캐시 제거 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>이 타이틀에 대한 셰이더 캐시가 존재하지 않습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>전달 가능한 셰이더 캐시를 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>전송 가능한 셰이더 캐시를 제거하지 못했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>전송 가능한 셰이더 캐시 제거 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>전송 가능한 셰이더 캐시를 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>전송 가능한 셰이더 캐시 디렉토리를 제거하지 못했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>사용자 지정 구성 제거 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>이 타이틀에 대한 사용자 지정 구성이 존재하지 않습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>사용자 지정 게임 구성을 성공적으로 제거했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>사용자 지정 게임 구성을 제거하지 못했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS 추출 실패!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>전체</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>뼈대</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>RomFS 덤프 모드 선택</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>RomFS 덤프 방법을 선택하십시오.&lt;br&gt;전체는 모든 파일을 새 디렉토리에 복사하고&lt;br&gt;뼈대는 디렉토리 구조 만 생성합니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation>%1에 RomFS를 추출하기에 충분한 여유 공간이 없습니다. 공간을 확보하거나 에뮬레이견 &gt; 설정 &gt; 시스템 &gt; 파일시스템 &gt; 덤프 경로에서 다른 덤프 디렉토리를 선택하십시오.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>RomFS 추출 중...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>취소</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS 추출이 성공했습니다!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>작업이 성공적으로 완료되었습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>%1 열기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>경로 선택</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>속성</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>게임 속성을 로드 할 수 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch 실행파일 (%1);;모든 파일 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>파일 로드</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>추출된 ROM 디렉토리 열기</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>잘못된 디렉토리 선택</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>선택한 디렉토리에 &apos;main&apos;파일이 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>설치 가능한 Switch 파일 (*.nca *.nsp *.xci);;Nintendo 컨텐츠 아카이브 (*.nca);;Nintendo 서브미션 패키지 (*.nsp);;NX 카트리지 이미지 (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>파일 설치</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>%n개의 파일이 남음</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>파일 &quot;%1&quot; 설치 중...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>설치 결과</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>충돌을 피하기 위해, 낸드에 베이스 게임을 설치하는 것을 권장하지 않습니다.
이 기능은 업데이트나 DLC를 설치할 때에만 사용해주세요.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n개의 파일이 새로 설치되었습니다.
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%%n개의 파일을 덮어썼습니다.
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n개의 파일을 설치하지 못했습니다.
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>시스템 애플리케이션</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>시스템 아카이브</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>시스템 애플리케이션 업데이트</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>펌웨어 패키지 (A타입)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>펌웨어 패키지 (B타입)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>게임</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>게임 업데이트</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>게임 DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>델타 타이틀</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>NCA 설치 유형 선택...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>이 NCA를 설치할 타이틀 유형을 선택하세요:
(대부분의 경우 기본값인 &apos;게임&apos;이 괜찮습니다.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>설치 실패</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>NCA 타이틀 유형이 유효하지 않습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>파일을 찾을 수 없음</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>파일 &quot;%1&quot;을 찾을 수 없습니다</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>계속(&amp;C)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>yuzu 계정 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>게임 호환성 테스트 결과를 제출하려면 yuzu 계정을 연결해야합니다.&lt;br&gt;&lt;br/&gt;yuzu 계정을 연결하려면 에뮬레이션 &amp;gt; 설정 &amp;gt; 웹으로 가세요.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>URL 열기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>URL &quot;%1&quot;을 열 수 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>TAS 레코딩</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>플레이어 1의 파일을 덮어쓰시겠습니까?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo 파일 (%1);; 모든 파일 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Amiibo 로드</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Amiibo 데이터 파일 열기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Amiibo 파일 &quot;%1&quot;을(를) 읽을 수 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Amiibo 데이터 파일 읽기 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Amiibo 데이터를 완전히 읽을 수 없습니다. %1 바이트를 읽으려고 했지만 %2 바이트만 읽을 수 있었습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Amiibo 데이터 로드 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Amiibo 데이터를 로드할 수 없습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>스크린샷 캡처</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG 이미지 (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>TAS 상태: %1/%2 실행 중</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>TAS 상태: 레코딩 %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation>TAS 상태: 유휴 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>TAS 상태: 유효하지 않음</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>빌드중: %n개 셰이더</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>속도: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>속도: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>게임: %1 FPS (제한없음)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>게임: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>프레임: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU 보통</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU 높음</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU 굉장함</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>해당 게임은 플레이하기 전에 Switch 기기에서 추가 파일을 덤프해야합니다.&lt;br/&gt;&lt;br/&gt;이러한 파일 덤프에 대한 자세한 내용은 다음 위키 페이지를 참조하십시오: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Switch 콘솔에서 시스템 아카이브 및 공유 글꼴 덤프&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;게임 목록으로 돌아가시겠습니까? 이를 무시하고 에뮬레이션을 계속하면 충돌, 저장 데이터 손상 또는 기타 버그가 발생할 수 있습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu가 Switch 시스템 아카이브를 찾을 수 없습니다. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu가 Switch 시스템 아카이브를 찾을 수 없습니다: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>시스템 아카이브를 찾을 수 없음</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>시스템 아카이브 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu가 Switch 공유 글꼴을 찾을 수 없습니다. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>공유 글꼴을 찾을 수 없음</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>공유 글꼴 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>치명적인 오류</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>치명적인 오류가 발생했습니다. 자세한 내용은 로그를 확인하십시오. 로그 액세스에 대한 자세한 내용은 다음 페이지를 참조하십시오: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;로그 파일을 업로드하는 방법&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;게임 목록으로 돌아가시겠습니까? 이를 무시하고 에뮬레이션을 계속하면 충돌, 저장 데이터 손상 또는 기타 버그가 발생할 수 있습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>치명적인 오류 발생</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>키 재생성 확인</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4448,37 +4582,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
자동 생성되었던 키 파일들이 삭제되고 키 생성 모듈이 다시 실행됩니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>퓨즈 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - BOOT0 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - BCPKG2-1-Normal-Main 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - PRODINFO 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>파생 구성 요소 누락</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>구성요소가 누락되어 키 파생이 완료되지 못할 수 있습니다. &lt;br&gt;모든 키와 게임을 얻으려면 &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu 빠른 시작 가이드&lt;/a&gt;를 참조하세요&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4487,39 +4621,39 @@ on your system&apos;s performance.</source>
소요될 수 있습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>파생 키</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>RomFS 덤프 대상 선택</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>덤프할 RomFS를 선택하십시오.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>yuzu를 닫으시겠습니까?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>에뮬레이션을 중지하시겠습니까? 모든 저장되지 않은 진행 상황은 사라집니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4531,38 +4665,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL을 사용할 수 없습니다!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu는 OpenGL 지원으로 컴파일되지 않았습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>OpenGL을 초기화하는 동안 오류가 발생했습니다!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>사용하시는 GPU가 OpenGL을 지원하지 않거나, 최신 그래픽 드라이버가 설치되어 있지 않습니다.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>OpenGL 4.6 초기화 중 오류 발생!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>사용하시는 GPU가 OpenGL 4.6을 지원하지 않거나 최신 그래픽 드라이버가 설치되어 있지 않습니다. &lt;br&gt;&lt;br&gt;GL 렌더링 장치:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>사용하시는 GPU가 1개 이상의 OpenGL 확장 기능을 지원하지 않습니다. 최신 그래픽 드라이버가 설치되어 있는지 확인하세요. &lt;br&gt;&lt;br&gt;GL 렌더링 장치:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;지원하지 않는 확장 기능:&lt;br&gt;%2</translation>
</message>
@@ -4924,190 +5058,205 @@ Screen.</source>
<translation>에뮬레이션(&amp;E)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>보기(&amp;V)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>창 크기 초기화 (&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>디버깅(&amp;D)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>창 크기를 720p로 맞추기(&amp;7)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>창 크기를 720p로 맞추기</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>창 크기를 900p로 맞추기(&amp;9)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>창 크기를 900p로 맞추기</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>창 크기를 1080p로 맞추기(&amp;1)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>창 크기를 1080p로 맞추기</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>디버깅(&amp;D)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>도구(&amp;T)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>도움말(&amp;H)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>낸드에 파일 설치(&amp;I)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>파일 불러오기...(&amp;L)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>폴더 불러오기...(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>종료(&amp;X)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>시작(&amp;S)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>일시중지(&amp;P)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>정지(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;키 재설정...(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>yuzu 정보(&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>싱글 창 모드(&amp;W)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>설정(&amp;f)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>독 위젯 헤더 표시(&amp;o)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>필터링 바 표시(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>상태 표시줄 보이기(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>상태 표시줄 보이기</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>전체 화면(&amp;u)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>재시작(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Amiibo 불러오기...(&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>호환성 보고(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>게임 모드 페이지 열기(&amp;M)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>빠른 시작 가이드 열기(&amp;Q)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>FAQ(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>yuzu 폴더 열기(&amp;y)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>스크린샷 찍기(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>TAS 설정...(&amp;T)</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>실행중인 게임 맞춤 설정...(&amp;u)</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>시작(&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5153,10 +5302,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>시작/일시 정지</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5187,142 +5341,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[설정 안 됨]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>방향키 %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>축 %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>버튼 %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[알 수 없음]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>클릭 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>클릭 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>클릭 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>클릭 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>클릭 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC 축 %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC 버튼 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>TAS Axis %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>TAS 버튼 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>모션 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1버튼 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL 모션</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1클릭 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[미사용]</translation>
</message>
@@ -5363,7 +5597,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>프로 컨트롤러</translation>
</message>
@@ -5376,7 +5610,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>듀얼 조이콘</translation>
</message>
@@ -5389,7 +5623,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>왼쪽 조이콘</translation>
</message>
@@ -5402,7 +5636,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>오른쪽 조이콘</translation>
</message>
@@ -5430,7 +5664,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>휴대 모드용</translation>
</message>
@@ -5551,7 +5785,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>GameCube 컨트롤러</translation>
</message>
@@ -5645,13 +5879,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>취소</translation>
</message>
diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts
index 22c002326..039816080 100644
--- a/dist/languages/nb.ts
+++ b/dist/languages/nb.ts
@@ -633,7 +633,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -913,67 +918,78 @@ p, li { white-space: pre-wrap; }
<translation>Generelt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Begrens Farts-Prosent</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Bekreft lukking mens emuleringen kjører</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pause emulasjon i bakgrunnen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Gjem mus under inaktivitet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation type="unfinished"/>
</message>
@@ -1091,18 +1107,113 @@ p, li { white-space: pre-wrap; }
<translation>Strekk til Vindu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Velg bakgrunnsfarge:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Bakgrunnsfarge:</translation>
</message>
@@ -1171,27 +1282,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Standard</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Standard</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1519,8 +1635,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Andre</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1529,66 +1645,75 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation type="unfinished"/>
+ <source>Mouse</source>
+ <translation>Mus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Touch-skjerm</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avansert</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Feilsøkingskontroller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avansert</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
+ <source>Configure</source>
+ <translation>Konfigurer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
- <source>Touchscreen</source>
- <translation>Touch-skjerm</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Andre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mus</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Bevegelse / Touch</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
+ <source>Requires restarting yuzu</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
- <source>Configure</source>
- <translation>Konfigurer</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
+ <source>Enable XInput 8 player support (disables web applet)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Feilsøkingskontroller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
- <source>Requires restarting yuzu</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
- <source>Enable XInput 8 player support (disables web applet)</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Bevegelse / Touch</translation>
+ </message>
</context>
<context>
<name>ConfigureInputPlayer</name>
@@ -1603,424 +1728,440 @@ p, li { white-space: pre-wrap; }
<translation>Tilkoble Kontroller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro-Kontroller</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Doble Joycons</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Venstre Joycon</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Høyre Joycon</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Håndholdt</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Tastatur/Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Lagre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Ny</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Slett</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Venstre Pinne</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Opp</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Venstre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Høyre</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Ned</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Trykket</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modifikator</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Område</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Dødsone: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modifikatorområde: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Pluss</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Hjem</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Frontknapper</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Høyre Pinne</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Dødsone: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modifikatorområde: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro-Kontroller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Doble Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Venstre Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Høyre Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Håndholdt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[venter]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
@@ -2046,85 +2187,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Konfigurer Bevegelse / Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensitivitet:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Konfigurer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP-Konfigurasjon</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Du kan bruke hvilken som helst Cemuhook-kompatibel UDP inputkilde for å gi bevegelses- og touch-input.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Lær Mer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation type="unfinished"/>
</message>
@@ -2134,146 +2265,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Lær Mer&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testing</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Konfigurering</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test Vellykket</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Mottatt data fra serveren vellykket.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test Feilet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Kunne ikke motta gyldig data fra serveren.&lt;br&gt;Vennligst bekreft at serveren er satt opp riktig og at adressen og porten er riktige.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP-Test eller kalibrasjonskonfigurering er i fremgang.&lt;br&gt;Vennligst vent for dem til å bli ferdig.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Konfigurer Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Museknapper</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Frem:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Tilbake:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Venstre:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Midten:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Høyre:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Fjern</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Standardverdier</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[ikke satt]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Gjenopprett Standardverdi</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[trykk på en knapp]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3056,31 +3123,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3093,7 +3155,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3154,37 +3216,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Ny Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Skriv inn navnet til den nye profilen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Slett Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Slett profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Endre Navn på Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nytt navn:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[trykk knapp]</translation>
</message>
@@ -3604,12 +3666,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation type="unfinished"/>
</message>
@@ -3617,89 +3679,94 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonym data blir samlet inn&lt;/a&gt;for å hjelpe til med å forbedre yuzu.&lt;br/&gt;&lt;br/&gt;Vil du dele din bruksdata med oss?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetri</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Nåværende emuleringshastighet. Verdier høyere eller lavere en 100% indikerer at emuleringen kjører raskere eller tregere enn en Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Hvor mange bilder per sekund spiller viser. Dette vil variere fra spill til spill og scene til scene.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tid det tar for å emulere et Switch bilde. Teller ikke med bildebegrensing eller v-sync. For full-hastighet emulering burde dette være 16.67 ms. på det høyeste.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3751,656 +3818,723 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>En ukjent feil oppstod. Se loggen for flere detaljer.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Lagre Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Feil Under Åpning av %1 Mappen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Mappen eksisterer ikke!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Innhold</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Oppdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Fjern Installert Spill %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Feil Under Fjerning av %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Grunnspillet er ikke installert i NAND og kan ikke bli fjernet.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Fjernet vellykket den installerte oppdateringen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Det er ingen oppdatering installert for denne tittelen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Det er ingen DLC installert for denne tittelen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Fjernet vellykket %1 installerte DLC-er.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Fjern Tilpasset Spillkonfigurasjon?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Fjern Fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Feil Under Fjerning Av Overførbar Shader Cache</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Fjernet vellykket den overførbare shader cachen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Feil under fjerning av den overførbare shader cachen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Feil Under Fjerning Av Tilpasset Konfigurasjon</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>En tilpasset konfigurasjon for denne tittelen finnes ikke.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Fjernet vellykket den tilpassede spillkonfigurasjonen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Feil under fjerning av den tilpassede spillkonfigurasjonen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Utvinning av RomFS Feilet!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Det oppstod en feil under kopiering av RomFS filene eller så kansellerte brukeren operasjonen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Fullstendig</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Skjelett</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Velg RomFS Dump Modus</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Velg hvordan du vil dumpe RomFS.&lt;br&gt;Fullstendig vil kopiere alle filene til en ny mappe mens &lt;br&gt;skjelett vil bare skape mappestrukturen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Utvinner RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS Utpakking lyktes!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Operasjonen fullført vellykket.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Feil ved åpning av %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Velg Mappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Egenskaper</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Spillets egenskaper kunne ikke bli lastet inn.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch Kjørbar Fil (%1);;Alle Filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Last inn Fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Åpne Utpakket ROM Mappe</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Ugyldig Mappe Valgt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Mappen du valgte inneholder ikke en &apos;main&apos; fil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Installerbar Switch-Fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xcI)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Installer Filer</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Installerer fil &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Insallasjonsresultater</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systemapplikasjon</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systemarkiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systemapplikasjonsoppdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Firmware Pakke (Type A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Firmware-Pakke (Type B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Spill</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Spilloppdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Spill tilleggspakke</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Tittel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Velg NCA Installasjonstype...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Vennligst velg typen tittel du vil installere denne NCA-en som:
(I de fleste tilfellene, standarden &apos;Spill&apos; fungerer.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Feil under Installasjon</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Titteltypen du valgte for NCA-en er ugyldig.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Fil ikke funnet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Filen &quot;%1&quot; ikke funnet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Mangler yuzu Bruker</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>For å sende inn et testtilfelle for spillkompatibilitet, må du linke yuzu-brukeren din.&lt;br&gt;&lt;br/&gt;For å linke yuzu-brukeren din, gå til Emulasjon &amp;gt; Konfigurasjon &amp;gt; Nett.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Feil under åpning av URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Kunne ikke åpne URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo-Fil (%1);; Alle Filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Last inn Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Feil ved Åpning av Amiibo data fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Kunne ikke åpne Amiibo-fil &quot;%1&quot; for lesing.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Feil under lesing av Amiibo datafil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Kunne ikke lese all Amiibo-data. Forventet å lese minst %1 bytes, men kunne bare lese %2 bytes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Feil ved lasting av Amiibo data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Kunne ikke laste Amiibo-data.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Ta Skjermbilde</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG Bilde (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Hastighet: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Hastighet: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Spill: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Ramme: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Spillet du prøver å laste krever at ekstra filer fra din Switch blir dumpet før du spiller.&lt;br/&gt;&lt;br/&gt;For mer informasjon om dumping av disse filene, vennligst se den følgende wiki-siden: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping av System-Arkiv og Shared Fonts fra en Switch-Konsoll&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vil du gå tilbake til spillisten? Fortsetting av emulasjon kan føre til krasjing, ødelagt lagringsdata, eller andre feil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu kunne ikke finne et Switch system-arkiv. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu kunne ikke finne et Switch system-arkiv: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>System Arkiv Ikke Funnet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>System Arkiv Mangler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu kunne ikke finne Switch shared fonts. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Shared Fonts Ikke Funnet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Shared Font Mangler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Fatal Feil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu har oppdaget en fatal feil, vennligst se loggen for flere detaljer. For mer informasjon om å finne loggen, vennligst se den følgende siden: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Hvordan å Laste Opp Log-Filen&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vil du gå tilbake til spillisten? Fortsetting av emulasjon kan føre til krasjing, ødelagt lagringsdata, eller andre feil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Fatal Feil oppstått</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Bekreft Nøkkel-Redirevasjon</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4417,37 +4551,37 @@ og eventuelt lag backups.
Dette vil slette dine autogenererte nøkkel-filer og kjøre nøkkel-derivasjonsmodulen på nytt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Mangler fuses</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- Mangler BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- Mangler BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- Mangler PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Derivasjonskomponenter Mangler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Komponenter som kan hindre nøkkel-derivasjon fra å fullføre mangler.&lt;br&gt;Vennligst følg &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu quickstart-guiden&lt;/a&gt; for å få alle dine nøkler og spill.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4456,39 +4590,39 @@ Dette kan ta opp til et minutt avhengig
av systemytelsen din.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Deriverer Nøkler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Velg RomFS Dump-Mål</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Vennligst velg hvilken RomFS du vil dumpe.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Er du sikker på at du vil lukke yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Er du sikker på at du vil stoppe emulasjonen? All ulagret fremgang vil bli tapt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4498,38 +4632,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL ikke tilgjengelig!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu har ikke blitt kompilert med OpenGL-støtte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Feil under initialisering av OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4885,190 +5019,205 @@ Screen.</source>
<translation>&amp;Emulering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Vis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
- <source>&amp;Tools</source>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Hjelp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>&amp;Avslutt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5110,10 +5259,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5144,142 +5298,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[ikke satt]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hatt %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Akse %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Knapp %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[ukjent]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
+ <source>Down</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
+ <source>Up</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
+ <source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
+ <source>R</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
+ <source>L</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[ubrukt]</translation>
</message>
@@ -5320,7 +5554,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5333,7 +5567,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation type="unfinished"/>
</message>
@@ -5346,7 +5580,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5359,7 +5593,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5387,7 +5621,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation type="unfinished"/>
</message>
@@ -5508,7 +5742,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5592,13 +5826,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts
index 85252334d..d2ea219f7 100644
--- a/dist/languages/nl.ts
+++ b/dist/languages/nl.ts
@@ -320,7 +320,9 @@ p, li { white-space: pre-wrap; }
<source>
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+&lt;div&gt;Deze optie verbetert de snelheid of 32-bit ASIMD floating-point functies door incorrecte afronding modellen te gebruiken.&lt;/div&gt;
+</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="125"/>
@@ -368,7 +370,8 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="17"/>
<source>CPU</source>
- <translation type="unfinished"/>
+ <translation>CPU
+</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="25"/>
@@ -498,7 +501,10 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
&lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Deze optimazie versneld geheugen toegang door het gastprogramma.&lt;/div&gt;
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Door dit aan te leggen geeft toegang tot PageTable::pointers in uitgezonden code.&lt;/div&gt;
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Door dit uit te leggen forceerd u alle geheugen toegang door Memory::Read/Memory::Write functies te gaan.&lt;/div&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
@@ -649,7 +655,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -929,67 +940,78 @@ p, li { white-space: pre-wrap; }
<translation>Algemeen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Limiteer Snelheid Percentage</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Multicore CPU Emulatie</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Bevestig sluiten terwijl emulatie nog bezig is</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Vraag voor gebruiker bij het opstartten van het spel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pauzeer Emulatie wanneer yuzu op de achtergrond openstaat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Verstop muis wanneer inactief</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Reset alle instellingen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Hiermee worden alle instellingen gereset en alle configuraties per game verwijderd. Hiermee worden gamedirectory&apos;s, profielen of invoerprofielen niet verwijderd. Doorgaan?</translation>
</message>
@@ -1107,18 +1129,113 @@ p, li { white-space: pre-wrap; }
<translation>Rek naar Venster</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Gebruik globale achtergrondkleur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Gebruik achtergrondkleur:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Achtergrondkleur:</translation>
</message>
@@ -1187,27 +1304,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Standaard</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Standaard</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1535,8 +1657,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Ander</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1545,499 +1667,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emuleer Anolooge invoer met toetsenbord</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Schakel muis panning in</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Muis Gevoeligheid</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Gedadvanceerd</translation>
+ <source>Mouse</source>
+ <translation>Muis</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Touchscreen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Muis</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Gedadvanceerd</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Beweging / Touch</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Debug Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Configureer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Debug Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Ander</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emuleer Anolooge invoer met toetsenbord</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Configureer Invoer</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Verbindt Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Schakel muis panning in</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Muis Gevoeligheid</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Twee Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Linker Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Beweging / Touch</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Rechter Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Configureer Invoer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Mobiel</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Verbindt Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Invoer Apparaat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Elke</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Toetsenbord/muis</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Opslaan</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nieuw</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Verwijder</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Linker Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Boven:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Links:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Rechts:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Beneden:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Ingedrukt:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificatie:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Berijk</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Deadzone: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Bewerk Range: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Min</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Vastleggen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Beweging 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Beweging 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Gezicht Knoppen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Rechter Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Verwijder</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[niet ingesteld]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Shakel Knop</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Spiegel As</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Zet Analoge Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Na OK in te drukken, beweeg je joystick eerst horizontaal en dan verticaal.
Om de assen te spiegelen, beweek je joystick eerst verticaal en dan horizontaal.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Spiegel As</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Deadzone: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Bewerk Range: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Twee Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Linker Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Rechter Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Mobiel</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube Controller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pauze</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Control Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Shudden!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[aan het wachten]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Nieuw Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Voer nieuwe gebruikersnaam in:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Creëer een nieuw Invoer Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>De ingevoerde Profiel naam is niet geldig</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Het is mislukt om Invoer Profiel &quot;%1 te Creëer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Verwijder invoer profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Het is mislukt om Invoer Profiel &quot;%1 te Verwijderen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Laad invoer profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Het is mislukt om Invoer Profiel &quot;%1 te Laden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Sla Invoer profiel op</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Het is mislukt om Invoer Profiel &quot;%1 Op te slaan</translation>
</message>
@@ -2063,85 +2210,75 @@ Om de assen te spiegelen, beweek je joystick eerst verticaal en dan horizontaal.
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configureer Beweging / Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Muis Beweging</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Gevoeligheid:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP Calibratie:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configureer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Gebruik knoptoewijzing:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP Configuratie</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>U kunt elke Cemuhook-compatibele UDP-invoerbron gebruiken voor bewegings- en aanraakinvoer.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Poort:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Leer Meer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Voeg Server toe</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Externe Server</translation>
</message>
@@ -2151,146 +2288,82 @@ Om de assen te spiegelen, beweek je joystick eerst verticaal en dan horizontaal.
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Leer Meer&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>Yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Poortnummer bevat ongeldige tekens</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Poort moet in bereik 0 en 65353 zijn</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP adress is niet geldig</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Deze UDP server bestaat al</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Kan niet meer dan 8 servers toevoegen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configureren</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test Succesvol</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>De data van de server is succesvol ontvangen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test Gefaald</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Kan niet de juiste data van de server ontvangen.&lt;br&gt;Verifieer dat de server is goed opgezet en dat het adres en poort correct zijn.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP Test of calibratie configuratie is bezig.&lt;br&gt;Wacht alstublieft totdat het voltooid is.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configureer Muis</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Muisknoppen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Voorwaarts:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Terug:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Links:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Middel:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Rechts:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Herstellen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Standaarden</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[niet ingesteld]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Herstel Standaardwaarde</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[druk op knop]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3073,31 +3146,26 @@ Om de assen te spiegelen, beweek je joystick eerst verticaal en dan horizontaal.
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3110,7 +3178,7 @@ Om de assen te spiegelen, beweek je joystick eerst verticaal en dan horizontaal.
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3172,37 +3240,37 @@ Sleep punten om positie te veranderen, of dubbel klik één van de tabel cellen
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nieuw Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Voer een naam in voor het nieuwe profiel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Verwijder Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Verwijder Profiel %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Hernoem Profiel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nieuwe naam:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[druk op toets]</translation>
</message>
@@ -3622,12 +3690,12 @@ Sleep punten om positie te veranderen, of dubbel klik één van de tabel cellen
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation type="unfinished"/>
</message>
@@ -3635,89 +3703,94 @@ Sleep punten om positie te veranderen, of dubbel klik één van de tabel cellen
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Annonieme gegevens worden verzameld&lt;/a&gt; om yuzu te helpen verbeteren. &lt;br/&gt;&lt;br/&gt; Zou je jouw gebruiksgegevens met ons willen delen?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetrie</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Web Applet Laden...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Huidige emulatie snelheid. Waardes hoger of lager dan 100% betekent dat de emulatie sneller of langzamer loopt dan de Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Hoeveel frames per seconde de game op dit moment weergeeft. Dit zal veranderen van game naar game en van scène naar scène.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tijd gebruikt om een frame van de Switch te emuleren, waarbij framelimiteren of v-sync niet wordt meegerekend. Voor emulatie op volledige snelheid zou dit maximaal 16.67 ms zijn.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3769,656 +3842,723 @@ Sleep punten om positie te veranderen, of dubbel klik één van de tabel cellen
<translation>Een onbekende fout heeft plaatsgevonden. Kijk in de log voor meer details.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Save Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Fout tijdens het openen van %1 folder</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Folder bestaat niet!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Fout Bij Het Openen Van Overdraagbare Shader Cache</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Er bestaat geen shader cache voor deze game</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS Extractie Mislukt!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Er was een fout tijdens het kopiëren van de RomFS bestanden of de gebruiker heeft de operatie geannuleerd.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Vol</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Skelet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Selecteer RomFS Dump Mode</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Selecteer alstublieft hoe je de RomFS wilt dumpen.&lt;br&gt;Volledig kopieërd alle bestanden in een map terwijl &lt;br&gt; skelet maakt alleen het map structuur.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>RomFS uitpakken...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Annuleren</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS Extractie Geslaagd!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>De operatie is succesvol voltooid.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Fout bij openen %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Selecteer Map</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Eigenschappen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>De eigenschappen van de game kunnen niet geladen worden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch Executable (%1);;Alle bestanden (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Laad Bestand</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Open Gedecomprimeerd ROM Map</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Ongeldige Map Geselecteerd</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>De map die je hebt geselecteerd bevat geen &apos;main&apos; bestand.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Bestand &quot;%1&quot; Installeren...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systeem Applicatie</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systeem Archief</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systeem Applicatie Update</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Filmware Pakket (Type A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Filmware Pakket (Type B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Game</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Game Update</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Game DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Titel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Selecteer NCA Installatie Type...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Selecteer het type titel hoe je wilt dat deze NCA installeerd:
(In de meeste gevallen is de standaard &apos;Game&apos; juist.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Installatie Mislukt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Het type title dat je hebt geselecteerd voor de NCA is ongeldig.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Bestand niet gevonden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Bestand &quot;%1&quot; niet gevonden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Je yuzu account mist</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Om game campatibiliteit te raporteren, moet je je yuzu account koppelen.&lt;br&gt;&lt;br/&gt; Om je yuzu account te koppelen, ga naar Emulatie &amp;gt; Configuratie &amp;gt; Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo Bestand (%1);; Alle Bestanden (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Laad Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Fout tijdens het openen van het Amiibo gegevens bestand</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Kan Amiibo bestand &quot;%1&quot; niet lezen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Fout tijdens het lezen van het Amiibo gegevens bestand</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Kan de volledige Amiibo gegevens niet lezen. Verwacht om %1 bytes te lezen, maar het is alleen mogelijk om %2 bytes te lezen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Fout tijdens het laden van de Amiibo data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Kan de Amiibo gegevens niet laden.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Screenshot Vastleggen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG afbeelding (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Snelheid: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Snelheid: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Game: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Frame: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>De game die je probeert te laden heeft extra bestanden nodig van je Switch voordat je het kan spelen. &lt;br/&gt;&lt;br/&gt;Voor meer informatie over het dumpen van deze bestanden, volg alsjeblieft onze wiki pagina: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Het dumpen van Systeem Archieven en de Gedeelde Lettertypen van een Switch console &lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;Wil je terug gaan naar de game lijst? Verdergaan met de emulatie zal misschien gevolgen hebben als vastlopen, beschadigde opslag data, of andere problemen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu was niet in staat om de Switch systeem archieven te vinden. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu was niet in staat om de Switch systeem archieven te vinden. %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Systeem Archief Niet Gevonden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Systeem Archief Mist</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu was niet in staat om de Switch shared fonts te vinden. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Shared Fonts Niet Gevonden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Gedeelde Lettertypes Niet Gevonden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Fatale Fout</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu is een fatale fout tegengekomen, zie de log voor meer details. Voor meer informatie over toegang krijgen tot de log, zie de volgende pagina: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Hoe upload je een log bestand&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Zou je terug willen naar de game lijst? Doorgaan met emulatie kan resulteren in vastlapen, corrupte save gegevens, of andere problemen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Fatale Fout opgetreden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Bevestig Sleutel Herafleiding</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4435,37 +4575,37 @@ en optioneel maak backups.
Dit zal je automatisch gegenereerde sleutel bestanden verwijderen en de sleutel verkrijger module opnieuw starten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4473,39 +4613,39 @@ on your system&apos;s performance.</source>
op je systeem&apos;s performatie.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Sleutels afleiden</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Selecteer RomFS Dump Doel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Selecteer welke RomFS je zou willen dumpen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Weet je zeker dat je yuzu wilt sluiten?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Weet je zeker dat je de emulatie wilt stoppen? Alle onopgeslagen voortgang will verloren gaan.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4517,38 +4657,38 @@ Wilt u dit omzeilen en toch afsluiten?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4904,190 +5044,205 @@ Screen.</source>
<translation>&amp;Emulatie</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Weergeven</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
- <source>&amp;Tools</source>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Help</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>A&amp;fsluiten</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pauzeren</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Laat status balk zien</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5129,10 +5284,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5163,142 +5323,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[niet aangegeven]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hat %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Axis %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Knop %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[onbekend]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
+ <source>Down</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
+ <source>Up</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
+ <source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
+ <source>R</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Klik 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Axis %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC knop %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Beweging %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[ongebruikt]</translation>
</message>
@@ -5339,7 +5579,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5352,7 +5592,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation type="unfinished"/>
</message>
@@ -5365,7 +5605,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5378,7 +5618,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5406,7 +5646,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation type="unfinished"/>
</message>
@@ -5527,7 +5767,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5611,13 +5851,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts
index 7fcece92c..6800b751c 100644
--- a/dist/languages/pl.ts
+++ b/dist/languages/pl.ts
@@ -651,7 +651,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -931,67 +936,78 @@ p, li { white-space: pre-wrap; }
<translation>Ogólne</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Limit klatek na sekundę</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Limit klatek na sekundę</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Procent limitu prędkości</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulacja CPU Wielordzeniowa</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Potwierdź wyjście podczas emulacji</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Pytaj o użytkownika podczas uruchamiania gry</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Wstrzymaj emulację w tle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Ukryj mysz przy braku aktywności</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Resetuj wszystkie ustawienia</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Spowoduje to zresetowanie wszystkich ustawień i usunięcie wszystkich konfiguracji gier. Nie spowoduje to usunięcia katalogów gier, profili ani profili wejściowych. Kontynuować?</translation>
</message>
@@ -1109,18 +1125,113 @@ p, li { white-space: pre-wrap; }
<translation>Rozciągnij do Okna</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Ustaw globalny kolor tła</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Ustaw kolor tła:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Kolor tła</translation>
</message>
@@ -1189,27 +1300,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Domyślne</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Domyślne</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1537,8 +1653,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Inne</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1547,499 +1663,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emuluj sygnał analogowy z wejściem z klawiatury</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Włącz panoramowanie myszą</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Czułość myszy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Zaawansowane</translation>
+ <source>Mouse</source>
+ <translation>Mysz</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Ekran dotykowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mysz</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Zaawansowane</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Ruch / Dotyk</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Debuguj kontroler</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Konfiguruj</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Debuguj kontroler</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Inne</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emuluj sygnał analogowy z wejściem z klawiatury</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation type="unfinished"/>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Ustawienie wejścia</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Połacz Kontroler</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Włącz panoramowanie myszą</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Czułość myszy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Para Joyconów</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Lewy Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Ruch / Dotyk</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Prawy Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Ustawienie wejścia</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Handheld</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Połacz Kontroler</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Urządzenie Wejściowe</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Dowolny</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Klawiatura/Mysz</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Zapisz</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Nowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Usuń</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Lewa gałka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Góra</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Lewo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Prawo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Dół</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Naciśnięty</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modyfikator</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Zasięg</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Martwa strefa: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Zasięg Modyfikatora: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Zrzut ekranu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Plus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Ruch 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Ruch 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Przednie klawisze</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Prawa gałka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Wyczyść</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[nie ustawione]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Przycisk Toggle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Odwróć oś</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Po naciśnięciu OK, najpierw przesuń joystick w poziomie, a następnie w pionie.
Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Odwróć oś</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Martwa strefa: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Zasięg Modyfikatora: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Para Joyconów</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Lewy Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Prawy Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Handheld</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Kontroler GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pauza</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Lewa gałka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-gałka</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Potrząśnij!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[oczekiwanie]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Nowy profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Wpisz nazwę profilu:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Utwórz profil wejściowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Podana nazwa profilu jest nieprawidłowa!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Nie udało się utworzyć profilu wejściowego &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Usuń profil wejściowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Nie udało się usunąć profilu wejściowego &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Załaduj profil wejściowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Nie udało się wczytać profilu wejściowego &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Zapisz profil wejściowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Nie udało się zapisać profilu wejściowego &quot;%1&quot;</translation>
</message>
@@ -2065,85 +2206,75 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.</
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Konfiguruj Ruch / Dotyk</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Ruch myszy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Czułość:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Dotyk</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Kalibracja UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Konfiguruj</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Użyj mapowania przycisków:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Konfiguracja CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Możesz użyć dowolnego źródła wejściowego UDP zgodnego z Cemuhook, aby zapewnić ruch i dotyk.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Serwer:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Dowiedz się więcej</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Dodaj serwer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Usuń serwer</translation>
</message>
@@ -2153,146 +2284,82 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.</
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Dowiedz się więcej&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Port zawiera nieprawidłowe znaki</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Port musi być w zakresie 0-65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>Adres IP nie jest prawidłowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Ten serwer UDP już istnieje</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Nie można dodać więcej niż 8 serwerów</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testowanie</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Konfigurowanie</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test Udany</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Pomyślnie odebrano dane z serwera.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test nieudany</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Nie można odebrać poprawnych danych z serwera.&lt;br&gt;Sprawdź, czy serwer jest poprawnie skonfigurowany, a adres i port są prawidłowe.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Trwa konfiguracja testu UDP lub kalibracji.&lt;br&gt;Poczekaj na zakończenie.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Ustaw mysz</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Przyciski myszy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Do przodu</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Do tyłu</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Lewy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Środkowy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Prawy</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Wyczyść</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Domyślne</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[nie ustawione]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Przywróć ustawienie domyślne</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[naciśnij przycisk]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3075,31 +3142,26 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.</
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3112,7 +3174,7 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.</
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3174,37 +3236,37 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Nowy profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Wprowadź nazwę dla nowego profilu:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Usuń profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Usunąć profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Zmień nazwę profilu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nowa nazwa:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[naciśnij przycisk]</translation>
</message>
@@ -3624,12 +3686,12 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Kontroler P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Kontroler P1</translation>
</message>
@@ -3637,89 +3699,94 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Dane anonimowe są gromadzone&lt;/a&gt; aby ulepszyć yuzu. &lt;br/&gt;&lt;br/&gt;Czy chcesz udostępnić nam swoje dane o użytkowaniu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetria</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Ładowanie apletu internetowego...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Wyłącz Aplet internetowy</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Wyłączenie apletu sieciowego spowoduje, że nie będzie on wyświetlany przez resztę emulowanej sesji. Może to prowadzić do niezdefiniowanych zachowań i powinno być używane tylko z Super Mario 3D All-Stars. Czy na pewno chcesz wyłączyć aplet sieciowy?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Ilość budowanych shaderów</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Aktualna prędkość emulacji. Wartości większe lub niższe niż 100% wskazują, że emulacja działa szybciej lub wolniej niż Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Ile klatek na sekundę gra aktualnie wyświetla. To będzie się różnić w zależności od gry, od sceny do sceny.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Czas potrzebny do emulacji klatki na sekundę Switcha, nie licząc ograniczania klatek ani v-sync. Dla emulacji pełnej szybkości powinno to wynosić co najwyżej 16,67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Wykryto nieprawidłową konfigurację</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Usuń Ostatnie pliki</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Kontynuuj</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3771,658 +3838,725 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe
<translation>Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Zapis danych</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Dane modów</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Błąd podczas otwarcia folderu %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Folder nie istnieje!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Błąd podczas otwierania przenośnej pamięci podręcznej Shaderów.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Zawartość</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Łatka</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Usuń wpis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Usunąć zainstalowaną grę %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Pomyślnie usunięto</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Pomyślnie usunięto zainstalowaną grę.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Błąd podczas usuwania %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Gra nie jest zainstalowana w NAND i nie może zostać usunięta.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Pomyślnie usunięto zainstalowaną łatkę.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Brak zainstalowanych łatek dla tego tytułu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Brak zainstalowanych DLC dla tego tytułu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Pomyślnie usunięto %1 zainstalowane DLC.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Usunąć niestandardową konfigurację gry?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Usuń plik</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Błąd podczas usuwania przenośnej pamięci podręcznej Shaderów.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Pamięć podręczna Shaderów dla tego tytułu nie istnieje.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Pomyślnie usunięto przenośną pamięć podręczną Shaderów.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Nie udało się usunąć przenośnej pamięci Shaderów.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Błąd podczas usuwania niestandardowej konfiguracji</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Niestandardowa konfiguracja nie istnieje dla tego tytułu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Pomyślnie usunięto niestandardową konfiguracje gry.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Nie udało się usunąć niestandardowej konfiguracji gry.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Wypakowanie RomFS nieudane!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik anulował operację.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Pełny</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Szkielet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Wybierz tryb zrzutu RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Proszę wybrać w jaki sposób chcesz, aby zrzut pliku RomFS został wykonany. &lt;br&gt;Pełna kopia ze wszystkimi plikami do nowego folderu, gdy &lt;br&gt;skielet utworzy tylko strukturę folderu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Wypakowywanie RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Wypakowanie RomFS zakończone pomyślnie!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Operacja zakończona sukcesem.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Błąd podczas otwierania %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Wybierz folder...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Właściwości</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Właściwości tej gry nie mogły zostać załadowane.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Załaduj plik...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Otwórz folder wypakowanego ROMu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Wybrano niewłaściwy folder</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Folder wybrany przez ciebie nie zawiera &apos;głownego&apos; pliku.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Instalacyjne pliki Switch&apos;a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Zainstaluj pliki</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instalowanie pliku &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Wynik instalacji</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND.
Proszę, używaj tej funkcji tylko do instalowania łatek i DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Aplikacja systemowa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Archiwum systemu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Aktualizacja aplikacji systemowej</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Paczka systemowa (Typ A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Paczka systemowa (Typ B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Gra</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Aktualizacja gry</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Dodatek do gry</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Tytuł Delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Wybierz typ instalacji NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako:
(W większości przypadków domyślna &quot;gra&quot; jest w porządku.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Instalacja nieudana</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Typ tytułu wybrany dla NCA jest nieprawidłowy.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Nie znaleziono pliku</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Nie znaleziono pliku &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Kontynuuj</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Brakuje konta Yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Aby przesłać test zgodności gry, musisz połączyć swoje konto yuzu.&lt;br&gt;&lt;br/&gt; Aby połączyć swoje konto yuzu, przejdź do opcji Emulacja &amp;gt; Konfiguracja &amp;gt; Sieć.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Błąd otwierania adresu URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Nie można otworzyć adresu URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Plik Amiibo (%1);;Wszyskie pliki (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Załaduj Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Błąd otwarcia pliku danych Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Nie można otworzyć pliku Amiibo &quot;%1&quot; do odczytu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Błąd podczas odczytu pliku danych Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Nie można w pełni odczytać danych Amiibo. Oczekiwano odczytu %1 bajtów, ale był on w stanie odczytać tylko %2 bajty.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Błąd podczas ładowania pliku danych Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Nie można załadować danych Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Zrób zrzut ekranu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Obrazek PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Prędkość: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Prędkość: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Gra: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Klatka: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Gra, którą próbujesz wczytać, wymaga dodatkowych plików z Switch&apos;a, które zostaną zrzucone przed graniem.&lt;br/&gt;&lt;br/&gt; Aby uzyskać więcej informacji na temat wyrzucania tych plików, odwiedź następującą stronę wiki:&lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt; Zrzut archiw systemu i udostępnionych czcionek z konsoli Nintendo Switch&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;Czy chcesz wrócić do listy gier? Kontynuacja emulacji może spowodować awarie, uszkodzone dane zapisu lub inne błędy.
</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu nie był w stanie znaleźć archiwum systemu Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu nie był w stanie znaleźć archiwum systemu Switch. %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Archiwum systemu nie znalezione.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Brak archiwum systemowego</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu nie był w stanie zlokalizować czcionek Switch&apos;a. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Czcionki nie zostały znalezione</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Brak wspólnej czcionki</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Fatalny błąd</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu napotkał błąd, proszę zobaczyć log po więcej szczegółów. Aby uzyskać więcej informacji na temat uzyskiwania dostępu do pliku log, zobacz następującą stronę: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Jak przesłać plik log&lt;/a&gt;?&lt;br/&gt;&lt;br/&gt; Czy chcesz wrócić do listy gier? Kontynuacja emulacji może spowodować awarie, uszkodzone dane zapisu lub inne błędy.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Wystąpił błąd krytyczny</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Potwierdź ponowną aktywacje klucza</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4439,37 +4573,37 @@ i opcjonalnie tworzyć kopie zapasowe.
Spowoduje to usunięcie wygenerowanych automatycznie plików kluczy i ponowne uruchomienie modułu pochodnego klucza.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - Brak BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Brak BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - Brak PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Brak komponentów wyprowadzania</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Brakuje elementów, które mogą uniemożliwić zakończenie wyprowadzania kluczy. &lt;br&gt;Postępuj zgodnie z &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu quickstart guide&lt;/a&gt; aby zdobyć wszystkie swoje klucze i gry.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4478,39 +4612,39 @@ Zależnie od tego może potrwać do minuty
na wydajność twojego systemu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Wyprowadzanie kluczy...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Wybierz cel zrzutu RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Proszę wybrać RomFS, jakie chcesz zrzucić.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Czy na pewno chcesz zamknąć yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4522,38 +4656,38 @@ Czy chcesz to ominąć i mimo to wyjść?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL niedostępny!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu nie zostało skompilowane z obsługą OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Błąd podczas inicjowania OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Twoja karta graficzna może nie obsługiwać OpenGL lub nie masz najnowszych sterowników karty graficznej.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Błąd podczas inicjowania OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Twoja karta graficzna może nie obsługiwać OpenGL 4.6 lub nie masz najnowszych sterowników karty graficznej.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Twoja karta graficzna może nie obsługiwać co najmniej jednego wymaganego rozszerzenia OpenGL. Upewnij się, że masz najnowsze sterowniki karty graficznej&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Nieobsługiwane rozszerzenia:&lt;br&gt;%2</translation>
</message>
@@ -4914,190 +5048,205 @@ startowy.</translation>
<translation>&amp;Emulacja</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Widok</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Debugowanie</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Zresetuj rozmiar okna do &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Zresetuj rozmiar okna do 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Zresetuj rozmiar okna do &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Zresetuj rozmiar okna do 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Debugowanie</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Narzędzia</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Pomoc</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Zainstaluj pliki na NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>&amp;Wyjście</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pauza</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Stop</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Pokaż pasek statusu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Restart</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;FAQ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5143,10 +5292,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>START/PAUZA</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5177,142 +5331,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[nie ustawione]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Krzyżak %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Oś %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Przycisk %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[nieznane]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
+ <source>Down</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
+ <source>Up</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
+ <source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
+ <source>R</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
+ <source>L</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Oś GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Przycisk GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Ruch %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>Ruch SDL</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Kliknij %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[nieużywane]</translation>
</message>
@@ -5353,7 +5587,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro kontroler</translation>
</message>
@@ -5366,7 +5600,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Para Joyconów</translation>
</message>
@@ -5379,7 +5613,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Lewy Joycon</translation>
</message>
@@ -5392,7 +5626,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Prawy Joycon</translation>
</message>
@@ -5420,7 +5654,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Handheld</translation>
</message>
@@ -5541,7 +5775,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Kontroler GameCube</translation>
</message>
@@ -5635,13 +5869,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts
index 0c859297e..b2fc3113b 100644
--- a/dist/languages/pt_BR.ts
+++ b/dist/languages/pt_BR.ts
@@ -666,7 +666,12 @@ p, li { white-space: pre-wrap; }
<translation>Ativar auto-esboço**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Isto será restaurado automaticamente assim que o yuzu for fechado.</translation>
</message>
@@ -946,67 +951,78 @@ p, li { white-space: pre-wrap; }
<translation>Geral</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
- <source>x</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
+ <source>x</source>
+ <translation>x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Limitar percentual de velocidade</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulação de CPU multinúcleo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Confirmar saída quando a emulação estiver em execução</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Escolher um usuário ao iniciar um jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausar emulação quando a janela ficar em segundo plano</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Esconder cursor do mouse quando em inatividade</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Redefinir todas as configurações</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Isto restaura todas as configurações e exclui as configurações individuais de todos os jogos. As pastas de jogos, perfis de jogos e perfis de controles não serão excluídos. Deseja prosseguir?</translation>
</message>
@@ -1124,18 +1140,113 @@ p, li { white-space: pre-wrap; }
<translation>Esticar para a janela</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>Resolução:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [EXPERIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [EXPERIMENTAL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>Gaussiana</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>Nenhum</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Usar cor de fundo global</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Configurar cor de fundo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Cor de fundo:</translation>
</message>
@@ -1204,27 +1315,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Padrão</translation>
+ <source>Automatic</source>
+ <translation>Automático</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Padrão</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1552,8 +1668,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Outro</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1562,499 +1678,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emular analógico através do teclado</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Ativar o giro do mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Sensibilidade do mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avançado</translation>
+ <source>Mouse</source>
+ <translation>Mouse</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Touchscreen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mouse</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avançado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Movimento/toque</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Controle de depuração</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Controle de depuração</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Outro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emular analógico através do teclado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Requer reiniciar o yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>Habilitar o suporte para 8 jogadores ao XInput (desabilita o applet da web)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Configurar controles</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Conectar controle</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Ativar o giro do mouse</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Sensibilidade do mouse</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Par de Joycons</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon Esquerdo</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Movimento/toque</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon Direito</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Configurar controles</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Portátil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Conectar controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Dispositivo de entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Qualquer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Teclado/mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Salvar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Novo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Excluir</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Analógico esquerdo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Cima</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Esquerda</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Direita</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Baixo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Pressionado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Alcance</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Zona morta: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Alcance de modificador: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Menos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Capturar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Mais</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Botão Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Movimentação 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Movimentação 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Botões de rosto</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Analógico direito</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Limpar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[não definido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Alternar pressionamento do botão</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Inverter eixo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Estabelecer limite</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Escolha um valor entre 0% e 100%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Mapear analógico</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Após pressionar OK, mova o seu direcional analógico primeiro horizontalmente e depois verticalmente.
Para inverter os eixos, mova seu analógico primeiro verticalmente e depois horizontalmente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Inverter eixo</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Zona morta: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Alcance de modificador: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Par de Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon Esquerdo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon Direito</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Portátil</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Controle de GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Start / Pause</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Direcional de controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Balance!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[esperando]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Novo perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Insira um nome para do perfil:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Criar perfil de controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>O nome de perfil inserido não é válido!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Falha ao criar o perfil de controle &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Excluir perfil de controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Falha ao excluir o perfil de controle &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Carregar perfil de controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Falha ao carregar o perfil de controle &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Salvar perfil de controle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Falha ao salvar o perfil de controle &quot;%1&quot;</translation>
</message>
@@ -2080,85 +2221,75 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configurar movimento/toque</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Movimentação com mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilidade:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Toque</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Calibração UDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Usar mapeamento de botões:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configuração CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Você pode utilizar qualquer dispositivo de entrada compatível com o Cemuhook UDP para prover dados de movimento e toque.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Servidor:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Porta:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Saiba mais</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Teste</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Adicionar servidor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Excluir servidor</translation>
</message>
@@ -2168,146 +2299,82 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Saiba mais&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>O número da porta tem caracteres inválidos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>A porta tem que estar entre 0 e 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>O endereço IP não é válido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Este servidor UDP já existe</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Não é possível adicionar mais de 8 servidores</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configurando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Teste bem-sucedido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation> Dados foram recebidos do servidor com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>O teste falhou</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Não foi possível receber dados válidos do servidor.&lt;br&gt;Verifique se o servidor foi configurado corretamente e o endereço e porta estão corretos.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Um teste UDP ou configuração de calibração está em curso no momento.&lt;br&gt;Aguarde até a sua conclusão.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configurar mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Botões do mouse</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Dianteiro:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Traseiro:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Esquerdo:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Meio:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Direito:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Limpar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Padrões</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[não definido]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Restaurar padrão</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[pressione uma tecla]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -2594,12 +2661,12 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>Erro no redimensionamento da imagem do usuário</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>Não foi possível redimensionar a imagem</translation>
</message>
</context>
<context>
@@ -3090,31 +3157,26 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Troca automática do perfil do controle</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
- <translation type="unfinished"/>
+ <translation>Diretório do script</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Caminho</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3127,7 +3189,7 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori
<translation>Configurar TAS</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3189,37 +3251,37 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Novo perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Insira o nome do novo perfil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Excluir perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Excluir perfil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Renomear perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Novo nome:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[pressione a tecla]</translation>
</message>
@@ -3639,12 +3701,12 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Controle J1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Controle J1</translation>
</message>
@@ -3652,90 +3714,95 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Dados anônimos são recolhidos&lt;/a&gt; para ajudar a melhorar o yuzu. &lt;br/&gt;&lt;br/&gt;Gostaria de compartilhar os seus dados de uso conosco?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetria</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Carregando applet web...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Desativar o applet da web</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Desativar o applet web fará com que ele não apareça novamente até o final da sessão emulada. Isto pode causar comportamento inesperado e só deve ser usado com Super Mario 3D All-Stars. Você deseja mesmo desativar o applet web?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>A quantidade de shaders sendo construídos</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Velocidade atual de emulação. Valores maiores ou menores que 100% indicam que a emulação está rodando mais rápida ou lentamente que em um Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Quantos quadros por segundo o jogo está exibindo atualmente. Isto irá variar de jogo para jogo e cena para cena.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tempo que leva para emular um quadro do Switch, sem considerar o limitador de taxa de quadros ou a sincronização vertical. Um valor menor ou igual a 16.67 ms indica que a emulação está em velocidade plena.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Configuração inválida detectada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>O controle portátil não pode ser usado no modo encaixado na base. O Pro Controller será selecionado.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>NA BASE</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Limpar arquivos recentes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Continuar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>Sobrescrever arquivo do jogador 1?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3786,657 +3853,724 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe
<translation>Ocorreu um erro desconhecido. Consulte o registro para mais detalhes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Dados de jogos salvos</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Dados de mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Erro ao abrir a pasta %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>A pasta não existe!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Erro ao abrir o cache de shaders transferível</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>Falha ao criar o diretório de cache de shader para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Conteúdo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Atualização</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Remover item</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Remover o jogo instalado %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Removido com sucesso</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>O jogo base foi removido com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Erro ao remover %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>O jogo base não está instalado na NAND e não pode ser removido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>A atualização instalada foi removida com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Não há nenhuma atualização instalada para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Não há nenhum DLC instalado para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>%1 DLC(s) instalados foram removidos com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>Apagar o cache de shader transferível do OpenGL?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Apagar o cache de shader transferível do Vulkan?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>Apagar todos os caches de shader transferíveis?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Remover configurações customizadas do jogo?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Remover arquivo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Erro ao remover cache de shaders transferível</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Não existe um cache de shaders para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>O cache de shaders transferível foi removido com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Falha ao remover o cache de shaders transferível.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>Erro ao remover os caches de shader transferíveis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>Os caches de shader transferíveis foram removidos com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>Falha ao remover o diretório do cache de shader transferível.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Erro ao remover as configurações customizadas do jogo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Não há uma configuração customizada para este título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>As configurações customizadas do jogo foram removidas com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Falha ao remover as configurações customizadas do jogo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Falha ao extrair RomFS!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Houve um erro ao copiar os arquivos RomFS ou o usuário cancelou a operação.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Extração completa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Apenas estrutura</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Selecione o modo de extração do RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Selecione a forma como você gostaria que o RomFS seja extraído.&lt;br&gt;&quot;Extração completa&quot; copiará todos os arquivos para a nova pasta, enquanto que &lt;br&gt;&quot;Apenas estrutura&quot; criará apenas a estrutura de pastas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extraindo RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Extração do RomFS concluida!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>A operação foi concluída com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Erro ao abrir %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Selecionar pasta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Propriedades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>As propriedades do jogo não puderam ser carregadas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Executável do Switch (%1);;Todos os arquivos (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Carregar arquivo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Abrir pasta da ROM extraída</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Pasta inválida selecionada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>A pasta que você selecionou não contém um arquivo &apos;main&apos;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Arquivo de Switch instalável (*.nca *.nsp *.xci);; Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Instalar arquivos</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>%n arquivo restante</numerusform><numerusform>%n arquivos restantes</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instalando arquivo &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Resultados da instalação</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Para evitar possíveis conflitos, desencorajamos que os usuários instalem os jogos base na NAND.
Por favor, use esse recurso apenas para instalar atualizações e DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Aplicativo do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Arquivo do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Atualização de aplicativo do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Pacote de firmware (tipo A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Pacote de firmware (tipo B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Atualização de jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>DLC de jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Título delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Selecione o tipo de instalação do NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Selecione o tipo de título como o qual você gostaria de instalar este NCA:
(Na maioria dos casos, o padrão &apos;Jogo&apos; serve bem.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Falha ao instalar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>O tipo de título que você selecionou para o NCA é inválido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Arquivo não encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Arquivo &quot;%1&quot; não encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Continuar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Conta do yuzu faltando</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Para enviar um caso de teste de compatibilidade de jogo, você precisa entrar com a sua conta do yuzu.&lt;br&gt;&lt;br/&gt;Para isso, vá para Emulação &amp;gt; Configurar... &amp;gt; Rede.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Erro ao abrir URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Não foi possível abrir o URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>Gravando TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Sobrescrever arquivo do jogador 1?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Arquivo Amiibo (%1);; Todos os arquivos (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Carregar Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Erro ao abrir arquivo de dados do Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Não foi possível abrir o arquivo de Amiibo &quot;%1&quot; para leitura.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Erro ao ler arquivo de dados de Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Não foi possível ler completamente os dados do Amiibo. O yuzu esperava ler %1 bytes, mas foi capaz de ler apenas %2 bytes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Erro ao carregar dados do Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Não foi possível carregar os dados do Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Capturar tela</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Imagem PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>Compilando: %n shader(s)</numerusform><numerusform>Compilando: %n shader(s)</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Velocidade: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Velocidade: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>Jogo: %1 FPS (Desbloqueado)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Jogo: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Quadro: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU ALTA</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTREMA</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>ERRO DE GPU</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>GAUSSIANA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>O jogo que você está tentando carregar precisa que arquivos adicionais do seu Switch sejam extraídos antes de jogá-lo.&lt;br/&gt;&lt;br/&gt;Para saber mais sobre como extrair esses arquivos, visite a seguinte página da wiki: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Extraindo arquivos de sistema e fontes compartilhadas de um Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt; Gostaria de voltar para a lista de jogos? Continuar com a emulação pode resultar em travamentos, dados salvos corrompidos ou outros problemas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>O yuzu não foi capaz de encontrar um arquivo de sistema do Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>O yuzu não foi capaz de encontrar um arquivo de sistema do Switch. %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Arquivo do sistema não encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Arquivo de sistema faltando</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>O yuzu não foi capaz de encontrar as fontes compartilhadas do Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Fontes compartilhadas não encontradas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Fonte compartilhada faltando</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Erro fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>O yuzu encontrou um erro fatal. Consulte o registro para mais detalhes. Para mais informações sobre como acessar o registro, consulte a seguinte página: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Como enviar o arquivo de registro&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Gostaria de voltar para a lista de jogos? Continuar com a emulação pode resultar em travamentos, dados salvos corrompidos ou outros problemas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Erro fatal encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Confirmar rederivação de chave</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4453,37 +4587,37 @@ e opcionalmente faça cópias de segurança.
Isto excluirá o seus arquivos de chaves geradas automaticamente, e reexecutar o módulo de derivação de chaves.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Faltando fusíveis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation> - Faltando BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - Faltando BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation> - Faltando PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Faltando componentes de derivação</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Há componentes faltando que podem impedir a conclusão do processo de derivação de chaves. &lt;br&gt;Por favor, siga &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;o guia de iniciação rápida&lt;/a&gt; para obter todas as suas chaves e jogos. &lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4492,39 +4626,39 @@ Isto pode demorar até um minuto, dependendo
do desempenho do seu sistema.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Derivando chaves</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Selecionar alvo de extração do RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Selecione qual RomFS você quer extrair.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Você deseja mesmo fechar o yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Deseja mesmo parar a emulação? Qualquer progresso não salvo será perdido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4536,38 +4670,38 @@ Deseja ignorar isso e sair mesmo assim?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL não disponível!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>O yuzu não foi compilado com suporte para OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Erro ao inicializar o OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Sua GPU pode não suportar OpenGL, ou você não possui o driver gráfico mais recente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Erro ao inicializar o OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Sua GPU pode não suportar o OpenGL 4.6, ou você não possui os drivers gráficos mais recentes.&lt;br&gt;&lt;br&gt;Renderizador GL:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Sua GPU pode não suportar uma ou mais extensões necessárias do OpenGL. Verifique se você possui a última versão dos drivers gráficos.&lt;br&gt;&lt;br&gt;Renderizador GL:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Extensões não suportadas:&lt;br&gt;%2</translation>
</message>
@@ -4929,190 +5063,205 @@ tela inicial do jogo.</translation>
<translation>&amp;Emulação</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Exibir</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Restaurar tamanho da janela</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Depurar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Restaurar tamanho da janela para &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Restaurar tamanho da janela para 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>Restaurar tamanho da janela para &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>Restaurar tamanho da janela para 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Restaurar tamanho da janela para &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Restaurar tamanho da janela para 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Depurar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Ferramentas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Ajuda</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Instalar arquivos na NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>&amp;Carregar arquivo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>Carregar &amp;pasta...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>S&amp;air</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Iniciar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pausar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Parar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Reinicializar chaves...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;Sobre o yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>Modo de &amp;janela única</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>Con&amp;figurar...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>Exibir barra de títul&amp;os de widgets afixados</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>Exibir barra de &amp;filtro</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>Exibir barra de &amp;status</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Exibir barra de status</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>&amp;Tela cheia</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Reiniciar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Carregar &amp;amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Reportar compatibilidade</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Abrir página de &amp;mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>Abrir &amp;guia de início rápido</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;Perguntas frequentes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Abrir pasta do &amp;yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Captura de tela</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>Configurar &amp;TAS...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Configurar jogo &amp;atual..</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Iniciar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5158,10 +5307,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>START/PAUSE</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5192,142 +5346,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[não definido]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Direcional %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Eixo %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Botão %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[desconhecido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clique 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clique 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clique 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clique 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clique 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Eixo GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Botão GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Movimento %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>Movimento do SDL</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Clique %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[não utilizado]</translation>
</message>
@@ -5368,7 +5602,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5381,7 +5615,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Par de Joycons</translation>
</message>
@@ -5394,7 +5628,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Joycon esquerdo</translation>
</message>
@@ -5407,7 +5641,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Joycon direito</translation>
</message>
@@ -5435,7 +5669,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Portátil</translation>
</message>
@@ -5556,7 +5790,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Controle de GameCube</translation>
</message>
@@ -5650,13 +5884,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts
index a55f82bbe..eb58f2718 100644
--- a/dist/languages/pt_PT.ts
+++ b/dist/languages/pt_PT.ts
@@ -646,7 +646,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -926,67 +931,78 @@ p, li { white-space: pre-wrap; }
<translation>Geral</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Percentagem do limitador de velocidade</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Emulação de CPU Multicore</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Confirme a saída enquanto a emulação está em execução</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Solicitar para o utilizador na inicialização do jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausar o emulador quando estiver em segundo plano</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Esconder rato quando inactivo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Restaurar todas as configurações</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>Isto restaura todas as configurações e remove as configurações específicas de cada jogo. As pastas de jogos, perfis de jogos e perfis de controlo não serão removidos. Continuar?</translation>
</message>
@@ -1104,18 +1120,113 @@ p, li { white-space: pre-wrap; }
<translation>Esticar à Janela</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Usar cor de fundo global</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Definir cor de fundo:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Cor de fundo:</translation>
</message>
@@ -1184,27 +1295,32 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Padrão</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Padrão</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1532,8 +1648,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Outro</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1542,66 +1658,75 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Emular entradas analógicas através de entradas do teclado</translation>
+ <source>Mouse</source>
+ <translation>Rato</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Ecrã Táctil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Sensibilidade do rato</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avançado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Controlador de Depuração</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avançado</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
+ <source>Configure</source>
+ <translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
- <source>Touchscreen</source>
- <translation>Ecrã Táctil</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Outro</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Rato</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Emular entradas analógicas através de entradas do teclado</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Movimento / Toque</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
+ <source>Requires restarting yuzu</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
- <source>Configure</source>
- <translation>Configurar</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
+ <source>Enable XInput 8 player support (disables web applet)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Controlador de Depuração</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
- <source>Requires restarting yuzu</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
- <source>Enable XInput 8 player support (disables web applet)</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Sensibilidade do rato</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Movimento / Toque</translation>
+ </message>
</context>
<context>
<name>ConfigureInputPlayer</name>
@@ -1616,425 +1741,441 @@ p, li { white-space: pre-wrap; }
<translation>Conectar Comando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Comando Pro</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Joycons Duplos</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Joycon Esquerdo</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Joycon Direito</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Portátil</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Dispositivo de Entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Qualquer</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Teclado/Rato</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Guardar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Novo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Apagar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Analógico Esquerdo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Cima</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Esquerda</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Direita</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Baixo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Premido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modificador</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Alcance</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Ponto Morto: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modificador de Alcance: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Menos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Capturar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Mais</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Movimento 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Movimento 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Botôes de Rosto</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Analógico Direito</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Limpar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[não definido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Inverter eixo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Mapear analógicos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Após pressionar OK, mova o seu analógico primeiro horizontalmente e depois verticalmente.
Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois horizontalmente.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Inverter eixo</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Ponto Morto: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modificador de Alcance: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Comando Pro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Joycons Duplos</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon Esquerdo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon Direito</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Portátil</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Controlador de depuração</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Iniciar / Pausar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Stick</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Abane!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[em espera]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Novo Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Introduza um novo nome de perfil:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Criar perfil de controlo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>O nome de perfil dado não é válido!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Falha ao criar o perfil de controlo &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Apagar Perfil de Controlo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Falha ao apagar o perfil de controlo &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Carregar perfil de controlo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Falha ao carregar o perfil de controlo &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Guardar perfil de controlo</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Falha ao guardar o perfil de controlo &quot;%1&quot;</translation>
</message>
@@ -2060,85 +2201,75 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Configurar Movimento / Toque</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Movimentação com o rato</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Sensibilidade:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Toque</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Calibração UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Configurar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Usar mapeamento de butões:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Configurar CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Podes usar qualquer fonte de entrada UDP compatível com Cemuhook para fornecer entradas de toque e movimento.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Servidor:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Porta:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Saber Mais</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Testar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Adicionar Servidor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Remover Servidor</translation>
</message>
@@ -2148,146 +2279,82 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Saber Mais&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>O número da porta tem caracteres inválidos</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>A porta tem que estar entre 0 e 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>O endereço IP não é válido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Não é possível adicionar mais de 8 servidores</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Configurando</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Teste Bem-Sucedido</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Dados recebidos do servidor com êxito.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Teste Falhou</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Não foi possível receber dados válidos do servidor.&lt;br&gt;Por favor verifica que o servidor está configurado correctamente e o endereço e porta estão correctos.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Teste UDP ou configuração de calibragem em progresso.&lt;br&gt; Por favor espera que termine.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Configurar Rato</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Botões do Rato</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Frente:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Atrás:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Esquerda:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Meio:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Direita:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Limpar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Padrões</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[não configurado]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Restaurar Padrões</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[pressiona a tecla]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3070,31 +3137,26 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3107,7 +3169,7 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3169,37 +3231,37 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Novo Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Escreve o nome para o novo perfil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Apagar Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Apagar perfil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Renomear Perfil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Novo nome:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[premir tecla]</translation>
</message>
@@ -3619,12 +3681,12 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Comando J1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Comando J1</translation>
</message>
@@ -3632,89 +3694,94 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Dados anônimos são coletados&lt;/a&gt;para ajudar a melhorar o yuzu.&lt;br/&gt;&lt;br/&gt;Gostaria de compartilhar seus dados de uso conosco?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetria</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>A Carregar o Web Applet ...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Desativar Web Applet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Desativar o Web Applet fará com que ele não apareça novamente até o final da sessão emulada. Isto pode causar comportamento inesperado e só deve ser usado com Super Mario 3D All-Stars. Tem a certeza que quer desativar o Web Applet?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Quantidade de shaders a serem construídos</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Velocidade da emulação actual. Valores acima ou abaixo de 100% indicam que a emulação está sendo executada mais depressa ou mais devagar do que a Switch</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Quantos quadros por segundo o jogo está exibindo de momento. Isto irá variar de jogo para jogo e de cena para cena.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tempo gasto para emular um frame da Switch, sem contar o a limitação de quadros ou o v-sync. Para emulação de velocidade máxima, esta deve ser no máximo 16.67 ms.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Configação inválida detectada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>O comando portátil não pode ser usado no modo encaixado na base. O Pro controller será selecionado.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Limpar arquivos recentes</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Continuar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3766,657 +3833,724 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta
<translation>Ocorreu um erro desconhecido. Por favor, veja o log para mais detalhes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Começar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Save Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod Data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Erro ao abrir a pasta %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>A Pasta não existe!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Erro ao abrir os Shader Cache transferíveis</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Conteúdos</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Actualização</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Remover Entrada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Remover Jogo Instalado %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Removido com Sucesso</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Removida a instalação do jogo base com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Erro ao Remover %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>O jogo base não está instalado no NAND e não pode ser removido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Removida a actualização instalada com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Não há actualização instalada neste título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Não há DLC instalado neste título.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Removido DLC instalado %1 com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Remover Configuração Personalizada do Jogo?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Remover Ficheiro</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Error ao Remover Cache de Shader Transferível</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>O Shader Cache para este titulo não existe.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Removido a Cache de Shader Transferível com Sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Falha ao remover a cache de shader transferível.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Erro ao Remover Configuração Personalizada</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Não existe uma configuração personalizada para este titúlo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Removida a configuração personalizada do jogo com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Falha ao remover a configuração personalizada do jogo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>A Extração de RomFS falhou!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Houve um erro ao copiar os arquivos RomFS ou o usuário cancelou a operação.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Cheio</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Esqueleto</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Selecione o modo de despejo do RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Por favor, selecione a forma como você gostaria que o RomFS fosse despejado&lt;br&gt;Full irá copiar todos os arquivos para o novo diretório enquanto&lt;br&gt;skeleton criará apenas a estrutura de diretórios.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extraindo o RomFS ...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Extração de RomFS Bem-Sucedida!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>A operação foi completa com sucesso.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Erro ao abrir %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Selecione o Diretório</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Propriedades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>As propriedades do jogo não puderam ser carregadas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Executáveis Switch (%1);;Todos os Ficheiros (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Carregar Ficheiro</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Abrir o directório ROM extraído</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Diretório inválido selecionado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>O diretório que você selecionou não contém um arquivo &apos;Main&apos;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Ficheiro Switch Instalável (*.nca *.nsp *.xci);;Arquivo de Conteúdo Nintendo (*.nca);;Pacote de Envio Nintendo (*.nsp);;Imagem de Cartucho NX (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Instalar Ficheiros</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Instalando arquivo &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Instalar Resultados</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Para evitar possíveis conflitos, desencorajamos que os utilizadores instalem os jogos base na NAND.
Por favor, use esse recurso apenas para instalar atualizações e DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Aplicação do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Arquivo do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Atualização do aplicativo do sistema</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Pacote de Firmware (Tipo A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Pacote de Firmware (Tipo B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Actualização do Jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>DLC do Jogo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Título Delta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Selecione o tipo de instalação do NCA ...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Por favor, selecione o tipo de título que você gostaria de instalar este NCA como:
(Na maioria dos casos, o padrão &apos;Jogo&apos; é suficiente).</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Falha na instalação</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>O tipo de título que você selecionou para o NCA é inválido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Arquivo não encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Arquivo &quot;%1&quot; não encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Continuar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Conta Yuzu Ausente</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Para enviar um caso de teste de compatibilidade de jogos, você deve vincular sua conta yuzu.&lt;br&gt;&lt;br/&gt;Para vincular sua conta yuzu, vá para Emulação &amp;gt; Configuração &amp;gt; Rede.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Erro ao abrir URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Não foi possível abrir o URL &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Arquivo Amiibo (%1);; Todos os Arquivos (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Carregar Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Erro ao abrir o arquivo de dados do Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Não é possível abrir o arquivo Amiibo &quot;%1&quot; para leitura.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Erro ao ler o arquivo de dados do Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Não é possível ler completamente os dados do Amiibo. Espera-se que leia %1 bytes, mas só conseguiu ler %2 bytes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Erro ao carregar dados do Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Não foi possível carregar os dados do Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Captura de Tela</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Imagem PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Velocidade: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Velocidade: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Jogo: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Quadro: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>O jogo que você está tentando carregar requer arquivos adicionais do seu Switch para serem despejados antes de jogar.&lt;br/&gt;&lt;br/&gt;Para obter mais informações sobre como despejar esses arquivos, consulte a seguinte página da wiki:&lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Despejando arquivos do sistema e as fontes compartilhadas de uma consola Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Você gostaria de regressar para a lista de jogos? Continuar a emulação pode resultar em falhas, dados de salvamento corrompidos ou outros erros.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>O yuzu não conseguiu localizar um arquivo de sistema do Switch. % 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>O yuzu não conseguiu localizar um arquivo de sistema do Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Arquivo do Sistema Não Encontrado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Arquivo de Sistema em falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu não conseguiu localizar as fontes compartilhadas do Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Fontes compartilhadas não encontradas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Fontes compartilhadas em falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Erro fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu encontrou um erro fatal, por favor veja o registro para mais detalhes. Para mais informações sobre como acessar o registro, por favor, veja a seguinte página:&lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Como carregar o arquivo de registro&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Você gostaria de regressar para a lista de jogos? Continuar a emulação pode resultar em falhas, dados de salvamento corrompidos ou outros erros.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Ocorreu um Erro fatal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Confirme a rederivação da chave</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4433,37 +4567,37 @@ e opcionalmente faça backups.
Isso irá excluir os seus arquivos de chave gerados automaticamente e executará novamente o módulo de derivação de chave.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Fusíveis em Falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- BOOT0 em Falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- BCPKG2-1-Normal-Main em Falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- PRODINFO em Falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Componentes de Derivação em Falta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Estão componentes em falta que podem dificultar a conclusão da derivação das chaves. &lt;br&gt;Por favor segue&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;o guia de início rápido do yuzu&lt;/a&gt;para obteres todos os teus jogos e chaves.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4472,39 +4606,39 @@ Isto pode demorar até um minuto, dependendo
do desempenho do seu sistema.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Derivando Chaves</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Selecione o destino de despejo do RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Por favor, selecione qual o RomFS que você gostaria de despejar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Tem a certeza que quer fechar o yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Tem a certeza de que quer parar a emulação? Qualquer progresso não salvo será perdido.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4516,38 +4650,38 @@ Deseja ignorar isso e sair mesmo assim?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL não está disponível!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu não foi compilado com suporte OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Erro ao inicializar OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>O seu GPU pode não suportar OpenGL, ou não tem os drivers gráficos mais recentes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Erro ao inicializar o OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>O teu GPU pode não suportar OpenGL 4.6, ou não tem os drivers gráficos mais recentes.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4908,190 +5042,205 @@ Inicial</translation>
<translation>&amp;Emulação</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Vista</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Restaurar tamanho da janela para &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Restaurar tamanho da janela para 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Restaurar tamanho da janela para &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Restaurar tamanho da janela para 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Ferramentas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Ajuda</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Instalar arquivos na NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>C&amp;arregar arquivo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>Carregar &amp;pasta...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>&amp;Sair</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Começar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Pausa</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Parar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Reinicializar chaves...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;Sobre o yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>Modo de &amp;janela única</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>Con&amp;figurar...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>Mostrar Barra de &amp;Filtros</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>Mostrar Barra de &amp;Estado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Mostrar Barra de Estado</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>T&amp;ela cheia</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Reiniciar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Carregar &amp;Amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Abrir Página de &amp;Mods</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Abrir pasta &amp;yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Captura de Tela</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Configurar jogo atual...</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Começar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5133,10 +5282,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5167,142 +5321,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[não configurado]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hat %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Eixo %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Botão %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[Desconhecido]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Clique 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Clique 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Clique 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Clique 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Clique 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Eixo %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC Butão %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[sem uso]</translation>
</message>
@@ -5343,7 +5577,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5356,7 +5590,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Par de Joycons</translation>
</message>
@@ -5369,7 +5603,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Joycon Esquerdo</translation>
</message>
@@ -5382,7 +5616,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Joycon Direito</translation>
</message>
@@ -5410,7 +5644,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Portátil</translation>
</message>
@@ -5531,7 +5765,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5615,13 +5849,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts
index ef9c958a2..d1e9c313a 100644
--- a/dist/languages/ru_RU.ts
+++ b/dist/languages/ru_RU.ts
@@ -87,18 +87,18 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="20"/>
<source>Report Compatibility</source>
- <translation>Сообщить о Совместимости</translation>
+ <translation>Сообщить о совместимости</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="27"/>
<location filename="../../src/yuzu/compatdb.ui" line="63"/>
<source>Report Game Compatibility</source>
- <translation>Сообщить о Совместимости Игры</translation>
+ <translation>Сообщить о совместимости игры</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="36"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Should you choose to submit a test case to the &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;yuzu Compatibility List&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, The following information will be collected and displayed on the site:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Hardware Information (CPU / GPU / Operating System)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Which version of yuzu you are running&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The connected yuzu account&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Если вы захотите отправить отчёт в &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Список Совместимости yuzu&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, следующая информация будет собрана и отображена на сайте:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Информация о железе (ЦП / ГП / Операционная Система)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Версия yuzu&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Подключённый аккаунт yuzu&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Если вы захотите отправить отчёт в &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;список совместимости yuzu&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, следующая информация будет собрана и отображена на сайте:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; Информация о железе (ЦП / ГП / Операционная система)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Версия yuzu&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Подключённый аккаунт yuzu&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="72"/>
@@ -108,7 +108,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="79"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions flawlessly with no audio or graphical glitches.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Игра функционирует отлично, без звуковых или графических артефактов.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Игра работает отлично, без звуковых или графических артефактов.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="89"/>
@@ -138,7 +138,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="130"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Игра работает, но с существенными графическими или звуковыми артефактами. В некоторых зонах нельзя продвинуться даже с обходными путями.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Игра работает, но с существенными графическими или звуковыми артефактами. В некоторых местах невозможно пройти даже с обходными путями.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="140"/>
@@ -148,7 +148,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/compatdb.ui" line="147"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;В игру невозможно играть из-за графических или звуковых артефактов. Невозможно продвинуться дальше Стартового Экрана.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;В игру невозможно играть из-за графических или звуковых артефактов. Невозможно продвинуться дальше стартового меню.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/compatdb.ui" line="157"/>
@@ -276,12 +276,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="63"/>
<source>We recommend setting accuracy to &quot;Auto&quot;.</source>
- <translation>Мы рекомендуем установить точность на &quot;Точно&quot;.</translation>
+ <translation>Мы рекомендуем установить точность на &quot;Авто&quot;.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="80"/>
<source>Unsafe CPU Optimization Settings</source>
- <translation>Небезопасные Настройки Оптимизации ЦП</translation>
+ <translation>Небезопасные настройки оптимизации ЦП</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="86"/>
@@ -294,7 +294,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Эта опция позволяет улучшить скорость уменьшая точность сложенных умноженных инструкций на ЦП без родной поддержки FMA.&lt;/div&gt;
+ &lt;div&gt;Эта опция повышает скорость, уменьшая точность сложенных умноженных инструкций на ЦП без родной поддержки FMA.&lt;/div&gt;
</translation>
</message>
<message>
@@ -308,7 +308,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves the speed of some approximate floating-point functions by using less accurate native approximations.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Эта опция улучшает скорость работы некоторых функций с плавающей запятой за счет использования менее точных нативных приближений.&lt;/div&gt;
+ &lt;div&gt;Эта опция повышает скорость работы некоторых функций с плавающей запятой за счет использования менее точных родных приближений.&lt;/div&gt;
</translation>
</message>
<message>
@@ -322,7 +322,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Эта опция улучшает скорость работы 32-битных ASIMD-функций с плавающей запятой, за счёт неправильных режимамов округления.&lt;/div&gt;
+ &lt;div&gt;Эта опция повышает скорость работы 32-битных ASIMD-функций с плавающей запятой, работая с неправильными режимами округления.&lt;/div&gt;
</translation>
</message>
<message>
@@ -336,13 +336,13 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Эта опция улучшает скорость убрав проверку NaN. Учтите, что это также снижает точность некоторых инструкций с плавающей точкой. &lt;/div&gt;
+ &lt;div&gt;Эта опция повышает скорость, убирая проверку NaN. Обратите внимание, что это также снижает точность некоторых инструкций с плавающей точкой. &lt;/div&gt;
</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="137"/>
<source>Inaccurate NaN handling</source>
- <translation>Неточная обработка NaN</translation>
+ <translation>Неправильная обработка NaN</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="144"/>
@@ -350,7 +350,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Эта опция повышает скорость работы за счет устранения проверки безопасности перед каждым чтением/записью памяти в гостя. Отключение этой опции может позволить игре читать/записывать память эмулятора.&lt;/div&gt;
+ &lt;div&gt;Эта опция повышает скорость работы за счет устранения проверки безопасности перед каждым чтением/записью памяти у гостя. Отключение этой опции может позволить игре читать/записывать память эмулятора.&lt;/div&gt;
</translation>
</message>
<message>
@@ -379,12 +379,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="25"/>
<source>Toggle CPU Optimizations</source>
- <translation>Переключить оптимизацию ЦП</translation>
+ <translation>Включить оптимизации ЦП</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Только для отладки.&lt;/span&gt;&lt;br/&gt;Если вы не уверены в том, что они делают, оставьте все эти параметры включенными. &lt;br/&gt;Эти параметры, когда отключены, вступают в силу только при включенной отладке процессора. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Только для отладки.&lt;/span&gt;&lt;br/&gt;Если вы не уверены в том, что они делают, оставьте все эти параметры включенными. &lt;br/&gt;Когда отключены, эти параметры вступают в силу только при включенной отладке ЦП. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
@@ -520,7 +520,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
<source>Enable Host MMU Emulation</source>
- <translation>Включить Эмуляцию MMU Хоста</translation>
+ <translation>Включить эмуляцию MMU хоста</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="172"/>
@@ -538,17 +538,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="17"/>
<source>Global Log Filter</source>
- <translation>Глобальный Фильтр Журнала</translation>
+ <translation>Глобальный фильтр журналов</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="29"/>
<source>Show Log in Console</source>
- <translation>Показывать Журнал в Консоли</translation>
+ <translation>Показывать журнал в консоли</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="36"/>
<source>Open Log Location</source>
- <translation>Открыть Расположение Журнала</translation>
+ <translation>Открыть папку для журналов</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="46"/>
@@ -558,7 +558,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="49"/>
<source>Enable Extended Logging**</source>
- <translation>Включить расширенное ведение Журнала**</translation>
+ <translation>Включить расширенное ведение журнала**</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="59"/>
@@ -568,7 +568,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="67"/>
<source>Arguments String</source>
- <translation>Строка Аргументов</translation>
+ <translation>Строка аргументов</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="82"/>
@@ -578,17 +578,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="91"/>
<source>When checked, the graphics API enters a slower debugging mode</source>
- <translation>Когда выбрано, графический API переходит в более медленный режим отладки</translation>
+ <translation>Когда включено, графический API переходит в более медленный режим отладки</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="94"/>
<source>Enable Graphics Debugging</source>
- <translation>Включить Отладку Графики</translation>
+ <translation>Включить отладку графики</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="101"/>
<source>When checked, it enables Nsight Aftermath crash dumps</source>
- <translation>Если флажок установлен, он включает дампы крашей Nsight Aftermath</translation>
+ <translation>Если флажок установлен, включает дампы крашей Nsight Aftermath</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="104"/>
@@ -613,7 +613,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="127"/>
<source>Enable Shader Feedback</source>
- <translation>Включить Обратную Связь о Шейдерах</translation>
+ <translation>Включить обратную связь о шейдерах</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="134"/>
@@ -623,7 +623,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="137"/>
<source>Disable Loop safety checks</source>
- <translation>Отключить проверку безопасности Цикла</translation>
+ <translation>Отключить проверку безопасности цикла</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="147"/>
@@ -633,12 +633,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="153"/>
<source>Enable FS Access Log</source>
- <translation>Включить Журнал Доступа к FS</translation>
+ <translation>Включить журнал доступа к FS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="160"/>
<source>Enable Verbose Reporting Services**</source>
- <translation>Включить Службу Отчетов в развернутом виде**</translation>
+ <translation>Включить службу отчётов в развернутом виде**</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="170"/>
@@ -648,17 +648,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="176"/>
<source>Kiosk (Quest) Mode</source>
- <translation>Режим Киоска (Квест)</translation>
+ <translation>Режим киоска (Квест)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="183"/>
<source>Enable CPU Debugging</source>
- <translation>Включить Отладку ЦП</translation>
+ <translation>Включить отладку ЦП</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="190"/>
<source>Enable Debug Asserts</source>
- <translation>Включить Отладочные Сигналы</translation>
+ <translation>Включить отладочные сигналы</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="197"/>
@@ -666,7 +666,12 @@ p, li { white-space: pre-wrap; }
<translation>Включить Автоподставку**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation>Включить все типы контроллеров</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Это будет автоматически сброшено после закрытия yuzu.</translation>
</message>
@@ -676,7 +681,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="14"/>
<source>Configure Debug Controller</source>
- <translation>Настройка Отладочного Контроллера</translation>
+ <translation>Настройка отладочного контроллера</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="40"/>
@@ -784,7 +789,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="71"/>
<source>Game List</source>
- <translation>Список Игр</translation>
+ <translation>Список игр</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="72"/>
@@ -807,7 +812,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="25"/>
<source>Storage Directories</source>
- <translation>Пути Хранилища</translation>
+ <translation>Пути хранилища</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="31"/>
@@ -846,17 +851,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="107"/>
<source>Current Game</source>
- <translation>Текущая Игра</translation>
+ <translation>Текущая игра</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="124"/>
<source>Patch Manager</source>
- <translation>Управление Патчами</translation>
+ <translation>Управление патчами</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="152"/>
<source>Dump Decompressed NSOs</source>
- <translation>Дамп Распакованных NCO</translation>
+ <translation>Дамп распакованных NSO</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="159"/>
@@ -871,7 +876,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="175"/>
<source>Dump Root</source>
- <translation>Корень Дампа</translation>
+ <translation>Корень дампа</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="201"/>
@@ -881,7 +886,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="209"/>
<source>Cache Game List Metadata</source>
- <translation>Кэшировать Метаданные Списка Игр</translation>
+ <translation>Кэшировать метаданные списка игр</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="216"/>
@@ -889,7 +894,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="128"/>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="133"/>
<source>Reset Metadata Cache</source>
- <translation>Сбросить Кэш Метаданных</translation>
+ <translation>Сбросить кэш метаданных</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="86"/>
@@ -946,69 +951,80 @@ p, li { white-space: pre-wrap; }
<translation>Общие</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>Ограничение частоты кадров</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation>Использовать глобальное ограничение частоты кадров</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation>Установить ограничение частоты кадров:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation>Для вступления в силу требуется использование горячей клавиши FPS Limiter Toggle.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Ограничение частоты кадров</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
- <translation>Ограничить Скорость в Процентах</translation>
+ <translation>Ограничение cкорости в процентах</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
- <translation>Многоядерная Эмуляция ЦП</translation>
+ <translation>Многоядерная эмуляция ЦП</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Подтверждать выход во время эмуляции</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Спрашивать пользователя при запуске игры</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Приостанавливать эмуляцию в фоновом режиме</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Спрятать мышь при неактивности</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
- <translation>Сбросить Все Настройки</translation>
+ <translation>Сбросить все настройки</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
- <translation>Это сбросит все настройки и удалит все конфигурации под отдельные игры. При этом не будут удалены каталоги игр, профили или профили ввода. Продолжить?</translation>
+ <translation>Это сбросит все настройки и удалит все конфигурации под отдельные игры. При этом не будут удалены пути для игр, профили или профили ввода. Продолжить?</translation>
</message>
</context>
<context>
@@ -1031,7 +1047,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="64"/>
<source>Shader Backend:</source>
- <translation>Бэкенд Шейдеров:</translation>
+ <translation>Бэкенд шейдеров:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="92"/>
@@ -1046,7 +1062,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="156"/>
<source>Graphics Settings</source>
- <translation>Настройки Графики</translation>
+ <translation>Настройки графики</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="162"/>
@@ -1086,7 +1102,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="242"/>
<source>Fullscreen Mode:</source>
- <translation>Полноэкранный Режим:</translation>
+ <translation>Полноэкранный режим:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="250"/>
@@ -1101,7 +1117,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="281"/>
<source>Aspect Ratio:</source>
- <translation>Соотношение Сторон:</translation>
+ <translation>Соотношение сторон:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="289"/>
@@ -1121,23 +1137,118 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="304"/>
<source>Stretch to Window</source>
- <translation>Расстянуть до Окна</translation>
+ <translation>Растянуть до окна</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>Разрешение:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [ЭКСПЕРИМЕНТАЛЬНО]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [ЭКСПЕРИМЕНТАЛЬНО]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation>Фильтр адаптации окна</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation>Ближайший сосед</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation>Билинейный</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation>Бикубический</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>Гаусс</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>ScaleForce</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation>AMD FidelityFX™️ Super Resolution [Только Vulkan]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>Метод сглаживания:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>Выкл.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Использовать общий фоновый цвет</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Установить фоновый цвет:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
- <translation>Фоновый Цвет:</translation>
+ <translation>Фоновый цвет:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.cpp" line="34"/>
@@ -1160,12 +1271,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="25"/>
<source>Advanced Graphics Settings</source>
- <translation>Расширенные Настройки Графики</translation>
+ <translation>Расширенные настройки графики</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="46"/>
<source>Accuracy Level:</source>
- <translation>Уровень Точности:</translation>
+ <translation>Уровень точности:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="75"/>
@@ -1204,28 +1315,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Стандартная</translation>
+ <source>Automatic</source>
+ <translation>Автоматически</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (НЕСТАБИЛЬНО)</translation>
+ <source>Default</source>
+ <translation>Стандартная</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (НЕСТАБИЛЬНО)</translation>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (НЕСТАБИЛЬНО)</translation>
+ <source>4x</source>
+ <translation>4x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (НЕСТАБИЛЬНО)</translation>
+ <source>8x</source>
+ <translation>8x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>16x</translation>
</message>
</context>
<context>
@@ -1552,8 +1668,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Другое</translation>
+ <source>Emulated Devices</source>
+ <translation>Эмулируемые устройства</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1562,499 +1678,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Эмуляция аналогового ввода с клавиатуры</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Включить панорамирование мыши</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Чувствительность мыши</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Дополнительно</translation>
+ <source>Mouse</source>
+ <translation>Мышь</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Сенсорный Экран</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Мышь</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Дополнительно</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Движение / Нажатие</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Отладочный Контроллер</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Настроить</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Отладочный Контроллер</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Другое</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Эмуляция аналогового ввода с клавиатуры</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Требует перезапуск yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>Включить поддержку 8-и игроков на XInput (отключает веб-апплет)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Настроить Ввод</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation>Включить UDP контроллеры (не обязательно для движения)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Подключить Контроллер</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Включить панорамирование мыши</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Контроллер Pro</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Чувствительность мыши</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Двойные Joycon&apos;ы</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Левый Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Движение / Нажатие</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Правый Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Настроить Ввод</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Портативный</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Подключить Контроллер</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Устройство Ввода</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Любой</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Клавиатура/Мышь</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Профиль</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Сохранить</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Новый</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Удалить</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Левый Стик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Вверх</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Влево</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Вправо</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Вниз</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Нажато</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Модификатор</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Диапазон</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Мёртвая зона: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Диапазон Модификатора: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Минус</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Захват</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Плюс</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Домой</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Движение 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Движение 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Основные Кнопки</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Правый Стик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Очистить</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[не задано]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Переключить кнопку</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation>Инвертировать кнопку</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Инвертировать оси</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Установить порог</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>Выберите значение между 0% и 100%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Задать Аналоговый Стик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>После нажатия на ОК, двигайте ваш джойстик горизонтально, а затем вертикально.
Чтобы инвертировать оси, сначала двигайте ваш джойстик вертикально, а затем горизонтально.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Инвертировать оси</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Мёртвая зона: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Диапазон Модификатора: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Контроллер Pro</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Двойные Joycon&apos;ы</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Левый Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Правый Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Портативный</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>Контроллер GameCube</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation>Poke Ball Plus</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation>Контроллер NES</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation>Контроллер SNES</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation>Контроллер N64</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation>Sega Genesis</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Старт / Пауза</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Управляющий Стик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C-Стик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Встряхните!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[ожидание]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Новый Профиль</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Введите имя профиля:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Создать Профиль Управления</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Заданное имя профиля недействительно!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>Не удалось создать профиль управления &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Удалить Профиль Управления</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>Не удалось удалить профиль управления &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Загрузить профиль управления</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>Не удалось загрузить профиль управления &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Сохранить Профиль Управления</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>Не удалось сохранить профиль управления &quot;%1&quot;</translation>
</message>
@@ -2080,85 +2221,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Настроить Движение / Нажатие</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Движение Мыши</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Чувствительность:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Нажатие</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>Калибрация UDP:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Настроить</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Использовать привязки кнопок:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation>Коснитесь из профиля кнопки:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>Настройка CemuhookUDP</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Вы можете использовать любой совместимый с Cemuhook ввод UDP для движения и нажатий</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Сервер:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Порт:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Узнать Больше</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Тест</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Добавить Сервер</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Удалить Сервер</translation>
</message>
@@ -2168,146 +2299,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Узнать Больше&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Номер порта содержит недопустимые символы</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Порт должен быть в районе от 0 до 65353</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP-адрес недействителен</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Этот UDP сервер уже существует</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>Невозможно добавить более 8 серверов</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Тестирование</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Настройка</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Тест Успешен</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Успешно получена информация с сервера</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Тест Провален</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Не удалось получить действительные данные с сервера.&lt;br&gt;Убедитесь, что сервер правильно настроен, а также проверьте адрес и порт.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>Тест UDP или калибрация в процессе.&lt;br&gt;Пожалуйста, подождите завершения.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Настроить Мышь</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Кнопки на Мыши</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Передняя:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Задняя:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Левая:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Средняя:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Правая:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Очистить</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>По умолчанию</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[не задано]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Вернуть настройки по умолчанию</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[нажмите кнопку]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -2410,7 +2477,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>Расш. Графика</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2594,12 +2661,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>Ошибка при изменении размера изображения пользователя</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>Невозможно изменить размер изображения</translation>
</message>
</context>
<context>
@@ -3028,7 +3095,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="478"/>
<source>d MMM yyyy h:mm:ss AP</source>
- <translation>д МММ гггг ч:мм:сс AP</translation>
+ <translation>d MMM yyyy h:mm:ss AP</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="515"/>
@@ -3090,31 +3157,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Автоматическая замена профиля контроллера</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>Зациклить скрипт</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>Приостановить выполнение во время загрузки</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Папка для скриптов</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Путь</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3127,7 +3189,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>Настройка TAS</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>Выбрать папку загрузки TAS...</translation>
</message>
@@ -3189,37 +3251,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Новый Профиль</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Введите имя вашего нового профиля.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Удалить Профиль</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Удалить профиль %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Переименовать Профиль</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Новое название:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[нажмите кнопку]</translation>
</message>
@@ -3639,12 +3701,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Контроллер P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Контроллер P1</translation>
</message>
@@ -3652,90 +3714,95 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Анонимные данные собираются&lt;/a&gt; для улучшения yuzu. &lt;br/&gt;&lt;br/&gt;Хотели бы вы делиться данными об использовании с нами?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Телеметрия</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Загрузка Веб-Апплета...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Отключить Веб-Апплет</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Отключение веб-апплета приведет к тому, что он больше не будет появляться до конца текущей сессии эмуляции. Это может привести к неожиданному поведению и должно использоваться только в Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Количество создаваемых шейдеров на данный момент</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>Текущий выбранный множитель масштабирования разрешения.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Количество кадров в секунду в данный момент. Значение будет меняться от игры к игре и от сцене к сцене.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Время, которое нужно для эмуляции 1 кадра Switch, не принимая во внимание ограничение FPS или v-sync. Для полноскоростной эмуляции значение должно быть не больше 16,67 мс.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Обнаружена недопустимая конфигурация</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>ДОК</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Очистить Недавние Файлы</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>Запись TAS</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Продолжить</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>Перезаписать файл игрока 1?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Пауза</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3786,351 +3853,346 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Произошла неизвестная ошибка. Пожалуйста, проверьте лог для подробностей.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-х битный)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-х битный)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Запустить</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Данные Сохранений</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Данные Модов</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Ошибка при Открытии Папки %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Папка не существует!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Ошибка при открытии переносного кэша шейдеров</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>Не удалось создать папку кэша шейдеров для этой игры.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Содержание</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Обновление</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>Загружаемый Контент</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Удалить Запись</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Удалить Установленную Игру %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Успешно Удалено</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Установленная базовая игра успешно удалена.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Ошибка при Удалении %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Базовая игра не установлена в NAND и не может быть удалена.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Установленное обновление успешно удалено.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Для этой игры нету обновлений.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Для этой игры нет установленного загружаемого контента.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Успешно удалено %1 загружаемого контента.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>Удалить переносной кэш шейдеров OpenGL?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Удалить переносной кэш шейдеров Vulkan?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>Удалить весь переносной кэш шейдеров?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Удалить Пользовательскую Настройку Игры?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Удалить Файл</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Ошибка при удалении переносного кэша шейдеров</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Кэш шейдеров для этой игры не существует.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Переносной кэш шейдеров успешно удалён.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Не удалось удалить переносной кэш шейдеров.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>Ошибка при удалении переносного кэша шейдеров</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>Переносной кэш шейдеров успешно удален.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>Ошибка при удалении папки переносного кэша шейдеров.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Ошибка при Удалении Пользовательской Настройки</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Пользовательская настройка для этой игры не существует.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Пользовательская настройка игры успешно удалена.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Не удалось удалить пользовательскую настройку игры.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>Не Удалось Извлечь RomFS!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Полный</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Структура</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Выберите Режим Дампа RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. &lt;br&gt;Полный скопирует все файлы в новую папку, в то время как &lt;br&gt;структура создаст только структуру папок.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation>В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция &gt; Настройка &gt; Система &gt; Файловая система &gt; Корень Дампа</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Извлечение RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>Извлечение RomFS Прошло Успешно!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Операция выполнена.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Ошибка Открытия %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Выбрать папку</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Свойства</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Не удалось загрузить свойства игры.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Исполняемый файл Switch (%1);;Все файлы (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Загрузить файл</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Открыть папку извлечённого ROM&apos;а</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Выбрана недопустимая папка</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Папка, которую вы выбрали, не содержит «основного» файла.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Устанавливаемый Файл Switch (*.nca, *.nsp, *.xci);;Архив Контента Nintendo (*.nca);;Пакет Подачи Nintendo (*.nsp);;Образ Картриджа NX (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Установить Файлы</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>Остался %n файл</numerusform><numerusform>Осталось %n файл(ов)</numerusform><numerusform>Осталось %n файл(ов)</numerusform><numerusform>Осталось %n файл(ов)</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Установка файла &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Установить Результаты</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать базовые игры на NAND.
Пожалуйста, используйте эту функцию только для установки обновлений и DLC.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n файл был недавно установлен
@@ -4140,7 +4202,7 @@ Please, only use this feature to install updates and DLC.</source>
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n файл был перезаписан
@@ -4150,7 +4212,7 @@ Please, only use this feature to install updates and DLC.</source>
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n файл(ов) не удалось установить
@@ -4160,295 +4222,367 @@ Please, only use this feature to install updates and DLC.</source>
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Системное Приложение</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Системный Архив</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Обновление Системного Приложения</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Пакет Прошивки (Тип А)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Пакет Прошивки (Тип Б)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Игра</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Обновление Игры</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Загружаемый Контент Игры</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Дельта-Титул</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Выберите Тип Установки NCA...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA:
(В большинстве случаев, подходит стандартный выбор «Игра».)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Ошибка Установки</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Тип приложения, который вы выбрали для NCA, недействителен.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Файл не найден</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Файл &quot;%1&quot; не найден</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Продолжить</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>ОК</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Отсутствует Аккаунт yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Чтобы отправить отчет о совместимости игры, необходимо привязать свою учетную запись yuzu.&lt;br&gt;&lt;br/&gt;Чтобы привязать свою учетную запись yuzu, перейдите в раздел Эмуляция &amp;gt; Настройка &amp;gt; Веб.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Ошибка при открытии URL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Не удалось открыть URL: &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>Запись TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Перезаписать файл игрока 1?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Файл Amiibo (%1);; Все Файлы (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Загрузить Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Ошибка открытия файла данных Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Невозможно открыть файл Amiibo &quot;%1&quot; для чтения.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Ошибка чтения файла данных Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Невозможно полностью прочитать данные Amiibo. Ожидалось прочитать %1 байт, но удалось прочитать только %2 байт.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Ошибка загрузки данных Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Невозможно загрузить данные Amiibo.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Сделать Скриншот</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>Изображение PNG (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>Состояние TAS: Выполняется %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>Состояние TAS: Записывается %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation>Состояние TAS: Простой %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>Состояние TAS: Неверный</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation>&amp;Остановка</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Начать</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation>Закончить з&amp;апись</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation>З&amp;апись</translation>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>Постройка: %n шейдер(ов)</numerusform><numerusform>Постройка: %n шейдер(ов)</numerusform><numerusform>Постройка: %n шейдер(ов)</numerusform><numerusform>Постройка: %n шейдер(ов)</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>Масштаб: %1x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Скорость: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Скорость: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>Игра: %1 FPS (Неограниченно)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Игра: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Кадр: %1 мс</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>ГП НОРМАЛЬНО</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>ГП ВЫСОКО</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>ГП ЭКСТРИМ</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>ГП ОШИБКА</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation>БЛИЖАЙШИЙ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation>БИЛИНЕЙНЫЙ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation>БИКУБИЧЕСКИЙ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>ГАУСС</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation>SCALEFORCE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation>FSR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>БЕЗ СГЛАЖИВАНИЯ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Игра, которую вы пытаетесь загрузить, требует, чтобы дополнительные файлы были сдамплены с вашего Switch перед началом игры. &lt;br/&gt;&lt;br/&gt;Для получения дополнительной информации о дампе этих файлов см. следующую вики: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Дамп Системных Архивов и Общих Шрифтов с консоли&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;Хотите вернуться к списку игр? Продолжение эмуляции может привести к сбоям, повреждению сохраненных данных или другим ошибкам.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu не удалось найти системный архив Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu не удалось найти системный архив Switch: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Системный Архив Не Найден</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Отсутствует Системный Архив</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu не удалось найти общие шрифты Switch. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Общие Шрифты Не Найдены</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Общие Шрифты Отсутствуют</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Фатальная Ошибка</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu столкнулся с фатальной ошибкой, смотрите подробности в журнале. Информацию о доступе к журналу можно найти на этой странице: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Как Отправить Файл Журнала&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Желаете вернуться к списку игр? Продолжение эмуляции может привести к сбоям, повреждению сохраненных данных или другим ошибкам.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Произошла Фатальная Ошибка</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Подтвердите Перерасчет Ключа</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4465,37 +4599,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
Это удалит ваши автоматически сгенерированные файлы ключей и повторно запустит модуль расчета ключей.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Отсутствуют предохранители</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- Отсутствует BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- Отсутствует BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- Отсутствует PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Компоненты Расчета Отсутствуют</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Отсутствуют компоненты, что может помешать завершению процесса получения ключей. &lt;br&gt;Пожалуйста, следуйте &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;краткому руководство пользователя yuzu&lt;/a&gt;, чтобы получить все ваши ключи и игры.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>Ключи шифрования отсутствуют. &lt;br&gt;Пожалуйста, следуйте &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;краткому руководству пользователя yuzu&lt;/a&gt;, чтобы получить ключи, прошивку и игры.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4504,39 +4638,39 @@ on your system&apos;s performance.</source>
от производительности вашей системы.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Получение Ключей</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Выберите Цель для Дампа RomFS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Пожалуйста, выберите, какой RomFS вы хотите сдампить.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Вы уверены, что хотите закрыть yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4548,38 +4682,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL не доступен!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu не был скомпилирован с поддержкой OpenGL.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Ошибка при инициализации OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>Ваш ГП может не поддерживать OpenGL, или у вас установлен устаревший графический драйвер.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>Ошибка при инициализации OpenGL 4.6!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>Ваш ГП может не поддерживать OpenGL 4.6, или у вас установлен устаревший графический драйвер.&lt;br&gt;&lt;br&gt;Рендерер GL:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>Ваш ГП может не поддерживать одно или несколько требуемых расширений OpenGL. Пожалуйста, убедитесь в том, что у вас установлен последний графический драйвер.&lt;br&gt;&lt;br&gt;Рендерер GL:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Неподдерживаемые расширения:&lt;br&gt;%2</translation>
</message>
@@ -4629,12 +4763,12 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="514"/>
<source>Open Save Data Location</source>
- <translation>Открыть Папку для Сохранений</translation>
+ <translation>Открыть папку для сохранений</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="515"/>
<source>Open Mod Data Location</source>
- <translation>Открыть Папку с Модами</translation>
+ <translation>Открыть папку для модов</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="517"/>
@@ -4941,190 +5075,205 @@ Screen.</source>
<translation>&amp;Эмуляция</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Вид</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Сбросить Размер Окна</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Отладка</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Сбросить Размер Окна до &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Сбросить Размер Окна до 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>Сбросить Размер Окна до &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>Сбросить Размер Окна до 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Сбросить Размер Окна до &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Сбросить Размер Окна до 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Отладка</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Инструменты</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation>&amp;TAS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Помощь</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;Установить Файлы в NAND...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>З&amp;агрузить Файл...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>Загрузить &amp;Папку...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>В&amp;ыход</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Начать</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Пауза</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Стоп</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Переинициализировать ключи...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;О yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>Режим &amp;Одного Окна</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>Нас&amp;троить...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>Отображать З&amp;аголовки Виджетов Дока</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>Показать &amp;Панель Поиска</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>Показать &amp;Панель Статуса</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Показать Панель Статуса</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>П&amp;олнокэранный</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Перезапустить</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>Загрузить &amp;Amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Сообщить о Совместимости</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>Открыть &amp;Страницу Модов</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>Открыть &amp;Краткое Руководство Пользователя</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;ЧАВО</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>Открыть &amp;Папку yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Сделать Скриншот</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>Настройка &amp;TAS...</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation>&amp;Настройка TAS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>Настроить Т&amp;екущую Игру...</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Начать</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation>&amp;Сброс</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation>З&amp;апись</translation>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5170,10 +5319,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>СТАРТ/ПАУЗА</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation>Зарядка</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5204,142 +5358,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[не задано]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Крестовина %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Ось %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Кнопка %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[неизвестно]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation>Влево</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation>Вправо</translation>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Клик 0</translation>
+ <source>Down</source>
+ <translation>Вниз</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Клик 1</translation>
+ <source>Up</source>
+ <translation>Вверх</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Клик 2</translation>
+ <source>Z</source>
+ <translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Клик 3</translation>
+ <source>R</source>
+ <translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Клик 4</translation>
+ <source>L</source>
+ <translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>Ось GC %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>Кнопка GC %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>Ось TAS %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation>Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation>L1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation>L2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation>L3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation>R1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation>R2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>TAS Кнопка %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation>R3</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Движение %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation>Круг</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1Кнопка %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation>Крестик</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>Движение SDL</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation>Квадрат</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Клик %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation>Треугольник</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation>Share</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation>[не определено]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation>[недопустимо]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation>%1%2Шляпа %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation>%1%2Ось %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation>%1%2Ось %3,%4,%5</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation>%1%2Движение %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation>%1%2Кнопка %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[не используется]</translation>
</message>
@@ -5380,7 +5614,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Контроллер Pro</translation>
</message>
@@ -5393,7 +5627,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>Двойные Joycon&apos;ы</translation>
</message>
@@ -5406,7 +5640,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Левый Joycon</translation>
</message>
@@ -5419,7 +5653,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Правый Joycon</translation>
</message>
@@ -5447,7 +5681,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Портативный</translation>
</message>
@@ -5568,7 +5802,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>Контроллер GameCube</translation>
</message>
@@ -5662,13 +5896,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>ОК</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts
index 242a39fa5..9331f18ed 100644
--- a/dist/languages/sv.ts
+++ b/dist/languages/sv.ts
@@ -652,7 +652,12 @@ avgjord kod.&lt;/div&gt;
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation type="unfinished"/>
</message>
@@ -932,67 +937,78 @@ avgjord kod.&lt;/div&gt;
<translation>Allmänt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Begränsa hastighetsprocent</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Flerkärnig CPU-emulering</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Godkänn avslut medans emulering pågår</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Fråga efter användare vid spelstart</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Pausa emulationen när fönstret är i bakgrunden</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Göm mus när inaktiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation type="unfinished"/>
</message>
@@ -1110,18 +1126,113 @@ avgjord kod.&lt;/div&gt;
<translation>Tänj över fönster</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Använd global bakgrundsfärg</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Sätt backgrundsfärg:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Bakgrundsfärg:</translation>
</message>
@@ -1190,27 +1301,32 @@ avgjord kod.&lt;/div&gt;
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Standard</translation>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>Standard</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
+ <source>2x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
+ <source>4x</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
<translation type="unfinished"/>
</message>
</context>
@@ -1538,8 +1654,8 @@ avgjord kod.&lt;/div&gt;
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Annat</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1548,66 +1664,75 @@ avgjord kod.&lt;/div&gt;
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation type="unfinished"/>
+ <source>Mouse</source>
+ <translation>Mus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Touchscreen</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Avancerat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Debugkontroller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Avancerat</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
+ <source>Configure</source>
+ <translation>Konfigurera</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
- <source>Touchscreen</source>
- <translation>Touchscreen</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Annat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Mus</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Rörelse / Touch</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
+ <source>Requires restarting yuzu</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
- <source>Configure</source>
- <translation>Konfigurera</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
+ <source>Enable XInput 8 player support (disables web applet)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Debugkontroller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
- <source>Requires restarting yuzu</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
- <source>Enable XInput 8 player support (disables web applet)</source>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Rörelse / Touch</translation>
+ </message>
</context>
<context>
<name>ConfigureInputPlayer</name>
@@ -1622,424 +1747,440 @@ avgjord kod.&lt;/div&gt;
<translation>Koppla kontroller</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Prokontroller</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>Dubbla Joycons</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Vänster Joycon</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Höger Joycon</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Handhållen</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Inmatningsenhet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Vilken som helst</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Tangentbord/Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Spara</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Ny</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Radera</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Vänster Spak</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Upp</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Vänster</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Höger</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Ner</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Tryckt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Modifierare</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Räckvidd</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Dödzon: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Modifieringsräckvidd: 0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Minus</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Fånga</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Pluss</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Hem</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Knappar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Höger Spak</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Dödzon: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Modifieringsräckvidd: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Prokontroller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Dubbla Joycons</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Vänster Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Höger Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Handhållen</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[väntar]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation type="unfinished"/>
</message>
@@ -2065,85 +2206,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Konfigurera Rörelse / Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Känslighet:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Touch</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Konfigurera</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Använd knappkartläggning:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP-konfigurering</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Du kan använda Cemuhook-kompatibla UDP-inmatningskällor för att förse rörelse- och touchinmatning.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Server:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Lär dig mer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation type="unfinished"/>
</message>
@@ -2153,146 +2284,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Lär dig mer&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Testar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Konfigurerar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test framgångsrikt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Tog emot data från servern framgångsrikt</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test misslyckades</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Kunde inte ta emot giltig data från servern.&lt;br&gt;Var vänlig verifiera att servern är korrekt uppsatt och att adressen och porten är korrekta.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP Test eller kalibreringskonfiguration är igång.&lt;br&gt;Var vänlig vänta för dem att slutföras.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Konfigurera Mus</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Musknappar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>Fram:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Bak:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Vänster:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Mitten:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Höger:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Rensa</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Standard</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[ej angett]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Återställ Standardvärden</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[tryck knapp]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3075,31 +3142,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation type="unfinished"/>
</message>
@@ -3112,7 +3174,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation type="unfinished"/>
</message>
@@ -3174,37 +3236,37 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Ny profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Skriv in namn för den nya profilen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Radera profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>Radera profil %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Döp om profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Nytt namn:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[tryck på tangent]</translation>
</message>
@@ -3624,12 +3686,12 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation type="unfinished"/>
</message>
@@ -3637,89 +3699,94 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonym data skickas &lt;/a&gt;För att förbättra yuzu. &lt;br/&gt;&lt;br/&gt;Vill du dela med dig av din användarstatistik med oss?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetri</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Laddar WebApplet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Mängden shaders som just nu byggs</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Nuvarande emuleringshastighet. Värden över eller under 100% indikerar på att emulationen körs snabbare eller långsammare än en Switch.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Hur många bilder per sekund som spelet just nu visar. Detta varierar från spel till spel och scen till scen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Tid det tar att emulera en Switch bild, utan att räkna med framelimiting eller v-sync. För emulering på full hastighet så ska det vara som mest 16.67 ms. </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCKAD</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
<translation type="unfinished"/>
</message>
<message>
@@ -3771,656 +3838,723 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r
<translation>Ett okänt fel har uppstått. Se loggen för mer information.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Spardata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod-data</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>Fel Öppnar %1 Mappen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Mappen finns inte!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Fel Under Öppning Av Överförbar Shadercache</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>Innehåll</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Uppdatera</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Ta bort katalog</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>Ta Bort Installerat Spel %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Framgångsrikt borttagen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Tog bort det installerade basspelet framgångsrikt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>Fel Under Borttagning Av %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Basspelet är inte installerat i NAND och kan inte tas bort.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Tog bort den installerade uppdateringen framgångsrikt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Det finns ingen uppdatering installerad för denna titel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Det finns inga DLC installerade för denna titel.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>Tog framgångsrikt bort den %1 installerade DLCn.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Ta Bort Anpassad Spelkonfiguration?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Radera fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Fel När Överförbar Shader Cache Raderades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>En shader cache för denna titel existerar inte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Raderade den överförbara shadercachen framgångsrikt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Misslyckades att ta bort den överförbara shadercache</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Fel När Anpassad Konfiguration Raderades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>En anpassad konfiguration för denna titel existerar inte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Tog bort den anpassade spelkonfigurationen framgångsrikt.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Misslyckades att ta bort den anpassade spelkonfigurationen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS Extraktion Misslyckades!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>Det uppstod ett fel vid kopiering av RomFS filer eller användaren avbröt operationen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Full</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Skelett</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>Välj RomFS Dump-Läge</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Välj hur du vill att RomFS ska dumpas. &lt;br&gt;Full kommer att kopiera alla filer i den nya katalogen medan &lt;br&gt;skelett bara skapar katalogstrukturen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>Extraherar RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS Extraktion Lyckades!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>Operationen var lyckad.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>Fel under öppning av %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Välj Katalog</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Egenskaper</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Spelegenskaperna kunde inte laddas.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch Körbar (%1);;Alla Filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Ladda Fil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Öppna Extraherad ROM-Katalog</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Ogiltig Katalog Vald</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Katalogen du har valt innehåller inte en &apos;main&apos;-fil.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Installera filer</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>Installerar Fil &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Installera resultat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Systemapplikation</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Systemarkiv</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Systemapplikationsuppdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Firmwarepaket (Typ A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Firmwarepaket (Typ B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Spel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Speluppdatering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Spel DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Titel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>Välj NCA-Installationsläge...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Välj vilken typ av titel du vill installera som:
(I de flesta fallen, standard &apos;Spel&apos; är bra.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Misslyckades med Installationen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>Den titeltyp du valt för NCA är ogiltig.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Filen hittades inte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Filen &quot;%1&quot; hittades inte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>yuzu Konto hittades inte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>För att skicka ett spelkompatibilitetstest, du måste länka ditt yuzu-konto.&lt;br&gt;&lt;br/&gt;För att länka ditt yuzu-konto, gå till Emulering &amp;gt, Konfigurering &amp;gt, Web.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>Fel när URL öppnades</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>Oförmögen att öppna URL:en &quot;%1&quot;.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo Fil (%1);; Alla Filer (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Ladda Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Fel öppnar Amiibo-datafilen</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>Kunde inte öppna Amiibo filen &quot;%1&quot; för läsning.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Fel vid läsning av Amiibo-datafil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Kan inte läsa Amiibo-data helt. Förväntas läsa %1 byte, men kunde bara läsa %2 byte.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Fel vid laddning av Amiibodata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Kan inte ladda Amiibodata.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Skärmdump</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG Bild (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Hastighet: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Hastighet: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Spel: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Ruta: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Spelet du försöker ladda kräver att ytterligare filer dumpas från din Switch innan du spelar.&lt;br/&gt;&lt;br/&gt;För mer information om dumpning av dessa filer, se följande wiki sida: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumpning System Arkiv och Delade Teckensnitt från en Switchkonsol&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vill du avsluta till spellistan? Fortsatt emulering kan leda till kraschar, skadad spara data och andra buggar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>yuzu kunde inte lokalisera ett Switchsystemarkiv. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>yuzu kunde inte lokalisera ett Switchsystemarkiv: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Systemarkivet Hittades Inte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Systemarkiv Saknas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>yuzu kunde inte lokalisera Switchens delade fonter. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Delade Teckensnitt Hittades Inte</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Delad Font Saknas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Dödligt Fel</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu stötte på ett dödligt fel, se loggen för mer information. För mer information om åtkomst till loggen, se följande sida: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Hur man Laddar upp Loggfilen&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Vill du avsluta till spellistan? Fortsatt emulering kan leda till kraschar, skadad spara data och andra buggar.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Allvarligt fel påträffat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Bekräfta Nyckel Rederivering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4437,37 +4571,37 @@ och eventuellt göra säkerhetskopior.
Detta raderar dina autogenererade nyckelfiler och kör nyckelderivationsmodulen.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Saknade säkringar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- Saknar BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- Saknar BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- Saknar PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Deriveringsdelar saknas</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Delar saknas som kan hindra nyckelderivering från att slutföras. &lt;br&gt;Var vänlig följ &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; för att få alla dina nycklar och spel.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4476,39 +4610,39 @@ Detta kan ta upp till en minut beroende
på systemets prestanda.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Härleda Nycklar</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>Välj RomFS Dumpa Mål</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Välj vilken RomFS du vill dumpa.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>Är du säker på att du vill stänga yuzu?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Är du säker på att du vill stoppa emuleringen? Du kommer att förlora osparade framsteg.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4520,38 +4654,38 @@ Vill du strunta i detta och avsluta ändå?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL inte tillgängligt!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu har inte komilerats med OpenGL support.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>Fel under initialisering av OpenGL!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation type="unfinished"/>
</message>
@@ -4912,190 +5046,205 @@ startskärmen.</translation>
<translation>&amp;Emulering</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Vyn</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
- <source>&amp;Tools</source>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Hjälp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>A&amp;vsluta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>&amp;Start</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Paus</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>&amp;Sluta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Visa Statusfält</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5137,10 +5286,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation type="unfinished"/>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5171,142 +5325,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[inte inställd]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hatt %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Axel %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Knapp %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[okänd]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Klick 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Klick 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Klick 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Klick 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Klick 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Axel %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC Knapp %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[oanvänd]</translation>
</message>
@@ -5347,7 +5581,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation type="unfinished"/>
</message>
@@ -5360,7 +5594,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation type="unfinished"/>
</message>
@@ -5373,7 +5607,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5386,7 +5620,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation type="unfinished"/>
</message>
@@ -5414,7 +5648,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation type="unfinished"/>
</message>
@@ -5535,7 +5769,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation type="unfinished"/>
</message>
@@ -5619,13 +5853,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation type="unfinished"/>
</message>
diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts
index 76ed1f336..34e20064b 100644
--- a/dist/languages/tr_TR.ts
+++ b/dist/languages/tr_TR.ts
@@ -256,7 +256,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="34"/>
<source>Accuracy:</source>
- <translation>Kesinlik:</translation>
+ <translation>Doğruluk:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="42"/>
@@ -266,7 +266,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="47"/>
<source>Accurate</source>
- <translation>Kesin</translation>
+ <translation>Doğru</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="52"/>
@@ -276,7 +276,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="63"/>
<source>We recommend setting accuracy to &quot;Auto&quot;.</source>
- <translation>Kesinlik ayarının &quot;Otomatik&quot; olmasını öneririz.</translation>
+ <translation>Doğruluk ayarının &quot;Otomatik&quot; olmasını öneririz.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="80"/>
@@ -286,7 +286,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="86"/>
<source>These settings reduce accuracy for speed.</source>
- <translation>Bu ayarlar daha hızlı bir deneyim için kesinliği azaltır.</translation>
+ <translation>Bu ayarlar daha hızlı bir deneyim için doğruluk oranını azaltır.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="96"/>
@@ -294,8 +294,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Bu seçenek FMA işlemlerinin kesinliğini azaltarak FMA desteklemeyen CPU&apos;larda hızı artırır.&lt;/div&gt;
-</translation>
+ &lt;div&gt;Bu seçenek FMA işlemlerinin doğruluğunu azaltarak FMA desteklemeyen CPU&apos;larda hızı artırır.&lt;/div&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="101"/>
@@ -308,8 +307,7 @@ p, li { white-space: pre-wrap; }
&lt;div&gt;This option improves the speed of some approximate floating-point functions by using less accurate native approximations.&lt;/div&gt;
</source>
<translation>
- &lt;div&gt;Bu seçenek bazı tahmini FP fonksiyonlarını daha az kesin tahminlerle hızlandırır&lt;/div&gt;
-</translation>
+ &lt;div&gt;Bu seçenek bazı tahmini FP fonksiyonlarını daha az doğru tahminlerle hızlandırır.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="113"/>
@@ -321,36 +319,39 @@ p, li { white-space: pre-wrap; }
<source>
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+Bu seçenek doğru olmayan yuvarlama fonksiyonları kullanarak 32 bit ASIMD FP fonksiyonlarını hızlandırır.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="125"/>
<source>Faster ASIMD instructions (32 bits only)</source>
- <translation type="unfinished"/>
+ <translation>Daha hızlı ASIMD komutları (yalnızca 32 bit)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="132"/>
<source>
&lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+Bu seçenek NaN kontrolünü kaldırarak hızı arttırır. Aynı zamanda bazı FP komutlarının doğruluğunu azaltacağını da göz önünde bulundurun.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="137"/>
<source>Inaccurate NaN handling</source>
- <translation type="unfinished"/>
+ <translation>Uygunsuz NaN kullanımı</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="144"/>
<source>
&lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+Bu seçenek belleğe yazma/okuma işlemlerindeki güvenlik kontrolünü kaldırarak hızı arttırır. Devre dışı bırakmak, oyunun emulatör belleğinde yazma/okuma yapmasına izin verir.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="149"/>
<source>Disable address space checks</source>
- <translation type="unfinished"/>
+ <translation>Adres boşluğu kontrolünü kapatır.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="174"/>
@@ -390,8 +391,7 @@ p, li { white-space: pre-wrap; }
<translation>
&lt;div style=&quot;white-space: nowrap&quot;&gt;Bu seçenek guest programın hafıza erişimini hızlandırır.&lt;/div&gt;
&lt;div style=&quot;white-space: nowrap&quot;&gt;Etkinleştirmek PageTable::pointer&apos;larının yayılmış koda erişimlerini sıralar.&lt;/div&gt;
- &lt;div style=&quot;white-space: nowrap&quot;&gt;Devre dışı bırakmak bütün hafıza erişimlerini Memory::Read/Memory::Write fonksiyonlarından geçmeye zorlar.&lt;/div&gt;
-</translation>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Devre dışı bırakmak bütün hafıza erişimlerini Memory::Read/Memory::Write fonksiyonlarından geçmeye zorlar.&lt;/div&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="48"/>
@@ -505,12 +505,15 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
&lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Bu seçenek guest programın hafıza erişimini hızlandırır.&lt;/div&gt;
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Bunu etkinleştirmek guest bellek okuma/yazma işlemlerinin doğrudan belleğe işlenmesini sağlayıp, Host&apos;un MMU&apos;sundan yararlanır.&lt;/div&gt;
+&lt;div style=&quot;white-space: nowrap&quot;&gt;Devre dışı bırakmak tüm bellek erişimlerinin Yazılım MMU Emülasyonu kullanmasını zorlar&lt;/div&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
<source>Enable Host MMU Emulation</source>
- <translation type="unfinished"/>
+ <translation>Host MMU Emülasyonunu Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="172"/>
@@ -548,7 +551,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="49"/>
<source>Enable Extended Logging**</source>
- <translation type="unfinished"/>
+ <translation>Uzatılmış Hata Kaydını Etkinleştir.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="59"/>
@@ -578,17 +581,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="101"/>
<source>When checked, it enables Nsight Aftermath crash dumps</source>
- <translation type="unfinished"/>
+ <translation>İşaretlendiğinde Nsight Aftermath çökme dökümlerini etkinleştirir.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="104"/>
<source>Enable Nsight Aftermath</source>
- <translation type="unfinished"/>
+ <translation>Nsight Aftermath&apos;ı Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="114"/>
<source>When checked, it disables the macro Just In Time compiler. Enabling this makes games run slower</source>
- <translation type="unfinished"/>
+ <translation>İşaretlendiğinde Makro JIT derleyicisini devre dışı bırakır. Bu seçeneği etkinleştirmek oyunların yavaş çalışmasına neden olur.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="117"/>
@@ -603,17 +606,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="127"/>
<source>Enable Shader Feedback</source>
- <translation type="unfinished"/>
+ <translation>Shader Geribildirimini Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="134"/>
<source>When checked, it executes shaders without loop logic changes</source>
- <translation type="unfinished"/>
+ <translation>İşaretlendiğinde shaderları döngü mantık değişimleri olmaksızın uygular</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="137"/>
<source>Disable Loop safety checks</source>
- <translation type="unfinished"/>
+ <translation>Döngü güvenliği kontrolünü devre dışı bırak</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="147"/>
@@ -623,12 +626,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="153"/>
<source>Enable FS Access Log</source>
- <translation type="unfinished"/>
+ <translation>FS Erişim Kaydını Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="160"/>
<source>Enable Verbose Reporting Services**</source>
- <translation type="unfinished"/>
+ <translation>Detaylı Raporlama Hizmetini Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="170"/>
@@ -653,10 +656,15 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="197"/>
<source>Enable Auto-Stub**</source>
+ <translation>Auto-Stub&apos;ı Etkinleştir</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**Bu yuzu kapandığında otomatik olarak eski haline dönecektir.</translation>
</message>
@@ -936,69 +944,80 @@ p, li { white-space: pre-wrap; }
<translation>Genel</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>FPS Sınırı</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
- <source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
+ <source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
+ <translation>Etkili olması için FPS Kısıtlayıcı Geçiş Kısayolu kullanmanız gerekir.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>FPS Sınırı</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>Hız Yüzdesini Sınırlandır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>Çok Çekirdekli CPU Emülasyonu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>Emülasyon devam ederken çıkışı onaylayın</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>Oyun başlatılırken kullanıcı verisi iste</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>Arka plana alındığında emülasyonu durdur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>Hareketsizlik durumunda imleci gizle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>Tüm Ayarları Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
- <translation type="unfinished"/>
+ <translation>Bu seçenek tüm genel ve oyuna özgü ayarları silecektir. Oyun dizinleri, profiller ve giriş profilleri silinmeyecektir. Devam etmek istiyor musunuz?</translation>
</message>
</context>
<context>
@@ -1021,7 +1040,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="64"/>
<source>Shader Backend:</source>
- <translation type="unfinished"/>
+ <translation>Shader Backend:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="92"/>
@@ -1051,7 +1070,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="176"/>
<source>Accelerate ASTC texture decoding</source>
- <translation type="unfinished"/>
+ <translation>ASTC kaplama çözümünü hızlandır</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="198"/>
@@ -1086,7 +1105,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="255"/>
<source>Exclusive Fullscreen</source>
- <translation type="unfinished"/>
+ <translation>Ayrılmış Tam Ekran</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="281"/>
@@ -1114,25 +1133,120 @@ p, li { white-space: pre-wrap; }
<translation>Ekrana Sığdır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>Çözünürlük:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [DENEYSEL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [DENEYSEL]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation>Pencereye Uyarlı Filtre:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation>En Yakın Komşu Algoritması</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation>Bilinear</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation>Bicubic</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>Gausyen</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>ScaleForce</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation>AMD&apos;s FidelityFX™️ Süper Çözünürlük [Yalnızca Vulkan için]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>Kenar Yumuşatma Yöntemi:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>Yok</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>Global arka plan rengini kullan</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>Arka plan rengini ayarla:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>Arkaplan Rengi:</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.cpp" line="34"/>
<source>GLASM (Assembly Shaders, NVIDIA Only)</source>
- <translation type="unfinished"/>
+ <translation>GLASM (Assembly Shaderları, Yalnızca NVIDIA için)</translation>
</message>
</context>
<context>
@@ -1180,7 +1294,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="95"/>
<source>Enables Fast GPU Time. This option will force most games to run at their highest native resolution.</source>
- <translation type="unfinished"/>
+ <translation>Hızlı GPU Saati&apos;ni etkinleştir. Bu seçenek çoğu oyunu en yüksek gerçek çözünürlükte çalıştırır. </translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="98"/>
@@ -1194,28 +1308,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>Varsayılan</translation>
+ <source>Automatic</source>
+ <translation>Otomatik</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (BİR ŞEYLERİ BOZACAK)</translation>
+ <source>Default</source>
+ <translation>Varsayılan</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (BİR ŞEYLERİ BOZACAK)</translation>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (BİR ŞEYLERİ BOZACAK)</translation>
+ <source>4x</source>
+ <translation>4x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (BİR ŞEYLERİ BOZACAK)</translation>
+ <source>8x</source>
+ <translation>8x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>16x</translation>
</message>
</context>
<context>
@@ -1542,8 +1661,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>Diğer</translation>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1552,499 +1671,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>Klavye Tuşlarıyla Analog Emülasyonu</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>Mouse ile kaydırmayı etkinleştir</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>Fare hassasiyeti </translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>Gelişmiş</translation>
+ <source>Mouse</source>
+ <translation>Fare</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>Dokunmatik Ekran</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>Fare</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Gelişmiş</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>Hareket / Dokunmatik</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>Hata Ayıklama Kontrolcüsü</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>Yapılandır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>Hata Ayıklama Kontrolcüsü</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Diğer</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>Klavye Tuşlarıyla Analog Emülasyonu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>Yuzu&apos;yu yeniden başlatmayı gerektirir </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>XInput 8 oyuncu desteğini etkinleştir (web uygulamasını devre dışı bırakır)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>Giriş&apos;i yapılandır</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>Kontrolcüyü Bağla</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>Mouse ile kaydırmayı etkinleştir</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Fare hassasiyeti </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>İkili Joyconlar</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>Sol Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Hareket / Dokunmatik</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>Sağ Joycon</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Giriş&apos;i yapılandır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>Handheld</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Kontrolcüyü Bağla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>Giriş Cihazı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>Herhangi</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>Klavye/Fare</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>Kaydet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>Yeni</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>Sil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>Sol Analog</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>Yukarı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>Sol</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>Sağ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>Aşağı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>Basılı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>Düzenleyici:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>Aralık</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>Ölü Bölge: %0</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>Düzenleyici Aralığı: %0</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>D-Pad</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>Eksi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>Kaydet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>Artı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>Hareket 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>Hareket 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>Ön Tuşlar</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>Sağ Analog</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>Temizle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[belirlenmedi]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>Tuş ayarla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>Ekseni ters çevir</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>Alt sınır ayarla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>%0 ve %100 arasında bir değer seçin</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>Analog Çubuğu Ayarla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>Tamama bastıktan sonra, joystikinizi önce yatay sonra dikey olarak hareket ettirin.
Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak hareket ettirin.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>Ekseni ters çevir</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>Ölü Bölge: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>Düzenleyici Aralığı: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>İkili Joyconlar</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Sol Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Sağ Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>Handheld</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube Kontrolcüsü</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>Başlat / Durdur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>Kontrol Çubuğu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
- <translation type="unfinished"/>
+ <translation>C-Çubuğu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>Salla!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[bekleniyor]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>Yeni Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>Bir profil ismi girin:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>Kontrol Profili Oluştur</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>Girilen profil ismi geçerli değil!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; kontrol profili oluşturulamadı </translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>Kontrol Profilini Kaldır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; kontrol profili kaldırılamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>Kontrol Profilini Yükle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; kontrol profili yüklenemedi</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>Kontrol Profilini Kaydet</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>&quot;%1&quot; kontrol profili kaydedilemedi</translation>
</message>
@@ -2070,85 +2214,75 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>Hareket / Dokunmatik Kontrollerini Ayarla</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>Fare Hareketi</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>Hassasiyet:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>Dokunmatik</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP Kalibrasyonu:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>Yapılandır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>Tuş ataması kullan:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP Yapılandırması</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>Hareket ve dokunma girişi için Cemuhook&apos;la uyumlu herhangi bir UDP giriş kaynağı kullanabilirsiniz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>Sunucu:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>Daha Fazla Bilgi Edinin</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>Test</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>Server Ekle</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>Server&apos;ı Kaldır</translation>
</message>
@@ -2158,146 +2292,82 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Daha Fazlası&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>Port numarasında geçersiz karakterler var</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>Port 0 ila 65353 aralığında olmalıdır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>IP adresi geçerli değil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>Bu UDP sunucusu zaten var</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>8&apos;den fazla server eklenemez</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>Test Ediliyor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>Yapılandırılıyor</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>Test Başarılı</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>Bilgi başarıyla sunucudan kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>Test Başarısız</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>Serverdan geçerli veri alınamadı.&lt;br&gt;Lütfen sunucunun doğru ayarlandığını ya da adres ve portun doğru olduğunu kontrol edin.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP testi ya da yapılandırılması devrede.&lt;br&gt;Lütfen bitmesini bekleyin.</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>Fareyi Yapılandır</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>Fare Tuşları</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>İleri:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>Arka:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>Sol:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>Orta:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>Sağ:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>Temizle</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>Varsayılanlar</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[belirlenmedi]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>Varsayılana Dön</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[tuşa bas]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -2400,7 +2470,7 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>Gelişmiş Grafikler</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2584,12 +2654,12 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>Kullanıcı görüntüsünü yeniden boyutlandırma hatası</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>Görüntü yeniden boyutlandırılamıyor</translation>
</message>
</context>
<context>
@@ -3051,22 +3121,22 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="11"/>
<source>TAS</source>
- <translation type="unfinished"/>
+ <translation>TAS</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; Kontrolcü girdilerini TAS-nx scriptleri ile aynı formatta okur. &lt;br/&gt;Daha detaylı bilgi için lütfen yuzu web sitesindeki &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt; yardım sayfasına&lt;/span&gt;&lt;/a&gt;bakınız.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
<source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
- <translation type="unfinished"/>
+ <translation>Hangi kısayolların Yeniden Oynatma/Kayıt fonksiyonunu kontrol ettiğini öğrenmek için Kısayol Ayarlarına bakın. (Yapılandır -&gt; Genel -&gt; Kısayollar)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
<source>WARNING: This is an experimental feature.&lt;br/&gt;It will not play back scripts frame perfectly with the current, imperfect syncing method.</source>
- <translation type="unfinished"/>
+ <translation>UYARI: Bu deneysel bir özelliktir.&lt;br/&gt; Halihazırdaki kusurlu eşzamanlama yöntemi sebebiyle, scriptleri mükemmel olarak oynatmayacaktır.</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="51"/>
@@ -3076,35 +3146,30 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="57"/>
<source>Enable TAS features</source>
- <translation type="unfinished"/>
+ <translation>TAS özelliklerini Etkinleştir</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>Otomatik kontrolcü profili değiştirme</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
- <translation type="unfinished"/>
+ <translation>Döngü komut dosyası</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
- <translation type="unfinished"/>
+ <translation>Yüklemeler sırasında yürütmeyi duraklat</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>Script Konumu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>Konum</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3114,12 +3179,12 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har
<message>
<location filename="../../src/yuzu/configuration/configure_tas.cpp" line="20"/>
<source>TAS Configuration</source>
- <translation type="unfinished"/>
+ <translation>TAS Yapılandırması</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
- <translation type="unfinished"/>
+ <translation>Tas Yükleme Dizini Seçin</translation>
</message>
</context>
<context>
@@ -3179,37 +3244,37 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>Yeni Profil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>Yeni profil için bir isim giriniz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>Profili Sil</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>%1 adlı profili silmek istediğinize emin misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>Profili Yeniden Adlandır</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>Yeni Ad:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[tuşa basın]</translation>
</message>
@@ -3487,7 +3552,7 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne
<message>
<location filename="../../src/yuzu/configuration/configure_vibration.ui" line="502"/>
<source>Enable Accurate Vibration</source>
- <translation type="unfinished"/>
+ <translation>Doğru Titreşimi Etkinleştir</translation>
</message>
</context>
<context>
@@ -3629,12 +3694,12 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Kontrolcü O1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Kontrolcü O1</translation>
</message>
@@ -3642,90 +3707,95 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Yuzuyu geliştirmeye yardımcı olmak için &lt;/a&gt; anonim veri toplandı. &lt;br/&gt;&lt;br/&gt;Kullanım verinizi bizimle paylaşmak ister misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>Telemetri</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>Web Uygulaması Yükleniyor...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>Web Uygulamasını Devre Dışı Bırak</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>Web uygulamasını devre dışı bırakmak emülasyon seansının sonuna kadar bir daha gösterilmemesine sebep olur. Bu, belirsiz davranışlara sebep olabilir ve sadece Super Mario 3D All-Stars&apos;da kullanılmalıdır. Web uygulamasını devre dışı bırakmak istediğinize emin misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>Şu anda derlenen shader miktarı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>Geçerli seçili çözünürlük ölçekleme çarpanı.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>Geçerli emülasyon hızı. %100&apos;den yüksek veya düşük değerler emülasyonun bir Switch&apos;den daha hızlı veya daha yavaş çalıştığını gösterir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>Oyunun şuanda saniye başına kaç kare gösterdiği. Bu oyundan oyuna ve sahneden sahneye değişiklik gösterir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>Bir Switch karesini emüle etmekte geçen zaman, karelimitleme ve v-sync hariç. Tam hız emülasyon için bu en çok 16,67 ms olmalı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>Geçersiz yapılandırma tespit edildi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>Handheld kontrolcü dock modunda kullanılamaz. Pro kontrolcü seçilecek.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>DOCK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>&amp;Son Dosyaları Temizle</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>&amp;Devam Et</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>Oyuncu 1&apos;in dosyasının üstüne yazılsın mı?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3776,351 +3846,346 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne
<translation>Bilinmeyen bir hata oluştu. Lütfen daha fazla detay için kütüğe göz atınız.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>Başlat</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>Kayıt Verisi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod Verisi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>%1 klasörü açılırken hata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>Klasör mevcut değil!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>Transfer Edilebilir Shader Cache&apos;ini Açarken Bir Hata Oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>Bu oyun için shader cache konumu oluşturulamadı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>İçerikler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>Güncelleme</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>Girdiyi Kaldır</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>%1 Adlı Oyunu Kaldırmak İstediğinize Emin Misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>Başarıyla Kaldırıldı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>Yüklenmiş oyun başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>%1 Adlı Oyun Kaldırılırken Bir Hata Oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>Asıl oyun NAND&apos;de kurulu değil ve kaldırılamaz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>Yüklenmiş güncelleme başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>Bu oyun için yüklenmiş bir güncelleme yok.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>Bu oyun için yüklenmiş bir DLC yok.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>%1 yüklenmiş DLC başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>OpenGL Transfer Edilebilir Shader Cache&apos;ini Kaldırmak İstediğinize Emin Misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>Vulkan Transfer Edilebilir Shader Cache&apos;ini Kaldırmak İstediğinize Emin Misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>Tüm Transfer Edilebilir Shader Cache&apos;leri Kaldırmak İstediğinize Emin Misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>Oyuna Özel Yapılandırmayı Kaldırmak İstediğinize Emin Misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>Dosyayı Sil</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>Transfer Edilebilir Shader Cache Kaldırılırken Bir Hata Oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>Bu oyun için oluşturulmuş bir shader cache yok.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>Transfer edilebilir shader cache başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>Transfer edilebilir shader cache kaldırılamadı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>Transfer Edilebilir Shader Cache&apos;ler Kaldırılırken Bir Hata Oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>Transfer edilebilir shader cacheler başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>Transfer edilebilir shader cache konumu kaldırılamadı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>Oyuna Özel Yapılandırma Kaldırılırken Bir Hata Oluştu.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>Bu oyun için bir özel yapılandırma yok.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>Oyuna özel yapılandırma başarıyla kaldırıldı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>Oyuna özel yapılandırma kaldırılamadı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS Çıkartımı Başarısız!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>RomFS dosyaları kopyalanırken bir hata oluştu veya kullanıcı işlemi iptal etti.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>Full</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>Gövde</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>RomFS Dump Modunu Seçiniz</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>Lütfen RomFS&apos;in nasıl dump edilmesini istediğinizi seçin.&lt;br&gt;&quot;Full&quot; tüm dosyaları yeni bir klasöre kopyalarken &lt;br&gt;&quot;skeleton&quot; sadece klasör yapısını oluşturur.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
- <translation type="unfinished"/>
+ <translation>%1 konumunda RomFS çıkarmaya yetecek alan yok. Lütfen yer açın ya da Emülasyon &gt; Yapılandırma &gt; Sistem &gt; Dosya Sistemi &gt; Dump konumu kısmından farklı bir çıktı konumu belirleyin.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>RomFS çıkartılıyor...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS Çıkartımı Başarılı!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>İşlem başarıyla tamamlandı.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>%1 Açılırken Bir Hata Oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>Klasör Seç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>Özellikler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>Oyun özellikleri yüklenemedi.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch Çalıştırılabilir Dosyası (%1);;Tüm Dosyalar (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>Dosya Aç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>Çıkartılmış ROM klasörünü aç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>Geçersiz Klasör Seçildi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>Seçtiğiniz klasör bir &quot;main&quot; dosyası içermiyor.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>Yüklenilebilir Switch Dosyası (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>Dosya Kur</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>%n dosya kaldı</numerusform><numerusform>%n dosya kaldı</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>&quot;%1&quot; dosyası kuruluyor...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>Kurulum Sonuçları</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>Olası çakışmaları önlemek için oyunları NAND&apos;e yüklememenizi tavsiye ediyoruz.
Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın.</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>%n dosya güncel olarak yüklendi
@@ -4128,7 +4193,7 @@ Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın.</tran
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n dosyanın üstüne yazıldı
@@ -4136,7 +4201,7 @@ Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın.</tran
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n dosya yüklenemedi
@@ -4144,295 +4209,367 @@ Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın.</tran
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>Sistem Uygulaması</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>Sistem Arşivi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>Sistem Uygulama Güncellemesi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>Yazılım Paketi (Tür A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>Yazılım Paketi (Tür B)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>Oyun</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>Oyun Güncellemesi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>Oyun DLC&apos;si</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Başlık</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>NCA Kurulum Tipi Seçin...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>Lütfen bu NCA dosyası için belirlemek istediğiniz başlık türünü seçiniz:
(Çoğu durumda, varsayılan olan &apos;Oyun&apos; kullanılabilir.)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>Kurulum Başarısız Oldu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>NCA için seçtiğiniz başlık türü geçersiz</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>Dosya Bulunamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>Dosya &quot;%1&quot; Bulunamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>&amp;Devam Et</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>Tamam</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>Kayıp yuzu Hesabı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>Oyun uyumluluk test çalışması göndermek için öncelikle yuzu hesabınla giriş yapmanız gerekiyor.&lt;br&gt;&lt;br/&gt;Yuzu hesabınızla giriş yapmak için, Emülasyon &amp;gt; Yapılandırma &amp;gt; Web&apos;e gidiniz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>URL açılırken bir hata oluştu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>URL &quot;%1&quot; açılamıyor.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>TAS kayıtta</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>Oyuncu 1&apos;in dosyasının üstüne yazılsın mı?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo Dosyası (%1);; Tüm Dosyalar (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>Amiibo Yükle</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>Amiibo veri dosyasını açarken hata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>&quot;%1&quot; Amiibo dosyası okunamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>Amiibo veri dosyasını okurken hata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>Amiibo verisi tamamen okunamadı. %1 byte okunması bekleniyordu, fakat bunun sadece %2&apos;si okunabildi.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>Amiibo verisi yüklenirken hata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>Amiibo verisi yüklenemedi</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>Ekran Görüntüsü Al</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG görüntüsü (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
- <translation type="unfinished"/>
+ <translation>TAS durumu: %1%2 çalışıyor</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
- <translation type="unfinished"/>
+ <translation>TAS durumu: %1 kaydediliyor</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
- <translation type="unfinished"/>
+ <translation>TAS durumu: %1%2 boşta</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
+ <translation>TAS durumu: Geçersiz</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>Oluşturuluyor: %n shader</numerusform><numerusform>Oluşturuluyor: %n shader</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>Ölçek: %1x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>Hız %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>Hız: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>Oyun: %1 FPS (Sınırsız)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>Oyun: %1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>Kare: %1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU YÜKSEK</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EKSTREM</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU HATASI</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation>EN YAKIN</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation>BILINEAR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation>BICUBIC</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>GAUSYEN</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation>SCALEFORCE</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation>FSR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>NO AA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Yüklemeye çalıştığınız oyun oynanmadan önce Switch&apos;inizden ek dosyaların alınmasını gerektiriyor.&lt;br/&gt;&lt;br/&gt;Bu dosyaları nasıl alacağınız hakkında daha fazla bilgi için, lütfen bu wiki sayfasına göz atınız: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Konsolunuzdan Sistem Arşivleri ve Shared Fontları Almak&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;oyun listesine geri dönmek ister misiniz? Emülasyona devam etmek çökmelere, kayıt dosyalarının bozulmasına veya başka hatalara sebep verebilir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>Yuzu bir Switch sistem arşivi bulamadı. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>Yuzu bir Switch sistem arşivi bulamadı: %1. %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>Sistem Arşivi Bulunamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>Sistem Arşivi Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>Yuzu Switch shared fontlarını bulamadı. %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>Shared Font&apos;lar Bulunamadı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>Shared Font Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>Önemli Hata</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>Yuzu önemli bir hatayla karşılaştı, lütfen daha fazla detay için kütüğe bakınız. Kütüğe erişmek hakkında daha fazla bilgi için, lütfen bu sayfaya göz atınız: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Log Dosyası Nasıl Yüklenir&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Oyun listesine geri dönmek ister misiniz? Emülasyona devam etmek çökmelere, kayıt dosyalarının bozulmasına veya başka hatalara sebep olabilir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>Önemli Bir Hatayla Karşılaşıldı</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>Anahtar Yeniden Türetimini Onayla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4449,37 +4586,37 @@ ve opsiyonel olarak yedekler alın.
Bu sizin otomatik oluşturulmuş anahtar dosyalarınızı silecek ve anahtar türetme modülünü tekrar çalıştıracak.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>Anahtarlar Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- BOOT0 Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation>- BCPKG2-1-Normal-Main Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- PRODINFO Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>Türeten Bileşenleri Kayıp</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>Bazı bileşenler kayıp, bu anahtar türetimini yarıda bırakabilir.&lt;br&gt;Lütfen tüm anahtar ve oyunlarınıza erişmek için&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;Yuzu Hızlı Başlangıç Kılavuzu&lt;/a&gt;&apos;nu takip edin&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>Şifreleme anahtarları eksik. &lt;br&gt;Lütfen takip edin&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu hızlı başlangıç kılavuzunu&lt;/a&gt;tüm anahtarlarınızı, aygıt yazılımınızı ve oyunlarınızı almada.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4488,39 +4625,39 @@ Bu sistem performansınıza bağlı olarak
bir dakika kadar zaman alabilir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>Anahtarlar Türetiliyor</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>RomFS Dump Hedefini Seçiniz</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>Lütfen dump etmek istediğiniz RomFS&apos;i seçiniz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>yuzu&apos;yu kapatmak istediğinizden emin misiniz?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>Emülasyonu durdurmak istediğinizden emin misiniz? Kaydedilmemiş veriler kaybolur.</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4532,38 +4669,38 @@ Görmezden gelip kapatmak ister misiniz?</translation>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL kullanıma uygun değil!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>Yuzu OpenGL desteklememektedir.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>OpenGl başlatılırken bir hata oluştu!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>GPU&apos;nuz OpenGL desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz.</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>OpenGl 4.6 başlatılırken bir hata oluştu!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>GPU&apos;nuz OpenGL 4.6&apos;yı desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>GPU&apos;nuz gereken bir yada daha fazla OpenGL eklentisini desteklemiyor Lütfen güncel bir grafik sürücüsüne sahip olduğunuzdan emin olun.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt; Desteklenmeyen Eklentiler:&lt;br&gt;%2</translation>
</message>
@@ -4674,7 +4811,7 @@ Görmezden gelip kapatmak ister misiniz?</translation>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="530"/>
<source>Dump RomFS to SDMC</source>
- <translation type="unfinished"/>
+ <translation>RomFS&apos;i SDMC&apos;ye çıkar.</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="531"/>
@@ -4928,197 +5065,212 @@ Screen.</source>
<translation>&amp;Emülasyon</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>&amp;Görünüm</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>&amp;Pencere Boyutunu Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>&amp;Hata Ayıklama</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>Pencere Boyutunu &amp;720p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>Pencere Boyutunu 720p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>Pencere Boyutunu &amp;900p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>Pencere Boyutunu 900p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>Pencere Boyutunu &amp;1080p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>Pencere Boyutunu 1080p&apos;ye Sıfırla</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>&amp;Hata Ayıklama</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>&amp;Aletler</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>&amp;Yardım</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;NAND&apos;e Dosya Kur...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>&amp;Dosyayı Yükle...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>&amp;Klasörü Yükle...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>&amp;Çıkış</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>B&amp;aşlat</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>&amp;Duraklat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>Du&amp;rdur</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>&amp;Anahtarları Yeniden Kur...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>&amp;Yuzu Hakkında</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>&amp;Tek Pencere Modu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>&amp;Yapılandır...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
- <translation type="unfinished"/>
+ <translation>D&amp;ock Widget Başlıkları&apos;nı Göster</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
- <translation type="unfinished"/>
+ <translation>&amp;Filtre Çubuğu&apos;nu Göster</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
- <translation type="unfinished"/>
+ <translation>&amp;Durum Çubuğu&apos;nu Göster</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>Durum Çubuğunu Göster</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>&amp;Tam Ekran</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>&amp;Yeniden Başlat</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>&amp;Amiibo Yükle...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>&amp;Uyumluluk Bildir</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>&amp;Mod Sayfasını Aç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>&amp;Hızlı Başlangıç Kılavuzunu Aç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>&amp;SSS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>&amp;yuzu Klasörünü Aç</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>&amp;Ekran Görüntüsü Al</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>&amp;Geçerli Oyunu Yapılandır...</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>B&amp;aşlat</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
<message>
<location filename="../../src/yuzu/debugger/profiler.cpp" line="51"/>
<source>&amp;MicroProfile</source>
- <translation type="unfinished"/>
+ <translation>&amp;MicroProfile</translation>
</message>
</context>
<context>
@@ -5157,10 +5309,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>BAŞLAT/DURDUR</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5191,142 +5348,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[belirlenmedi]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>Hat %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Eksen %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>Tuş %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[bilinmeyen]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>Tıklama 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>Tıklama 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>Tıklama 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>Tıklama 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>Tıklama 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>OK Eksen %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>OK Tuş %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>Hareket %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1Tuş %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1Tıklama %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[kullanılmayan]</translation>
</message>
@@ -5367,7 +5604,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5380,7 +5617,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>İkili Joyconlar</translation>
</message>
@@ -5393,7 +5630,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>Sol Joycon</translation>
</message>
@@ -5406,7 +5643,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>Sağ Joycon</translation>
</message>
@@ -5434,7 +5671,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>Handheld</translation>
</message>
@@ -5555,7 +5792,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>GameCube Kontrolcüsü</translation>
</message>
@@ -5649,13 +5886,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>Tamam</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>İptal</translation>
</message>
@@ -5725,7 +5962,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="253"/>
<source>runnable</source>
- <translation type="unfinished"/>
+ <translation>çalışabilir</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="255"/>
@@ -5760,7 +5997,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="276"/>
<source>waiting for suspend resume</source>
- <translation type="unfinished"/>
+ <translation>askıdaki işlemin sürdürülmesi bekleniyor</translation>
</message>
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="279"/>
@@ -5846,7 +6083,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/debugger/wait_tree.cpp" line="468"/>
<source>&amp;Wait Tree</source>
- <translation type="unfinished"/>
+ <translation>&amp;Wait Tree</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts
new file mode 100644
index 000000000..2f6213e1d
--- /dev/null
+++ b/dist/languages/vi_VN.ts
@@ -0,0 +1,6044 @@
+<?xml version="1.0" ?><!DOCTYPE TS><TS language="vi_VN" sourcelanguage="en_US" version="2.1">
+<context>
+ <name>AboutDialog</name>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="14"/>
+ <source>About yuzu</source>
+ <translation>Thông tin về yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="30"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/icons/yuzu.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/icons/yuzu.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="60"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:28pt;&quot;&gt;yuzu&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:28pt;&quot;&gt;yuzu&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="73"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;%1 (%2)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;%1 (%2)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="86"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:12pt;&quot;&gt;yuzu is an experimental open-source emulator for the Nintendo Switch licensed under GPLv2.0.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;This software should not be used to play games you have not legally obtained.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;yuzu là một phần mềm giả lập thử nghiệm dưới dạng mã nguồn mở cho máy Nintendo Switch, được cấp phép theo giấy phép GPLv2.0.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;Bạn không được phép sử dụng phần mềm này để chơi những trò chơi mà bạn sở hữu một cách bất hợp pháp.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="118"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://yuzu-emu.org/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Website&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Source Code&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Contributors&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/blob/master/license.txt&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;License&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://yuzu-emu.org/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Trang web&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Mã nguồn&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/graphs/contributors&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Đóng góp&lt;/span&gt;&lt;/a&gt; | &lt;a href=&quot;https://github.com/yuzu-emu/yuzu/blob/master/license.txt&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;Giấy phép&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/aboutdialog.ui" line="134"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:7pt;&quot;&gt;&amp;quot;Nintendo Switch&amp;quot; is a trademark of Nintendo. yuzu is not affiliated with Nintendo in any way.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:7pt;&quot;&gt;&amp;quot;Nintendo Switch&amp;quot; là thương hiệu của Nintendo. yuzu không hề liên kết với Nintendo dưới bất kỳ hình thức nào.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>CalibrationConfigurationDialog</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="29"/>
+ <source>Communicating with the server...</source>
+ <translation>Đang giao tiếp với máy chủ...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="30"/>
+ <source>Cancel</source>
+ <translation>Huỷ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="48"/>
+ <source>Touch the top left corner &lt;br&gt;of your touchpad.</source>
+ <translation>Hãy chạm vào góc trên cùng&lt;br&gt;bên trái trên touchpad của bạn.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="51"/>
+ <source>Now touch the bottom right corner &lt;br&gt;of your touchpad.</source>
+ <translation>Giờ hãy chạm vào góc dưới cùng&lt;br&gt;bên phải trên touchpad của bạn.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="54"/>
+ <source>Configuration completed!</source>
+ <translation>Đã hoàn thành quá trình thiết lập!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="61"/>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+</context>
+<context>
+ <name>CompatDB</name>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="20"/>
+ <source>Report Compatibility</source>
+ <translation>Báo cáo tương thích</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="27"/>
+ <location filename="../../src/yuzu/compatdb.ui" line="63"/>
+ <source>Report Game Compatibility</source>
+ <translation>Báo cáo trò chơi tương thích</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="36"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Should you choose to submit a test case to the &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;yuzu Compatibility List&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, The following information will be collected and displayed on the site:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Hardware Information (CPU / GPU / Operating System)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Which version of yuzu you are running&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The connected yuzu account&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Nếu bạn chọn gửi bản kiểm tra vào &lt;/span&gt;&lt;a href=&quot;https://yuzu-emu.org/game/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;danh sách tương thích yuzu&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;, Thông tin sau sẽ được thu thập và hiển thị lên trang web:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;&quot;&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Thông tin phần cứng (CPU / GPU / Hệ điều hành)&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Phiên bản yuzu bạn đang chạy&lt;/li&gt;&lt;li style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Tài khoản yuzu đang kết nối&lt;/li&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="72"/>
+ <source>Perfect</source>
+ <translation>Tốt nhất</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="79"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions flawlessly with no audio or graphical glitches.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Có thể chơi một cách mượt mà mà không có lỗi âm thanh hoặc đồ họa nào.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="89"/>
+ <source>Great </source>
+ <translation>Tốt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="96"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Có thể chơi từ đầu đến cuối nhưng vẫn có một số lỗi nhỏ về đồ họa hoặc âm thanh. Có thể sẽ cần tới một vài tinh chỉnh nào đó.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="106"/>
+ <source>Okay</source>
+ <translation>Tạm ổn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="113"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions with major graphical or audio glitches, but game is playable from start to finish with workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tạm chơi được nhưng có lỗi đồ họa hoặc âm thanh một cách đáng kể, tuy vậy vẫn có thể chơi hết từ đầu đến cuối với một số tinh chỉnh.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="123"/>
+ <source>Bad</source>
+ <translation>Không tốt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="130"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Chơi được nhưng có nhiều lỗi đồ họa hoặc âm thanh. Không thể chơi tiếp ở một số nơi nào đó do lỗi dù có tinh chỉnh thế nào đi nữa.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="140"/>
+ <source>Intro/Menu</source>
+ <translation>Phần mở đầu/Menu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="147"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Hoàn toàn không thể chơi được do có nhiều lỗi đồ họa hoặc âm thanh. Không thể chơi tiếp sau khi bấm nút bắt đầu trò chơi.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="157"/>
+ <source>Won&apos;t Boot</source>
+ <translation>Không hoạt động</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="170"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The game crashes when attempting to startup.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Trò chơi sẽ thoát đột ngột khi khởi động.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="182"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Independent of speed or performance, how well does this game play from start to finish on this version of yuzu?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Không phụ thuộc vào tốc độ hay hiệu suất, trò chơi này chơi như thế nào từ đầu đến cuối trên phiên bản này của yuzu?&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.ui" line="206"/>
+ <source>Thank you for your submission!</source>
+ <translation>Cảm ơn bạn đã gửi đến cho chúng tôi!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.cpp" line="59"/>
+ <source>Submitting</source>
+ <translation>Đang gửi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.cpp" line="72"/>
+ <source>Communication error</source>
+ <translation>Đã xảy ra lỗi giao tiếp với máy chủ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.cpp" line="73"/>
+ <source>An error occurred while sending the Testcase</source>
+ <translation>Có lỗi xảy ra khi gửi Testcase</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/compatdb.cpp" line="75"/>
+ <source>Next</source>
+ <translation>Tiếp theo</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureAudio</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="20"/>
+ <source>Audio</source>
+ <translation>Âm thanh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="28"/>
+ <source>Output Engine:</source>
+ <translation>Đầu ra hệ thống:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="42"/>
+ <source>Audio Device:</source>
+ <translation>Thiết bị âm thanh:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="70"/>
+ <source>Use global volume</source>
+ <translation>Sử dụng âm lượng trong cài đặt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="75"/>
+ <source>Set volume:</source>
+ <translation>Âm lượng tuỳ chỉnh:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="83"/>
+ <source>Volume:</source>
+ <translation>Âm lượng:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.ui" line="128"/>
+ <source>0 %</source>
+ <translation>0 %</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_audio.cpp" line="97"/>
+ <source>%1%</source>
+ <comment>Volume percentage (e.g. 50%)</comment>
+ <translation>%1%</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureCpu</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="17"/>
+ <source>CPU</source>
+ <translation>CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="25"/>
+ <source>General</source>
+ <translation>Chung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="34"/>
+ <source>Accuracy:</source>
+ <translation>Độ chính xác</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="42"/>
+ <source>Auto</source>
+ <translation>Tự động</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="47"/>
+ <source>Accurate</source>
+ <translation>Tuyệt đối</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="52"/>
+ <source>Unsafe</source>
+ <translation>Tương đối</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="63"/>
+ <source>We recommend setting accuracy to &quot;Auto&quot;.</source>
+ <translation>Chúng tôi khuyến khích sử dụng chế độ &quot;Tự động&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="80"/>
+ <source>Unsafe CPU Optimization Settings</source>
+ <translation>Cài đặt tối ưu cho CPU ở chế độ tương đối</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="86"/>
+ <source>These settings reduce accuracy for speed.</source>
+ <translation>Những cài đặt sau giảm độ chính xác của giả lập để đổi lấy tốc độ.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="96"/>
+ <source>
+ &lt;div&gt;This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support.&lt;/div&gt;
+ </source>
+ <translation>
+ &lt;div&gt;Chức năng này tăng tốc độ giả lập bằng cách giảm độ chính xác của tập lệnh phép tính gộp cộng và nhân (FMA) trên các dòng CPU không hỗ trợ nó.&lt;/div&gt;
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="101"/>
+ <source>Unfuse FMA (improve performance on CPUs without FMA)</source>
+ <translation>Không dùng FMA (tăng hiệu suất cho các dòng CPU không hỗ trợ FMA)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="108"/>
+ <source>
+ &lt;div&gt;This option improves the speed of some approximate floating-point functions by using less accurate native approximations.&lt;/div&gt;
+ </source>
+ <translation>
+ &lt;div&gt;Chức năng này cải thiện tốc độ của một số chức năng dấu phẩy động tương đối bằng cách sử dụng tính năng làm tròn kém chính xác hơn.&lt;/div&gt;
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="113"/>
+ <source>Faster FRSQRTE and FRECPE</source>
+ <translation>Chạy FRSQRTE và FRECPE nhanh hơn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="120"/>
+ <source>
+ &lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
+ </source>
+ <translation>
+ &lt;div&gt;Tùy chọn này cải thiện tốc độ của các hàm dấu phẩy động ASIMD 32 bit bằng cách chạy với các chế độ làm tròn không chính xác.&lt;/div&gt;
+ </translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="125"/>
+ <source>Faster ASIMD instructions (32 bits only)</source>
+ <translation>Các lệnh ASIMD nhanh hơn (chỉ áp dụng cho 32 bit)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="132"/>
+ <source>
+ &lt;div&gt;This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions.&lt;/div&gt;
+ </source>
+ <translation>
+&lt;div&gt;Tùy chọn này sẽ cải thiện tốc độ bằng việc gỡ bỏ Kiểm tra NaN. Hãy nhớ là tùy chọn cũng sẽ giảm độ chính xác cho các dòng lệnh floating-point.&lt;/div&gt;
+</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="137"/>
+ <source>Inaccurate NaN handling</source>
+ <translation>Xử lí NaN gặp lỗi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="144"/>
+ <source>
+ &lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="149"/>
+ <source>Disable address space checks</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu.ui" line="174"/>
+ <source>CPU settings are available only when game is not running.</source>
+ <translation>Cài đặt CPU chỉ có sẵn khi không chạy trò chơi.</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureCpuDebug</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="17"/>
+ <source>CPU</source>
+ <translation>CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="25"/>
+ <source>Toggle CPU Optimizations</source>
+ <translation>Tuỳ chọn cho tối ưu CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Chỉ dành cho việc gỡ lỗi.&lt;/span&gt;&lt;br/&gt;Nếu bạn không biết những sự lựa chọn này làm gì, hãy bật tất cả.&lt;br/&gt;Những cài đặt này, khi tắt, chỉ hiệu quả khi bật &quot;Gỡ lỗi CPU&quot;. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
+ <source>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it inlines accesses to PageTable::pointers into emitted code.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.&lt;/div&gt;
+ </source>
+ <translation>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Sự tối ưu hóa này làm cho việc truy cập bộ nhớ của chương trình khách nhanh hơn.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Bật nó giúp PageTable::pointers có thể được truy cập trong mã được phát ra.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Tắt nó làm cho mọi truy cập vào bộ nhớ bắt buộc phải qua các function Memory::Read/Memory::Write.&lt;/div&gt;
+ </translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="48"/>
+ <source>Enable inline page tables</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="55"/>
+ <source>
+ &lt;div&gt;This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="60"/>
+ <source>Enable block linking</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="67"/>
+ <source>
+ &lt;div&gt;This optimization avoids dispatcher lookups by keeping track potential return addresses of BL instructions. This approximates what happens with a return stack buffer on a real CPU.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="72"/>
+ <source>Enable return stack buffer</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="79"/>
+ <source>
+ &lt;div&gt;Enable a two-tiered dispatch system. A faster dispatcher written in assembly has a small MRU cache of jump destinations is used first. If that fails, dispatch falls back to the slower C++ dispatcher.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="84"/>
+ <source>Enable fast dispatcher</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="91"/>
+ <source>
+ &lt;div&gt;Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="96"/>
+ <source>Enable context elimination</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="103"/>
+ <source>
+ &lt;div&gt;Enables IR optimizations that involve constant propagation.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="108"/>
+ <source>Enable constant propagation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="115"/>
+ <source>
+ &lt;div&gt;Enables miscellaneous IR optimizations.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="120"/>
+ <source>Enable miscellaneous optimizations</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="127"/>
+ <source>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;When enabled, a misalignment is only triggered when an access crosses a page boundary.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;When disabled, a misalignment is triggered on all misaligned accesses.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="133"/>
+ <source>Enable misalignment check reduction</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="140"/>
+ <source>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
+ </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
+ <source>Enable Host MMU Emulation</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="172"/>
+ <source>CPU settings are available only when game is not running.</source>
+ <translation>Cài đặt CPU chỉ có sẵn khi không chạy trò chơi.</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureDebug</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="9"/>
+ <source>Logging</source>
+ <translation>Sổ ghi chép</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="17"/>
+ <source>Global Log Filter</source>
+ <translation>Bộ lọc sổ ghi chép</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="29"/>
+ <source>Show Log in Console</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="36"/>
+ <source>Open Log Location</source>
+ <translation>Mở vị trí sổ ghi chép</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="46"/>
+ <source>When checked, the max size of the log increases from 100 MB to 1 GB</source>
+ <translation>Khi tích vào, dung lượng tối đa cho file log chuyển từ 100 MB lên 1 GB</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="49"/>
+ <source>Enable Extended Logging**</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="59"/>
+ <source>Homebrew</source>
+ <translation>Homebrew</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="67"/>
+ <source>Arguments String</source>
+ <translation>Chuỗi đối số</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="82"/>
+ <source>Graphics</source>
+ <translation>Đồ hoạ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="91"/>
+ <source>When checked, the graphics API enters a slower debugging mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="94"/>
+ <source>Enable Graphics Debugging</source>
+ <translation>Kích hoạt chế độ gỡ lỗi đồ hoạ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="101"/>
+ <source>When checked, it enables Nsight Aftermath crash dumps</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="104"/>
+ <source>Enable Nsight Aftermath</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="114"/>
+ <source>When checked, it disables the macro Just In Time compiler. Enabling this makes games run slower</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="117"/>
+ <source>Disable Macro JIT</source>
+ <translation>Không dùng Macro JIT</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="124"/>
+ <source>When checked, yuzu will log statistics about the compiled pipeline cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="127"/>
+ <source>Enable Shader Feedback</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="134"/>
+ <source>When checked, it executes shaders without loop logic changes</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="137"/>
+ <source>Disable Loop safety checks</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="147"/>
+ <source>Debugging</source>
+ <translation>Vá lỗi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="153"/>
+ <source>Enable FS Access Log</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="160"/>
+ <source>Enable Verbose Reporting Services**</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="170"/>
+ <source>Advanced</source>
+ <translation>Nâng Cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="176"/>
+ <source>Kiosk (Quest) Mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="183"/>
+ <source>Enable CPU Debugging</source>
+ <translation>Bật Vá Lỗi CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="190"/>
+ <source>Enable Debug Asserts</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="197"/>
+ <source>Enable Auto-Stub**</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
+ <source>**This will be reset automatically when yuzu closes.</source>
+ <translation>**Sẽ tự động thiết lập lại khi tắt yuzu.</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureDebugController</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="14"/>
+ <source>Configure Debug Controller</source>
+ <translation>Thiết lập bộ điều khiển vá lỗi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="40"/>
+ <source>Clear</source>
+ <translation>Làm trống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_controller.ui" line="47"/>
+ <source>Defaults</source>
+ <translation>Quay về mặc định</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureDebugTab</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_tab.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_tab.ui" line="17"/>
+ <location filename="../../src/yuzu/configuration/configure_debug_tab.cpp" line="17"/>
+ <source>Debug</source>
+ <translation>Vá lỗi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug_tab.cpp" line="18"/>
+ <source>CPU</source>
+ <translation>CPU</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureDialog</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure.ui" line="20"/>
+ <source>yuzu Configuration</source>
+ <translation>Thiết lập yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="59"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="162"/>
+ <source>Audio</source>
+ <translation>Âm thanh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="60"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="160"/>
+ <source>CPU</source>
+ <translation>CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="61"/>
+ <source>Debug</source>
+ <translation>Gỡ lỗi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="62"/>
+ <source>Filesystem</source>
+ <translation>Hệ thống tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="63"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="156"/>
+ <source>General</source>
+ <translation>Chung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="64"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="161"/>
+ <source>Graphics</source>
+ <translation>Đồ hoạ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="65"/>
+ <source>GraphicsAdvanced</source>
+ <translation>Đồ họa Nâng cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="66"/>
+ <source>Hotkeys</source>
+ <translation>Phím tắt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="67"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="163"/>
+ <source>Controls</source>
+ <translation>Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="68"/>
+ <source>Profiles</source>
+ <translation>Hồ sơ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="69"/>
+ <source>Network</source>
+ <translation>Mạng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="158"/>
+ <source>System</source>
+ <translation>Hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="71"/>
+ <source>Game List</source>
+ <translation>Danh sách trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_dialog.cpp" line="72"/>
+ <source>Web</source>
+ <translation>Web</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureFilesystem</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="17"/>
+ <source>Filesystem</source>
+ <translation>File hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="25"/>
+ <source>Storage Directories</source>
+ <translation>Thư mục lưu trữ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="31"/>
+ <source>NAND</source>
+ <translation>NAND</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="58"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="114"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="136"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="143"/>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="51"/>
+ <source>SD Card</source>
+ <translation>Thẻ nhớ SD</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="84"/>
+ <source>Gamecard</source>
+ <translation>Thẻ nhớ trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="90"/>
+ <source>Path</source>
+ <translation>Đường dẫn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="100"/>
+ <source>Inserted</source>
+ <translation>Đã chèn vào</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="107"/>
+ <source>Current Game</source>
+ <translation>Game hiện tại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="124"/>
+ <source>Patch Manager</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="152"/>
+ <source>Dump Decompressed NSOs</source>
+ <translation>Sao chép NSO đã giải nén</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="159"/>
+ <source>Dump ExeFS</source>
+ <translation>Sao chép ExeFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="168"/>
+ <source>Mod Load Root</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="175"/>
+ <source>Dump Root</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="201"/>
+ <source>Caching</source>
+ <translation>Bộ nhớ đệm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="209"/>
+ <source>Cache Game List Metadata</source>
+ <translation>Lưu bộ nhớ đệm của danh sách trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="216"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="124"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="128"/>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="133"/>
+ <source>Reset Metadata Cache</source>
+ <translation>Khôi phục bộ nhớ đệm của metadata</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="86"/>
+ <source>Select Emulated NAND Directory...</source>
+ <translation>Chọn Thư Mục Giả Lập NAND...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="89"/>
+ <source>Select Emulated SD Directory...</source>
+ <translation>Chọn Thư Mục Giả Lập SD...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="92"/>
+ <source>Select Gamecard Path...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="95"/>
+ <source>Select Dump Directory...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="98"/>
+ <source>Select Mod Load Directory...</source>
+ <translation>Chọn Thư Mục Chứa Mod...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="125"/>
+ <source>The metadata cache is already empty.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="129"/>
+ <source>The operation completed successfully.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_filesystem.cpp" line="134"/>
+ <source>The metadata cache couldn&apos;t be deleted. It might be in use or non-existent.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureGeneral</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="17"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="25"/>
+ <source>General</source>
+ <translation>Chung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
+ <source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>Giới hạn Tốc độ khung hình</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
+ <source>x</source>
+ <translation>x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
+ <source>Limit Speed Percent</source>
+ <translation>Giới hạn phần trăm tốc độ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
+ <source>Multicore CPU Emulation</source>
+ <translation>Giả lập CPU đa nhân</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
+ <source>Confirm exit while emulation is running</source>
+ <translation>Xác nhận thoát trong khi đang chạy giả lập</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
+ <source>Prompt for user on game boot</source>
+ <translation>Hiển thị cửa sổ chọn người dùng khi bắt đầu trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
+ <source>Pause emulation when in background</source>
+ <translation>Tạm dừng giả lập khi chạy nền</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
+ <source>Hide mouse on inactivity</source>
+ <translation>Ẩn con trỏ chuột khi không dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
+ <source>Reset All Settings</source>
+ <translation>Đặt lại mọi tùy chỉnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
+ <source>yuzu</source>
+ <translation>yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
+ <source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
+ <translation>Quá trình này sẽ thiết lập lại toàn bộ tùy chỉnh và gỡ hết mọi cài đặt cho từng game riêng lẻ. Quá trình này không xóa đường dẫn tới thư mục game, hồ sơ, hay hồ sơ của thiết lập phím. Tiếp tục?</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureGraphics</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="17"/>
+ <source>Graphics</source>
+ <translation>Đồ họa</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="25"/>
+ <source>API Settings</source>
+ <translation>Cài đặt API</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="64"/>
+ <source>Shader Backend:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="92"/>
+ <source>Device:</source>
+ <translation>Thiết bị đồ hoạ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="120"/>
+ <source>API:</source>
+ <translation>API đồ hoạ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="156"/>
+ <source>Graphics Settings</source>
+ <translation>Cài đặt đồ hoạ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="162"/>
+ <source>Use disk pipeline cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="169"/>
+ <source>Use asynchronous GPU emulation</source>
+ <translation>Dùng giả lập GPU không đồng bộ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="176"/>
+ <source>Accelerate ASTC texture decoding</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="198"/>
+ <source>NVDEC emulation:</source>
+ <translation>Giả lập NVDEC</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="206"/>
+ <source>No Video Output</source>
+ <translation>Không Video Đầu Ra</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="211"/>
+ <source>CPU Video Decoding</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="216"/>
+ <source>GPU Video Decoding (Default)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="242"/>
+ <source>Fullscreen Mode:</source>
+ <translation>Chế độ Toàn màn hình:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="250"/>
+ <source>Borderless Windowed</source>
+ <translation>Cửa sổ không viền</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="255"/>
+ <source>Exclusive Fullscreen</source>
+ <translation>Toàn màn hình</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="281"/>
+ <source>Aspect Ratio:</source>
+ <translation>Tỉ lệ khung hình:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="289"/>
+ <source>Default (16:9)</source>
+ <translation>Mặc định (16:9)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="294"/>
+ <source>Force 4:3</source>
+ <translation>Dùng 4:3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="299"/>
+ <source>Force 21:9</source>
+ <translation>Dùng 21:9</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="304"/>
+ <source>Stretch to Window</source>
+ <translation>Kéo dãn đến cửa sổ phần mềm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
+ <source>Use global background color</source>
+ <translation>Dùng màu nền theo cài đặt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
+ <source>Set background color:</source>
+ <translation>Chọn màu nền:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
+ <source>Background Color:</source>
+ <translation>Màu nền:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.cpp" line="34"/>
+ <source>GLASM (Assembly Shaders, NVIDIA Only)</source>
+ <translation>GLASM (Assembly Shaders, Chỉ Cho NVIDIA)</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureGraphicsAdvanced</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="17"/>
+ <source>Advanced</source>
+ <translation>Nâng cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="25"/>
+ <source>Advanced Graphics Settings</source>
+ <translation>Cài đặt đồ hoạ nâng cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="46"/>
+ <source>Accuracy Level:</source>
+ <translation>Độ chính xác:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="75"/>
+ <source>VSync prevents the screen from tearing, but some graphics cards have lower performance with VSync enabled. Keep it enabled if you don&apos;t notice a performance difference.</source>
+ <translation>VSync tránh cho màn hình bị &quot;xước&quot;, tuy nhiên một số cạc đồ hoạ có hiệu năng chậm hơn khi VSync được kích hoạt. Bật chức năng này nếu nó không ảnh hưởng gì đến hiệu năng.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="78"/>
+ <source>Use VSync (OpenGL only)</source>
+ <translation>Dùng VSync (chỉ dành cho OpenGL)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="85"/>
+ <source>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</source>
+ <translation>Kích hoạt tính năng tạo shader không đồng bộ nhằm tránh cho trò chơi bị giật khi tạo shader. Tính năng này vẫn đang thử nghiệm.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="88"/>
+ <source>Use asynchronous shader building (Hack)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="95"/>
+ <source>Enables Fast GPU Time. This option will force most games to run at their highest native resolution.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="98"/>
+ <source>Use Fast GPU Time (Hack)</source>
+ <translation>Tăng Tốc Thời Gian GPU (Hack)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="120"/>
+ <source>Anisotropic Filtering:</source>
+ <translation>Bộ lọc góc nghiêng:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
+ <source>Automatic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
+ <source>Default</source>
+ <translation>Mặc định</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
+ <source>2x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
+ <source>4x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
+ <source>8x</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureHotkeys</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="14"/>
+ <source>Hotkey Settings</source>
+ <translation>Cài đặt phím nóng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="17"/>
+ <source>Hotkeys</source>
+ <translation>Phím tắt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="25"/>
+ <source>Double-click on a binding to change it.</source>
+ <translation>Đúp chuột vào phím đã được thiết lập để thay đổi.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="45"/>
+ <source>Clear All</source>
+ <translation>Bỏ Trống Hết</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.ui" line="52"/>
+ <source>Restore Defaults</source>
+ <translation>Khôi phục về mặc định</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
+ <source>Action</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
+ <source>Hotkey</source>
+ <translation>Phím tắt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="74"/>
+ <source>Context</source>
+ <translation>Bối cảnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="96"/>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="183"/>
+ <source>Conflicting Key Sequence</source>
+ <translation>Tổ hợp phím bị xung đột</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="97"/>
+ <source>The entered key sequence is already assigned to: %1</source>
+ <translation>Tổ hợp phím này đã gán với: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="171"/>
+ <source>Restore Default</source>
+ <translation>Khôi phục về mặc định</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="172"/>
+ <source>Clear</source>
+ <translation>Xóa</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_hotkeys.cpp" line="184"/>
+ <source>The default key sequence is already assigned to: %1</source>
+ <translation>Tổ hợp phím này đã gán với: %1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureInput</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="14"/>
+ <source>ConfigureInput</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="39"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="42"/>
+ <source>Player 1</source>
+ <translation>Người chơi 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="47"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="50"/>
+ <source>Player 2</source>
+ <translation>Người chơi 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="55"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="58"/>
+ <source>Player 3</source>
+ <translation>Người chơi 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="63"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="66"/>
+ <source>Player 4</source>
+ <translation>Người chơi 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="74"/>
+ <source>Player 5</source>
+ <translation>Người chơi 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="79"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="82"/>
+ <source>Player 6</source>
+ <translation>Người chơi 6</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="87"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="90"/>
+ <source>Player 7</source>
+ <translation>Người chơi 7</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="98"/>
+ <source>Player 8</source>
+ <translation>Người chơi 8</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="103"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="106"/>
+ <source>Advanced</source>
+ <translation>Nâng cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="138"/>
+ <source>Console Mode</source>
+ <translation>Console Mode</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="159"/>
+ <source>Docked</source>
+ <translation>Chế độ cắm TV</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="169"/>
+ <source>Undocked</source>
+ <translation>Chế độ cầm tay</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="179"/>
+ <source>Vibration</source>
+ <translation>Độ rung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="215"/>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="261"/>
+ <source>Configure</source>
+ <translation>Thiết lập</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="225"/>
+ <source>Motion</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="296"/>
+ <source>Controllers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="324"/>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="365"/>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="375"/>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="385"/>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="395"/>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="405"/>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="415"/>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="425"/>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="435"/>
+ <source>Connected</source>
+ <translation>Đã kết nối</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="494"/>
+ <source>Defaults</source>
+ <translation>Quay về mặc định</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input.ui" line="537"/>
+ <source>Clear</source>
+ <translation>Xóa</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureInputAdvanced</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Thiết lập đầu vào</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="74"/>
+ <source>Joycon Colors</source>
+ <translation>Màu tay cầm Joycon</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="125"/>
+ <source>Player 1</source>
+ <translation>Người chơi 1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="164"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="450"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1040"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1365"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1651"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1955"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2241"/>
+ <source>L Body</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="505"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="809"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1095"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1420"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1706"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2010"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2296"/>
+ <source>L Button</source>
+ <translation>Phím L</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="581"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="885"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1171"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1496"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1782"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2086"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2372"/>
+ <source>R Body</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="350"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="636"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="940"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1226"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1551"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1837"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2141"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2427"/>
+ <source>R Button</source>
+ <translation>Phím R</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="411"/>
+ <source>Player 2</source>
+ <translation>Người chơi 2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="715"/>
+ <source>Player 3</source>
+ <translation>Người chơi 3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1001"/>
+ <source>Player 4</source>
+ <translation>Người chơi 4</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1326"/>
+ <source>Player 5</source>
+ <translation>Người chơi 5</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1612"/>
+ <source>Player 6</source>
+ <translation>Người chơi 6</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1916"/>
+ <source>Player 7</source>
+ <translation>Người chơi 7</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2202"/>
+ <source>Player 8</source>
+ <translation>Người chơi 8</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
+ <source>Emulated Devices</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
+ <source>Keyboard</source>
+ <translation>Bàn phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
+ <source>Mouse</source>
+ <translation>Chuột</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
+ <source>Touchscreen</source>
+ <translation>Màn hình cảm ứng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>Nâng cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
+ <source>Configure</source>
+ <translation>Thiết lập</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>Khác</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
+ <source>Requires restarting yuzu</source>
+ <translation>Phải khởi động lại yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
+ <source>Enable XInput 8 player support (disables web applet)</source>
+ <translation>Bật hỗ trợ XInput cho 8 người (tắt web applet)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>Độ nhạy chuột</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>Chuyển động / Cảm ứng</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>Thiết lập đầu vào</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>Kết nối Tay cầm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
+ <source>Input Device</source>
+ <translation>Thiết bị Nhập</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
+ <source>Profile</source>
+ <translation>Hồ sơ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
+ <source>Save</source>
+ <translation>Lưu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
+ <source>New</source>
+ <translation>Mới</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
+ <source>Delete</source>
+ <translation>Xoá</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
+ <source>Left Stick</source>
+ <translation>Cần trái</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
+ <source>Up</source>
+ <translation>Lên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
+ <source>Left</source>
+ <translation>Trái</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
+ <source>Right</source>
+ <translation>Phải</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
+ <source>Down</source>
+ <translation>Xuống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
+ <source>Pressed</source>
+ <translation>Nhấn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
+ <source>Modifier</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
+ <source>Range</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
+ <source>Deadzone: 0%</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
+ <source>Modifier Range: 0%</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
+ <source>D-Pad</source>
+ <translation>D-Pad</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
+ <source>L</source>
+ <translation>L</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
+ <source>ZL</source>
+ <translation>ZL</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
+ <source>Minus</source>
+ <translation>Trừ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
+ <source>Capture</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
+ <source>Plus</source>
+ <translation>Cộng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
+ <source>Home</source>
+ <translation>Home</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
+ <source>ZR</source>
+ <translation>ZR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
+ <source>SL</source>
+ <translation>SL</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
+ <source>SR</source>
+ <translation>SR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
+ <source>Motion 1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
+ <source>Motion 2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
+ <source>Face Buttons</source>
+ <translation>Nút chức năng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
+ <source>A</source>
+ <translation>A</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
+ <source>Right Stick</source>
+ <translation>Cần phải</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
+ <source>Clear</source>
+ <translation>Bỏ trống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
+ <source>[not set]</source>
+ <translation>[không đặt]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
+ <source>Toggle button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
+ <source>Set threshold</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
+ <source>Choose a value between 0% and 100%</source>
+ <translation>Chọn một giá trị giữa 0% và 100%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
+ <source>Map Analog Stick</source>
+ <translation>Thiết lập Cần Điều Khiển</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
+ <source>After pressing OK, first move your joystick horizontally, and then vertically.
+To invert the axes, first move your joystick vertically, and then horizontally.</source>
+ <translation>Sau khi bấm OK, di chuyển cần sang ngang, rồi sau đó sang dọc.
+Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần sang dọc trước, rồi sang ngang.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
+ <source>Deadzone: %1%</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
+ <source>Modifier Range: %1%</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Tay cầm Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>Joycon đôi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>Joycon Trái</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>Joycon Phải</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
+ <source>GameCube Controller</source>
+ <translation>Tay cầm GameCube</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
+ <source>Start / Pause</source>
+ <translation>Bắt đầu / Tạm ngưng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
+ <source>Z</source>
+ <translation>Z</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
+ <source>Control Stick</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
+ <source>C-Stick</source>
+ <translation>C-Stick</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
+ <source>Shake!</source>
+ <translation>Lắc!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
+ <source>[waiting]</source>
+ <translation>[Chờ]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
+ <source>New Profile</source>
+ <translation>Hồ sơ mới</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
+ <source>Enter a profile name:</source>
+ <translation>Nhập tên hồ sơ:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
+ <source>Create Input Profile</source>
+ <translation>Tạo Hồ Sơ Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
+ <source>The given profile name is not valid!</source>
+ <translation>Tên hồ sơ không hợp lệ!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
+ <source>Failed to create the input profile &quot;%1&quot;</source>
+ <translation>Quá trình tạo hồ sơ phím &quot;%1&quot; thất bại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
+ <source>Delete Input Profile</source>
+ <translation>Xóa Hồ Sơ Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
+ <source>Failed to delete the input profile &quot;%1&quot;</source>
+ <translation>Quá trình xóa hồ sơ phím &quot;%1&quot; thất bại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
+ <source>Load Input Profile</source>
+ <translation>Nạp Hồ Sơ Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
+ <source>Failed to load the input profile &quot;%1&quot;</source>
+ <translation>Quá trình nạp hồ sơ phím &quot;%1&quot; thất bại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
+ <source>Save Input Profile</source>
+ <translation>Lưu Hồ Sơ Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <source>Failed to save the input profile &quot;%1&quot;</source>
+ <translation>Quá trình lưu hồ sơ phím &quot;%1&quot; thất bại</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureInputProfileDialog</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="14"/>
+ <source>Create Input Profile</source>
+ <translation>Tạo Hồ Sơ Phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="40"/>
+ <source>Clear</source>
+ <translation>Bỏ trống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_profile_dialog.ui" line="47"/>
+ <source>Defaults</source>
+ <translation>Mặc định</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureMotionTouch</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
+ <source>Configure Motion / Touch</source>
+ <translation>Tùy chỉnh Chuột / Cảm Ứng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
+ <source>Touch</source>
+ <translation>Cảm Ứng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
+ <source>UDP Calibration:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
+ <source>(100, 50) - (1800, 850)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
+ <source>Configure</source>
+ <translation>Cài đặt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
+ <source>CemuhookUDP Config</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
+ <source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
+ <source>Server:</source>
+ <translation>Server:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
+ <source>Port:</source>
+ <translation>Cổng:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
+ <source>Learn More</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <source>Test</source>
+ <translation>Thử nghiệm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
+ <source>Add Server</source>
+ <translation>Thêm Server</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
+ <source>Remove Server</source>
+ <translation>Xóa Server</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="91"/>
+ <source>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Learn More&lt;/span&gt;&lt;/a&gt;</source>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Tìm hiểu thêm&lt;/span&gt;&lt;/a&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
+ <source>%1:%2</source>
+ <translation>%1:%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
+ <source>yuzu</source>
+ <translation>yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <source>Port number has invalid characters</source>
+ <translation>Cổng có kí tự không hợp lệ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <source>Port has to be in range 0 and 65353</source>
+ <translation>Cổng phải từ 0 đến 65353</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <source>IP address is not valid</source>
+ <translation>Địa chỉ IP không hợp lệ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <source>This UDP server already exists</source>
+ <translation>Server UDP đã tồn tại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <source>Unable to add more than 8 servers</source>
+ <translation>Không thể vượt quá 8 server</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
+ <source>Testing</source>
+ <translation>Thử nghiệm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
+ <source>Configuring</source>
+ <translation>Cài đặt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
+ <source>Test Successful</source>
+ <translation>Thử Nghiệm Thành Công</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
+ <source>Successfully received data from the server.</source>
+ <translation>Nhận được dữ liệu từ server!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
+ <source>Test Failed</source>
+ <translation>Thử Nghiệm Thất Bại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
+ <source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
+ <translation>Không thể nhận được dữ liệu hợp lệ từ server. &lt;br&gt;Hãy chắc chắn server được thiết lập chính xác, từ địa chỉ lẫn cổng phải được thiết lập đúng.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
+ <source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureNetwork</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_network.ui" line="17"/>
+ <source>Network</source>
+ <translation>Mạng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_network.ui" line="25"/>
+ <source>General</source>
+ <translation>Tổng Quan</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_network.ui" line="34"/>
+ <source>Network Interface</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_network.cpp" line="17"/>
+ <source>None</source>
+ <translation>Trống</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigurePerGame</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="12"/>
+ <source>Dialog</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="26"/>
+ <source>Info</source>
+ <translation>Thông Tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="85"/>
+ <source>Name</source>
+ <translation>Tên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="92"/>
+ <source>Title ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="129"/>
+ <source>Filename</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="156"/>
+ <source>Format</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="163"/>
+ <source>Version</source>
+ <translation>Phiên Bản</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="170"/>
+ <source>Size</source>
+ <translation>Dung Lượng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.ui" line="177"/>
+ <source>Developer</source>
+ <translation>Nhà Phát Hành</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="64"/>
+ <source>Add-Ons</source>
+ <translation>Bổ Sung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="65"/>
+ <source>General</source>
+ <translation>Tổng Quan</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="66"/>
+ <source>System</source>
+ <translation>Hệ Thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="67"/>
+ <source>CPU</source>
+ <translation>CPU</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="68"/>
+ <source>Graphics</source>
+ <translation>Đồ Họa</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
+ <source>Adv. Graphics</source>
+ <translation>Đồ Họa Nâng Cao</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
+ <source>Audio</source>
+ <translation>Âm Thanh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="73"/>
+ <source>Properties</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configuration_shared.cpp" line="93"/>
+ <source>Use global configuration (%1)</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigurePerGameAddons</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game_addons.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game_addons.ui" line="17"/>
+ <source>Add-Ons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="48"/>
+ <source>Patch Name</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="49"/>
+ <source>Version</source>
+ <translation>Phiên Bản</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureProfileManager</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="17"/>
+ <source>Profiles</source>
+ <translation>Hồ Sơ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="25"/>
+ <source>Profile Manager</source>
+ <translation>Quản Lý Hồ Sơ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="42"/>
+ <source>Current User</source>
+ <translation>Người Dùng Hiện Tại</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="80"/>
+ <source>Username</source>
+ <translation>Tên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="110"/>
+ <source>Set Image</source>
+ <translation>Đặt Hình Ảnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="130"/>
+ <source>Add</source>
+ <translation>Thêm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="140"/>
+ <source>Rename</source>
+ <translation>Đổi Tên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="150"/>
+ <source>Remove</source>
+ <translation>Gỡ Bỏ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="162"/>
+ <source>Profile management is available only when game is not running.</source>
+ <translation>Chỉ có thể quản lí hồ sơ khi game không chạy.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="55"/>
+ <source>%1
+%2</source>
+ <comment>%1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF))</comment>
+ <translation>%1
+%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="73"/>
+ <source>Enter Username</source>
+ <translation>Điền Tên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="136"/>
+ <source>Users</source>
+ <translation>Người Dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="198"/>
+ <source>Enter a username for the new user:</source>
+ <translation>Chọn tên cho người dùng mới</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="218"/>
+ <source>Enter a new username:</source>
+ <translation>Chọn một tên mới:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="243"/>
+ <source>Confirm Delete</source>
+ <translation>Xác nhận xóa</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="244"/>
+ <source>You are about to delete user with name &quot;%1&quot;. Are you sure?</source>
+ <translation>Bạn đang xóa người dùng &quot;%1&quot;. Bạn chắc chứ?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="271"/>
+ <source>Select User Image</source>
+ <translation>Chọn Ảnh cho Người Dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="272"/>
+ <source>JPEG Images (*.jpg *.jpeg)</source>
+ <translation>Ảnh JPEG (*.jpg *.jpeg)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="281"/>
+ <source>Error deleting image</source>
+ <translation>Lỗi khi xóa ảnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="282"/>
+ <source>Error occurred attempting to overwrite previous image at: %1.</source>
+ <translation>Có lỗi khi ghi đè ảnh trước tại: %1.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="290"/>
+ <source>Error deleting file</source>
+ <translation>Lỗi xóa ảnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="291"/>
+ <source>Unable to delete existing file: %1.</source>
+ <translation>Không thể xóa ảnh hiện tại: %1.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="298"/>
+ <source>Error creating user image directory</source>
+ <translation>Lỗi khi tạo thư mục chứa ảnh người dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="299"/>
+ <source>Unable to create directory %1 for storing user images.</source>
+ <translation>Không thể tạo thư mục %1 để chứa ảnh người dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="304"/>
+ <source>Error copying user image</source>
+ <translation>Lỗi chép ảnh người dùng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="305"/>
+ <source>Unable to copy image from %1 to %2</source>
+ <translation>Không thể chép ảnh từ %1 sang %2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
+ <source>Error resizing user image</source>
+ <translation>Lỗi thu phóng ảnh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
+ <source>Unable to resize image</source>
+ <translation>Không thể thu phóng ảnh</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureSystem</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="17"/>
+ <source>System</source>
+ <translation>Hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="25"/>
+ <source>System Settings</source>
+ <translation>Cài đặt hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="33"/>
+ <source>Region:</source>
+ <translation>Vùng:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="41"/>
+ <source>Auto</source>
+ <translation>Tự động</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="46"/>
+ <source>Default</source>
+ <translation>Mặc định</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="51"/>
+ <source>CET</source>
+ <translation>CET</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="56"/>
+ <source>CST6CDT</source>
+ <translation>CST6CDT</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="61"/>
+ <source>Cuba</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="66"/>
+ <source>EET</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="71"/>
+ <source>Egypt</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="76"/>
+ <source>Eire</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="81"/>
+ <source>EST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="86"/>
+ <source>EST5EDT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="91"/>
+ <source>GB</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="96"/>
+ <source>GB-Eire</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="101"/>
+ <source>GMT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="106"/>
+ <source>GMT+0</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="111"/>
+ <source>GMT-0</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="116"/>
+ <source>GMT0</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="121"/>
+ <source>Greenwich</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="126"/>
+ <source>Hongkong</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="131"/>
+ <source>HST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="136"/>
+ <source>Iceland</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="141"/>
+ <source>Iran</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="146"/>
+ <source>Israel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="151"/>
+ <source>Jamaica</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="156"/>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="275"/>
+ <source>Japan</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="161"/>
+ <source>Kwajalein</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="166"/>
+ <source>Libya</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="171"/>
+ <source>MET</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="176"/>
+ <source>MST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="181"/>
+ <source>MST7MDT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="186"/>
+ <source>Navajo</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="191"/>
+ <source>NZ</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="196"/>
+ <source>NZ-CHAT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="201"/>
+ <source>Poland</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="206"/>
+ <source>Portugal</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="211"/>
+ <source>PRC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="216"/>
+ <source>PST8PDT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="221"/>
+ <source>ROC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="226"/>
+ <source>ROK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="231"/>
+ <source>Singapore</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="236"/>
+ <source>Turkey</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="241"/>
+ <source>UCT</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="246"/>
+ <source>Universal</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="251"/>
+ <source>UTC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="256"/>
+ <source>W-SU</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="261"/>
+ <source>WET</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="266"/>
+ <source>Zulu</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="280"/>
+ <source>USA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="285"/>
+ <source>Europe</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="290"/>
+ <source>Australia</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="295"/>
+ <source>China</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="300"/>
+ <source>Korea</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="305"/>
+ <source>Taiwan</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="313"/>
+ <source>Time Zone:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="320"/>
+ <source>Note: this can be overridden when region setting is auto-select</source>
+ <translation>Chú ý: cái này có thể ghi đè khi cài đặt quốc gia là chọn tự động</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="324"/>
+ <source>Japanese (日本語)</source>
+ <translation>Tiếng Nhật (日本語)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="329"/>
+ <source>English</source>
+ <translation>Tiếng Anh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="334"/>
+ <source>French (français)</source>
+ <translation>Tiếng Pháp (French)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="339"/>
+ <source>German (Deutsch)</source>
+ <translation>Tiếng Đức (German)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="344"/>
+ <source>Italian (italiano)</source>
+ <translation>Tiếng Ý (Italian)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="349"/>
+ <source>Spanish (español)</source>
+ <translation>Tiếng Tây Ban Nha (Spanish)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="354"/>
+ <source>Chinese</source>
+ <translation>Tiếng Trung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="359"/>
+ <source>Korean (한국어)</source>
+ <translation>Tiếng Hàn (Korean)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="364"/>
+ <source>Dutch (Nederlands)</source>
+ <translation>Tiếng Hà Lan (Dutch)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="369"/>
+ <source>Portuguese (português)</source>
+ <translation>Tiếng Bồ Đào Nha (Portuguese)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="374"/>
+ <source>Russian (Русский)</source>
+ <translation>Tiếng Nga (Russian)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="379"/>
+ <source>Taiwanese</source>
+ <translation>Tiếng Đài Loan</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="384"/>
+ <source>British English</source>
+ <translation>Tiếng Anh UK</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="389"/>
+ <source>Canadian French</source>
+ <translation>Tiếng Pháp Canada</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="394"/>
+ <source>Latin American Spanish</source>
+ <translation>Tiếng Mỹ La-tinh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="399"/>
+ <source>Simplified Chinese</source>
+ <translation>Tiếng Trung giản thể</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="404"/>
+ <source>Traditional Chinese (正體中文)</source>
+ <translation>Tiếng Trung phồn thể (Traditional Chinese)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="409"/>
+ <source>Brazilian Portuguese (português do Brasil)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="417"/>
+ <source>Custom RTC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="424"/>
+ <source>Language</source>
+ <translation>Ngôn ngữ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="431"/>
+ <source>RNG Seed</source>
+ <translation>Hạt giống RNG</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="439"/>
+ <source>Mono</source>
+ <translation>Mono</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="444"/>
+ <source>Stereo</source>
+ <translation>Stereo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="449"/>
+ <source>Surround</source>
+ <translation>Surround</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="457"/>
+ <source>Console ID:</source>
+ <translation>ID bàn giao tiếp:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="464"/>
+ <source>Sound output mode</source>
+ <translation>Chế độ đầu ra âm thanh</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="478"/>
+ <source>d MMM yyyy h:mm:ss AP</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="515"/>
+ <source>Regenerate</source>
+ <translation>Tạo mới</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.ui" line="540"/>
+ <source>System settings are available only when game is not running.</source>
+ <translation>Cài đặt hệ thống chỉ khả dụng khi trò chơi không chạy.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.cpp" line="166"/>
+ <source>This will replace your current virtual Switch with a new one. Your current virtual Switch will not be recoverable. This might have unexpected effects in games. This might fail, if you use an outdated config savegame. Continue?</source>
+ <translation>Điều này sẽ thay thế Switch ảo hiện tại của bạn sang một cái mới. Switch ảo hiện tại của bạn sẽ không thể hồi phục lại. Điều này có thể gây ra tác dụng không mong muốn trong trò chơi. Điều này có thể gây thất bại, nếu bạn đang sử dụng thiết lập lưu trữ đã lỗi thời. Tiếp tục?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.cpp" line="170"/>
+ <source>Warning</source>
+ <translation>Chú ý</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_system.cpp" line="178"/>
+ <source>Console ID: 0x%1</source>
+ <translation>ID của máy: 0x%1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureTas</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="11"/>
+ <source>TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
+ <source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
+ <source>WARNING: This is an experimental feature.&lt;br/&gt;It will not play back scripts frame perfectly with the current, imperfect syncing method.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="51"/>
+ <source>Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="57"/>
+ <source>Enable TAS features</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
+ <source>Loop script</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
+ <source>Pause execution during loads</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
+ <source>Script Directory</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
+ <source>Path</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureTasDialog</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="20"/>
+ <source>TAS Configuration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
+ <source>Select TAS Load Directory...</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureTouchFromButton</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="14"/>
+ <source>Configure Touchscreen Mappings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="22"/>
+ <source>Mapping:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="48"/>
+ <source>New</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="61"/>
+ <source>Delete</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="74"/>
+ <source>Rename</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="92"/>
+ <source>Click the bottom area to add a point, then press a button to bind.
+Drag points to change position, or double-click table cells to edit values.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.ui" line="116"/>
+ <source>Delete Point</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="80"/>
+ <source>Button</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="80"/>
+ <source>X</source>
+ <comment>X axis</comment>
+ <translation>X</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="80"/>
+ <source>Y</source>
+ <comment>Y axis</comment>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
+ <source>New Profile</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
+ <source>Enter the name for the new profile.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
+ <source>Delete Profile</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
+ <source>Delete profile %1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
+ <source>Rename Profile</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
+ <source>New name:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
+ <source>[press key]</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureTouchscreenAdvanced</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="14"/>
+ <source>Configure Touchscreen</source>
+ <translation>Thiết lập màn hình cảm ứng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="26"/>
+ <source>Warning: The settings in this page affect the inner workings of yuzu&apos;s emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing.</source>
+ <translation>Chú ý: Cài đặt trong trang này có thể ảnh hưởng đến hoạt động bên trong giả lập màn hình cảm ứng của yuzu&apos;s. Thay đổi chúng có thể dẫn đến hành vi không mong muốn, chẳng hạn như một phần của màn hình cảm ứng sẽ không hoạt động. Bạn chỉ nên sử dụng trang này nếu bạn biết bạn đang làm gì.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="52"/>
+ <source>Touch Parameters</source>
+ <translation>Thông số cảm ứng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="71"/>
+ <source>Touch Diameter Y</source>
+ <translation>Đường kính cảm ứng Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="91"/>
+ <source>Touch Diameter X</source>
+ <translation>Đường kính cảm ứng X</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="98"/>
+ <source>Rotational Angle</source>
+ <translation>Góc quay</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="132"/>
+ <source>Restore Defaults</source>
+ <translation>Khôi phục về mặc định</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureUI</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="20"/>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="28"/>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="40"/>
+ <source>None</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="21"/>
+ <source>Small (32x32)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="22"/>
+ <source>Standard (64x64)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="23"/>
+ <source>Large (128x128)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="24"/>
+ <source>Full Size (256x256)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="29"/>
+ <source>Small (24x24)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="30"/>
+ <source>Standard (48x48)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="31"/>
+ <source>Large (72x72)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="36"/>
+ <source>Filename</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="37"/>
+ <source>Filetype</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="38"/>
+ <source>Title ID</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="39"/>
+ <source>Title Name</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureUi</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="17"/>
+ <source>UI</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="23"/>
+ <source>General</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="31"/>
+ <source>Note: Changing language will apply your configuration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="43"/>
+ <source>Interface language:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="57"/>
+ <source>Theme:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="74"/>
+ <source>Game List</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="82"/>
+ <source>Show Add-Ons Column</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="91"/>
+ <source>Game Icon Size:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="105"/>
+ <source>Folder Icon Size:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="119"/>
+ <source>Row 1 Text:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="133"/>
+ <source>Row 2 Text:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="150"/>
+ <source>Screenshots</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="158"/>
+ <source>Ask Where To Save Screenshots (Windows Only)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="167"/>
+ <source>Screenshots Path: </source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.ui" line="177"/>
+ <source>...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="93"/>
+ <source>Select Screenshots Path...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="173"/>
+ <source>&lt;System&gt;</source>
+ <translation>&lt;System&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_ui.cpp" line="174"/>
+ <source>English</source>
+ <translation>Tiếng Anh</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigureVibration</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="14"/>
+ <source>Configure Vibration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="23"/>
+ <source>Vibration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="56"/>
+ <source>Player 1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="89"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="193"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="245"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="315"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="367"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="419"/>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="471"/>
+ <source>%</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="108"/>
+ <source>Player 2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="160"/>
+ <source>Player 3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="212"/>
+ <source>Player 4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="282"/>
+ <source>Player 5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="334"/>
+ <source>Player 6</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="386"/>
+ <source>Player 7</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="438"/>
+ <source>Player 8</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="496"/>
+ <source>Settings</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_vibration.ui" line="502"/>
+ <source>Enable Accurate Vibration</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ConfigureWeb</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="14"/>
+ <source>Form</source>
+ <translation>Mẫu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="17"/>
+ <source>Web</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="25"/>
+ <source>yuzu Web Service</source>
+ <translation>Dịch vụ Web yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="31"/>
+ <source>By providing your username and token, you agree to allow yuzu to collect additional usage data, which may include user identifying information.</source>
+ <translation>Bằng cách cung cấp tên đăng nhập và mã thông báo của bạn, bạn đã chấp thuận sẽ cho phép yuzu thu thập dữ liệu đã sử dụng, trong đó có thể có thông tin nhận dạng người dùng.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="49"/>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="155"/>
+ <source>Verify</source>
+ <translation>Xác nhận</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="56"/>
+ <source>Sign up</source>
+ <translation>Đăng ký</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="66"/>
+ <source>Token: </source>
+ <translation>Mã thông báo: </translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="76"/>
+ <source>Username: </source>
+ <translation>Tên người dùng: </translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="93"/>
+ <source>What is my token?</source>
+ <translation>Mã thông báo của tôi là gì?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="118"/>
+ <source>Telemetry</source>
+ <translation>Viễn trắc</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="124"/>
+ <source>Share anonymous usage data with the yuzu team</source>
+ <translation>Chia sẽ dữ liệu sử dụng ẩn danh với nhóm yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="131"/>
+ <source>Learn more</source>
+ <translation>Tìm hiểu thêm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="140"/>
+ <source>Telemetry ID:</source>
+ <translation>ID Viễn trắc: </translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="156"/>
+ <source>Regenerate</source>
+ <translation>Tạo mới</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="170"/>
+ <source>Discord Presence</source>
+ <translation>Hiện diện trên Discord</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.ui" line="176"/>
+ <source>Show Current Game in your Discord Status</source>
+ <translation>Hiển thị trò chơi hiện tại lên thông tin Discord của bạn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="69"/>
+ <source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Learn more&lt;/span&gt;&lt;/a&gt;</source>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Tìm hiểu thêm&lt;/span&gt;&lt;/a&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="73"/>
+ <source>&lt;a href=&apos;https://profile.yuzu-emu.org/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Sign up&lt;/span&gt;&lt;/a&gt;</source>
+ <translation>&lt;a href=&apos;https://profile.yuzu-emu.org/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Đăng ký&lt;/span&gt;&lt;/a&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="77"/>
+ <source>&lt;a href=&apos;https://yuzu-emu.org/wiki/yuzu-web-service/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;What is my token?&lt;/span&gt;&lt;/a&gt;</source>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/yuzu-web-service/&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Mã thông báo của tôi là gì?&lt;/span&gt;&lt;/a&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="126"/>
+ <source>Telemetry ID: 0x%1</source>
+ <translation>ID Viễn trắc: 0x%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="92"/>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="166"/>
+ <source>Unspecified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="118"/>
+ <source>Token not verified</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="119"/>
+ <source>Token was not verified. The change to your token has not been saved.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="145"/>
+ <source>Verifying...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="167"/>
+ <source>Verification failed</source>
+ <translation>Xác nhận không thành công</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_web.cpp" line="168"/>
+ <source>Verification failed. Check that you have entered your token correctly, and that your internet connection is working.</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>ControllerDialog</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
+ <source>Controller P1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
+ <source>&amp;Controller P1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>GMainWindow</name>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
+ <source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
+ <translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Dữ liệu ẩn danh được thu thập&lt;/a&gt;để hỗ trợ cải thiện yuzu. &lt;br/&gt;&lt;br/&gt;Bạn có muốn chia sẽ dữ liệu sử dụng cho chúng tôi?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
+ <source>Telemetry</source>
+ <translation>Viễn trắc</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
+ <source>Loading Web Applet...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
+ <source>Disable Web Applet</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
+ <source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
+ <source>The amount of shaders currently being built</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
+ <source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
+ <translation>Tốc độ giả lập hiện tại. Giá trị cao hơn hoặc thấp hơn 100% chỉ ra giả lập sẽ chạy nhanh hơn hoặc chậm hơn trên máy Switch</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
+ <source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
+ <translation>Có bao nhiêu khung hình trên mỗi giây mà trò chơi đang hiển thị. Điều này sẽ thay đổi từ trò chơi này đến trò chơi kia và khung cảnh này đến khung cảnh kia.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
+ <source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
+ <translation>Thời gian mà giả lập lấy từ khung hình Switch, sẽ không kể đến giới hạn khung hình hoặc v-sync. Đối với tốc độ tối đa mà giả lập nhận được nhiều nhất là ở độ khoảng 16.67 ms.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
+ <source>Invalid config detected</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
+ <source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
+ <source>DOCK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
+ <source>VULKAN</source>
+ <translation>VULKAN</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
+ <source>OPENGL</source>
+ <translation>OPENGL</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
+ <source>&amp;Clear Recent Files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1285"/>
+ <source>Warning Outdated Game Format</source>
+ <translation>Chú ý định dạng trò chơi đã lỗi thời</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1286"/>
+ <source>You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.&lt;br&gt;&lt;br&gt;For an explanation of the various Switch formats yuzu supports, &lt;a href=&apos;https://yuzu-emu.org/wiki/overview-of-switch-game-formats&apos;&gt;check out our wiki&lt;/a&gt;. This message will not be shown again.</source>
+ <translation>Bạn đang sử dụng định dạng danh mục ROM giải mã cho trò chơi này, và đó là một định dạng lỗi thời đã được thay thế bởi những thứ khác như NCA, NAX, XCI, hoặc NSP. Danh mục ROM giải mã có thể thiếu biểu tượng, metadata, và hỗ trợ cập nhật.&lt;br&gt;&lt;br&gt;Để giải thích về các định dạng khác nhau của Switch mà yuzu hỗ trợ, &lt;a href=&apos;https://yuzu-emu.org/wiki/overview-of-switch-game-formats&apos;&gt;vui lòng kiểm tra trên wiki của chúng tôi&lt;/a&gt;. Thông báo này sẽ không hiển thị lại lần sau.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1298"/>
+ <location filename="../../src/yuzu/main.cpp" line="1335"/>
+ <source>Error while loading ROM!</source>
+ <translation>Xảy ra lỗi khi đang nạp ROM!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1299"/>
+ <source>The ROM format is not supported.</source>
+ <translation>Định dạng ROM này không hỗ trợ.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1303"/>
+ <source>An error occurred initializing the video core.</source>
+ <translation>Đã xảy ra lỗi khi khởi tạo lõi video.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1304"/>
+ <source>yuzu has encountered an error while running the video core, please see the log for more details.For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.Ensure that you have the latest graphics drivers for your GPU.</source>
+ <translation>yuzu đã gặp lỗi trong quá trình đang chạy lõi video, vui lòng kiểm tra sổ ghi chép để biết thêm chi tiết. Để biết thêm thông tin về cách truy cập sổ ghi chép, vui lòng xem trang sau: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Làm sao để tải tệp tin sổ ghi chép lên&lt;/a&gt;.Hãy chắc rằng bạn đang sử dụng trình điều khiển đồ họa GPU mới nhất.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1322"/>
+ <source>Error while loading ROM! %1</source>
+ <comment>%1 signifies a numeric error code.</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1325"/>
+ <source>%1&lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to redump your files.&lt;br&gt;You can refer to the yuzu wiki&lt;/a&gt; or the yuzu Discord&lt;/a&gt; for help.</source>
+ <comment>%1 signifies an error string.</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1336"/>
+ <source>An unknown error occurred. Please see the log for more details.</source>
+ <translation>Đã xảy ra lỗi không xác định. Vui lòng kiểm tra sổ ghi chép để biết thêm chi tiết.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
+ <source>(64-bit)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
+ <source>(32-bit)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
+ <source>%1 %2</source>
+ <comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
+ <source>Save Data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
+ <source>Mod Data</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
+ <source>Error Opening %1 Folder</source>
+ <translation>Xảy ra lỗi khi mở %1 thư mục</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
+ <source>Folder does not exist!</source>
+ <translation>Thư mục này không tồn tại!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
+ <source>Error Opening Transferable Shader Cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
+ <source>Failed to create the shader cache directory for this title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
+ <source>Contents</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
+ <source>Update</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
+ <source>DLC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <source>Remove Entry</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <source>Remove Installed Game %1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
+ <source>Successfully Removed</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
+ <source>Successfully removed the installed base game.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
+ <source>Error Removing %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
+ <source>The base game is not installed in the NAND and cannot be removed.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
+ <source>Successfully removed the installed update.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
+ <source>There is no update installed for this title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
+ <source>There are no DLC installed for this title.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
+ <source>Successfully removed %1 installed DLC.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
+ <source>Delete OpenGL Transferable Shader Cache?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
+ <source>Delete Vulkan Transferable Shader Cache?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
+ <source>Delete All Transferable Shader Caches?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
+ <source>Remove Custom Game Configuration?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
+ <source>Remove File</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
+ <source>Error Removing Transferable Shader Cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
+ <source>A shader cache for this title does not exist.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
+ <source>Successfully removed the transferable shader cache.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
+ <source>Failed to remove the transferable shader cache.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <source>Error Removing Transferable Shader Caches</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
+ <source>Successfully removed the transferable shader caches.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
+ <source>Failed to remove the transferable shader cache directory.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
+ <source>Error Removing Custom Configuration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
+ <source>A custom configuration for this title does not exist.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
+ <source>Successfully removed the custom game configuration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
+ <source>Failed to remove the custom game configuration.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
+ <source>RomFS Extraction Failed!</source>
+ <translation>Khai thác RomFS không thành công!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
+ <source>There was an error copying the RomFS files or the user cancelled the operation.</source>
+ <translation>Đã xảy ra lỗi khi sao chép tệp tin RomFS hoặc người dùng đã hủy bỏ hoạt động này.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
+ <source>Full</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
+ <source>Skeleton</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
+ <source>Select RomFS Dump Mode</source>
+ <translation>Chọn chế độ kết xuất RomFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
+ <source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
+ <translation>Vui lòng chọn RomFS mà bạn muốn kết xuất như thế nào.&lt;br&gt;Đầy đủ sẽ sao chép toàn bộ tệp tin vào một danh mục mới trong khi &lt;br&gt;bộ xương chỉ tạo kết cấu danh mục.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
+ <source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <source>Extracting RomFS...</source>
+ <translation>Khai thác RomFS...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
+ <source>Cancel</source>
+ <translation>Hủy bỏ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <source>RomFS Extraction Succeeded!</source>
+ <translation>Khai thác RomFS thành công!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
+ <source>The operation completed successfully.</source>
+ <translation>Các hoạt động đã hoàn tất thành công.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
+ <source>Error Opening %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
+ <source>Select Directory</source>
+ <translation>Chọn danh mục</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
+ <source>Properties</source>
+ <translation>Thuộc tính</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
+ <source>The game properties could not be loaded.</source>
+ <translation>Thuộc tính của trò chơi không thể nạp được.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
+ <source>Switch Executable (%1);;All Files (*.*)</source>
+ <comment>%1 is an identifier for the Switch executable file extensions.</comment>
+ <translation>Thực thi Switch (%1);;Tất cả tệp tin (*.*)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
+ <source>Load File</source>
+ <translation>Nạp tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
+ <source>Open Extracted ROM Directory</source>
+ <translation>Mở danh mục ROM đã trích xuất</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
+ <source>Invalid Directory Selected</source>
+ <translation>Danh mục đã chọn không hợp lệ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
+ <source>The directory you have selected does not contain a &apos;main&apos; file.</source>
+ <translation>Danh mục mà bạn đã chọn không có chứa tệp tin &apos;main&apos;.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
+ <source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
+ <translation>Những tệp tin Switch cài được (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
+ <source>Install Files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
+ <source>%n file(s) remaining</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
+ <source>Installing file &quot;%1&quot;...</source>
+ <translation>Đang cài đặt tệp tin &quot;%1&quot;...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <source>Install Results</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
+ <source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
+Please, only use this feature to install updates and DLC.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
+ <source>%n file(s) were newly installed
+</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
+ <source>%n file(s) were overwritten
+</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
+ <source>%n file(s) failed to install
+</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
+ <source>System Application</source>
+ <translation>Hệ thống ứng dụng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
+ <source>System Archive</source>
+ <translation>Hệ thống lưu trữ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
+ <source>System Application Update</source>
+ <translation>Cập nhật hệ thống ứng dụng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
+ <source>Firmware Package (Type A)</source>
+ <translation>Gói phần mềm (Loại A)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
+ <source>Firmware Package (Type B)</source>
+ <translation>Gói phần mềm (Loại B)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
+ <source>Game</source>
+ <translation>Trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
+ <source>Game Update</source>
+ <translation>Cập nhật trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <source>Game DLC</source>
+ <translation>Nội dung trò chơi có thể tải xuống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <source>Delta Title</source>
+ <translation>Tiêu đề Delta</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <source>Select NCA Install Type...</source>
+ <translation>Chọn loại NCA để cài đặt...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <source>Please select the type of title you would like to install this NCA as:
+(In most instances, the default &apos;Game&apos; is fine.)</source>
+ <translation>Vui lòng chọn loại tiêu đề mà bạn muốn cài đặt NCA này:
+(Trong hầu hết trường hợp, chọn mặc định &apos;Game&apos; là tốt nhất.)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <source>Failed to Install</source>
+ <translation>Cài đặt đã không thành công</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <source>The title type you selected for the NCA is invalid.</source>
+ <translation>Loại tiêu đề NCA mà bạn chọn nó không hợp lệ.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
+ <source>File not found</source>
+ <translation>Không tìm thấy tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
+ <source>File &quot;%1&quot; not found</source>
+ <translation>Không tìm thấy &quot;%1&quot; tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
+ <source>OK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
+ <source>Missing yuzu Account</source>
+ <translation>Thiếu tài khoản yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
+ <source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
+ <translation>Để gửi trường hợp thử nghiệm trò chơi tương thích, bạn phải liên kết tài khoản yuzu.&lt;br&gt;&lt;br/&gt;Để liên kết tải khoản yuzu của bạn, hãy đến Giả lập &amp;gt; Thiết lập &amp;gt; Web.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
+ <source>Error opening URL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
+ <source>Unable to open the URL &quot;%1&quot;.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <source>Amiibo File (%1);; All Files (*.*)</source>
+ <translation>Tệp tin Amiibo (%1);; Tất cả tệp tin (*.*)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <source>Load Amiibo</source>
+ <translation>Nạp dữ liệu Amiibo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
+ <source>Error opening Amiibo data file</source>
+ <translation>Xảy ra lỗi khi mở dữ liệu tệp tin Amiibo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
+ <source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
+ <translation>Không thể mở tệp tin Amiibo &quot;%1&quot; để đọc.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
+ <source>Error reading Amiibo data file</source>
+ <translation>Xảy ra lỗi khi đọc dữ liệu tệp tin Amiibo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
+ <source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
+ <translation>Hoàn toàn không thể đọc được dữ liệu Amiibo. Dự kiến byte sẽ đọc là %1, nhưng byte chỉ có thể đọc là %2.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
+ <source>Error loading Amiibo data</source>
+ <translation>Xảy ra lỗi khi nạp dữ liệu Amiibo</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
+ <source>Unable to load Amiibo data.</source>
+ <translation>Không thể nạp dữ liệu Amiibo.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
+ <source>Capture Screenshot</source>
+ <translation>Chụp ảnh màn hình</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
+ <source>PNG Image (*.png)</source>
+ <translation>Hình ảnh PNG (*.png)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
+ <source>TAS state: Running %1/%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
+ <source>TAS state: Recording %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
+ <source>TAS state: Idle %1/%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
+ <source>TAS State: Invalid</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
+ <source>Building: %n shader(s)</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
+ <source>Speed: %1% / %2%</source>
+ <translation>Tốc độ: %1% / %2%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
+ <source>Speed: %1%</source>
+ <translation>Tốc độ: %1%</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
+ <source>Game: %1 FPS (Unlocked)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
+ <source>Game: %1 FPS</source>
+ <translation>Trò chơi: %1 FPS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
+ <source>Frame: %1 ms</source>
+ <translation>Khung hình: %1 ms</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
+ <source>GPU NORMAL</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
+ <source>GPU HIGH</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
+ <source>GPU EXTREME</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
+ <source>GPU ERROR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
+ <source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
+ <translation>Trò chơi bạn muốn chạy yêu cầu một số tệp tin được sao chép từ thiết từ máy Switch của bạn trước khi bắt đầu chơi.&lt;br/&gt;&lt;br/&gt;Để biết thêm thông tin về cách sao chép những tệp tin đó, vui lòng tham khảo những wiki sau: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Sao chép dữ liệu hệ thống và font dùng chung từ máy Switch&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Bạn có muốn trở về danh sách trò chơi? Nếu bạn vẫn tiếp tục thì trò chơi có thể gặp sự cố, dữ liệu lưu tiến trình có thể bị lỗi, hoặc bạn sẽ gặp những lỗi khác.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
+ <source>yuzu was unable to locate a Switch system archive. %1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
+ <source>yuzu was unable to locate a Switch system archive: %1. %2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
+ <source>System Archive Not Found</source>
+ <translation>Không tìm thấy tệp tin hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
+ <source>System Archive Missing</source>
+ <translation>Bị thiếu tệp tin hệ thống</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
+ <source>yuzu was unable to locate the Switch shared fonts. %1</source>
+ <translation>yuzu không thể tìm thấy vị trí font dùng chung của Switch. %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <source>Shared Fonts Not Found</source>
+ <translation>Không tìm thấy font dùng chung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
+ <source>Shared Font Missing</source>
+ <translation>Bị thiếu font dùng chung</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
+ <source>Fatal Error</source>
+ <translation>Lỗi nghiêm trọng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
+ <source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
+ <translation>yuzu đã xảy ra lỗi nghiêm trọng, vui lòng kiểm tra sổ ghi chép để biết thêm chi tiết. Để biết thêm thông tin về cách truy cập sổ ghi chép, vui lòng xem trang sau: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Làm sao để tải tệp tin sổ ghi chép lên&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Bạn có muốn trở về danh sách game? Tiếp tục có thể khiến giả lập gặp sự cố, gây hỏng dữ liệu đã lưu, hoặc gây các lỗi khác.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
+ <source>Fatal Error encountered</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
+ <source>Confirm Key Rederivation</source>
+ <translation>Xác nhận mã khóa Rederivation</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
+ <source>You are about to force rederive all of your keys.
+If you do not know what this means or what you are doing,
+this is a potentially destructive action.
+Please make sure this is what you want
+and optionally make backups.
+
+This will delete your autogenerated key files and re-run the key derivation module.</source>
+ <translation>Bạn đang muốn bắt buộc làm lại trích dẫn toàn bộ mã khóa của bạn.
+Nếu bạn không biết cái này là gì hay bạn đang làm gì,
+đây là hành động có khả năng phá hoại.
+Hãy chắc rằng đây là điều bạn muốn
+và phải tạo ra một bản sao lưu lại.
+
+Điều này sẽ xóa mã khóa tự động tạo trên tệp tin của bạn và chạy lại mô-đun mã khóa derivation.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
+ <source>Missing fuses</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
+ <source> - Missing BOOT0</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
+ <source> - Missing BCPKG2-1-Normal-Main</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
+ <source> - Missing PRODINFO</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
+ <source>Derivation Components Missing</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
+ <source>Deriving keys...
+This may take up to a minute depending
+on your system&apos;s performance.</source>
+ <translation>Mã khóa xuất phát...
+Điều này có thể mất hơn vài phút tùy thuộc
+vào hiệu suất hệ thống của bạn.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
+ <source>Deriving Keys</source>
+ <translation>Mã khóa xuất phát</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
+ <source>Select RomFS Dump Target</source>
+ <translation>Chọn thư mục để sao chép RomFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
+ <source>Please select which RomFS you would like to dump.</source>
+ <translation>Vui lòng chọn RomFS mà bạn muốn sao chép.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
+ <source>Are you sure you want to close yuzu?</source>
+ <translation>Bạn có chắc chắn muốn đóng yuzu?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
+ <source>yuzu</source>
+ <translation>yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
+ <source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
+ <translation>Bạn có chắc rằng muốn dừng giả lập? Bất kì tiến trình nào chưa được lưu sẽ bị mất.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
+ <source>The currently running application has requested yuzu to not exit.
+
+Would you like to bypass this and exit anyway?</source>
+ <translation>Chương trình đang chạy đã yêu cầu yuzu không được thoát.
+
+Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không?</translation>
+ </message>
+</context>
+<context>
+ <name>GRenderWindow</name>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
+ <source>OpenGL not available!</source>
+ <translation>Không có sẵn OpenGL!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
+ <source>yuzu has not been compiled with OpenGL support.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
+ <source>Error while initializing OpenGL!</source>
+ <translation>Đã xảy ra lỗi khi khởi tạo OpenGL!</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
+ <source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
+ <source>Error while initializing OpenGL 4.6!</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
+ <source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
+ <source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>GameList</name>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="330"/>
+ <source>Name</source>
+ <translation>Tên</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="331"/>
+ <source>Compatibility</source>
+ <translation>Tương thích</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="333"/>
+ <source>Add-ons</source>
+ <translation>Tiện ích ngoài</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="335"/>
+ <source>File type</source>
+ <translation>Loại tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="336"/>
+ <source>Size</source>
+ <translation>Kích cỡ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="508"/>
+ <source>Favorite</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="510"/>
+ <source>Start Game</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="512"/>
+ <source>Start Game without Custom Configuration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="514"/>
+ <source>Open Save Data Location</source>
+ <translation>Mở vị trí lưu dữ liệu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="515"/>
+ <source>Open Mod Data Location</source>
+ <translation>Mở vị trí chỉnh sửa dữ liệu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="517"/>
+ <source>Open Transferable Pipeline Cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="519"/>
+ <source>Remove</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="520"/>
+ <source>Remove Installed Update</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="521"/>
+ <source>Remove All Installed DLC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="522"/>
+ <source>Remove Custom Configuration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="523"/>
+ <source>Remove OpenGL Pipeline Cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="524"/>
+ <source>Remove Vulkan Pipeline Cache</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="526"/>
+ <source>Remove All Pipeline Caches</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="527"/>
+ <source>Remove All Installed Contents</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="528"/>
+ <location filename="../../src/yuzu/game_list.cpp" line="529"/>
+ <source>Dump RomFS</source>
+ <translation>Kết xuất RomFS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="530"/>
+ <source>Dump RomFS to SDMC</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="531"/>
+ <source>Copy Title ID to Clipboard</source>
+ <translation>Sao chép ID tiêu đề vào bộ nhớ tạm</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="532"/>
+ <source>Navigate to GameDB entry</source>
+ <translation>Điều hướng đến mục cơ sở dữ liệu trò chơi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="534"/>
+ <source>Properties</source>
+ <translation>Thuộc tính</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="606"/>
+ <source>Scan Subfolders</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="607"/>
+ <source>Remove Game Directory</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="626"/>
+ <source>▲ Move Up</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="627"/>
+ <source>▼ Move Down</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="628"/>
+ <source>Open Directory Location</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="673"/>
+ <source>Clear</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>GameListItemCompat</name>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="151"/>
+ <source>Perfect</source>
+ <translation>Tốt nhất</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="151"/>
+ <source>Game functions flawless with no audio or graphical glitches, all tested functionality works as intended without
+any workarounds needed.</source>
+ <translation>Có thể chơi một cách mượt mà mà không có lỗi âm thanh hoặc đồ họa nào, tất cả các chức năng đều hoạt động như ý mà không cần bất kì tinh chỉnh nào.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="152"/>
+ <source>Great</source>
+ <translation>Tốt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="152"/>
+ <source>Game functions with minor graphical or audio glitches and is playable from start to finish. May require some
+workarounds.</source>
+ <translation>Có thể chơi từ đầu đến cuối nhưng vẫn có một số lỗi nhỏ về đồ họa hoặc âm thanh. Có thể sẽ cần tới một vài tinh chỉnh nào đó.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="153"/>
+ <source>Okay</source>
+ <translation>Tạm ổn</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="153"/>
+ <source>Game functions with major graphical or audio glitches, but game is playable from start to finish with
+workarounds.</source>
+ <translation>Tạm chơi được nhưng có lỗi đồ họa hoặc âm thanh một cách đáng kể, tuy vậy vẫn có thể chơi hết từ đầu đến cuối với một số tinh chỉnh.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="154"/>
+ <source>Bad</source>
+ <translation>Không tốt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="154"/>
+ <source>Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches
+even with workarounds.</source>
+ <translation>Chơi được nhưng có nhiều lỗi đồ họa hoặc âm thanh. Không thể chơi tiếp ở một số nơi nào đó do lỗi dù có tinh chỉnh thế nào đi nữa.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="155"/>
+ <source>Intro/Menu</source>
+ <translation>Phần mở đầu/Menu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="155"/>
+ <source>Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start
+Screen.</source>
+ <translation>Hoàn toàn không thể chơi được do có nhiều lỗi đồ họa hoặc âm thanh. Không thể chơi tiếp sau khi bấm nút bắt đầu trò chơi.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="156"/>
+ <source>Won&apos;t Boot</source>
+ <translation>Không hoạt động</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="156"/>
+ <source>The game crashes when attempting to startup.</source>
+ <translation>Trò chơi sẽ thoát đột ngột khi khởi động.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="157"/>
+ <source>Not Tested</source>
+ <translation>Chưa ai thử</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="157"/>
+ <source>The game has not yet been tested.</source>
+ <translation>Trò chơi này chưa có ai thử cả.</translation>
+ </message>
+</context>
+<context>
+ <name>GameListPlaceholder</name>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="846"/>
+ <source>Double-click to add a new folder to the game list</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>GameListSearchField</name>
+ <message numerus="yes">
+ <location filename="../../src/yuzu/game_list.cpp" line="85"/>
+ <source>%1 of %n result(s)</source>
+ <translation type="unfinished"><numerusform></numerusform></translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="128"/>
+ <source>Filter:</source>
+ <translation>Bộ lọc:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list.cpp" line="131"/>
+ <source>Enter pattern to filter</source>
+ <translation>Nhập khuôn để lọc</translation>
+ </message>
+</context>
+<context>
+ <name>InstallDialog</name>
+ <message>
+ <location filename="../../src/yuzu/install_dialog.cpp" line="31"/>
+ <source>Please confirm these are the files you wish to install.</source>
+ <translation>Xin hãy xác nhận đây là những tệp tin bạn muốn cài.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/install_dialog.cpp" line="34"/>
+ <source>Installing an Update or DLC will overwrite the previously installed one.</source>
+ <translation>Cài đặt một tệp tin cập nhật hoặc DLC mới sẽ thay thế những tệp cũ đã cài trước đó.</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/install_dialog.cpp" line="38"/>
+ <source>Install</source>
+ <translation>Cài đặt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/install_dialog.cpp" line="52"/>
+ <source>Install Files to NAND</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>LimitableInputDialog</name>
+ <message>
+ <location filename="../../src/yuzu/util/limitable_input_dialog.cpp" line="62"/>
+ <source>The text can't contain any of the following characters:
+%1</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>LoadingScreen</name>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.ui" line="84"/>
+ <source>Loading Shaders 387 / 1628</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.ui" line="121"/>
+ <source>Loading Shaders %v out of %m</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.ui" line="135"/>
+ <source>Estimated Time 5m 4s</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.cpp" line="91"/>
+ <source>Loading...</source>
+ <translation>Đang tải...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.cpp" line="92"/>
+ <source>Loading Shaders %1 / %2</source>
+ <translation>Đang nạp shader %1 / %2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.cpp" line="93"/>
+ <source>Launching...</source>
+ <translation>Đang mở...</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/loading_screen.cpp" line="174"/>
+ <source>Estimated Time %1</source>
+ <translation>Ước tính thời gian %1</translation>
+ </message>
+</context>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="14"/>
+ <source>yuzu</source>
+ <translation>yuzu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="44"/>
+ <source>&amp;File</source>
+ <translation>&amp;Tệp tin</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="48"/>
+ <source>&amp;Recent Files</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="67"/>
+ <source>&amp;Emulation</source>
+ <translation>&amp;Giả lập</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
+ <source>&amp;View</source>
+ <translation>&amp;Xem</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
+ <source>&amp;Reset Window Size</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
+ <source>Reset Window Size to &amp;720p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
+ <source>Reset Window Size to 720p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
+ <source>Reset Window Size to &amp;900p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
+ <source>Reset Window Size to 900p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
+ <source>Reset Window Size to &amp;1080p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
+ <source>Reset Window Size to 1080p</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
+ <source>&amp;Tools</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
+ <source>&amp;Help</source>
+ <translation>&amp;Trợ giúp</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
+ <source>&amp;Install Files to NAND...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
+ <source>L&amp;oad File...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
+ <source>Load &amp;Folder...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
+ <source>E&amp;xit</source>
+ <translation>Th&amp;oát</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;Tạm dừng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
+ <source>&amp;Stop</source>
+ <translation>&amp;Dừng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
+ <source>&amp;Reinitialize keys...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
+ <source>&amp;About yuzu</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
+ <source>Single &amp;Window Mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
+ <source>Con&amp;figure...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
+ <source>Display D&amp;ock Widget Headers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
+ <source>Show &amp;Filter Bar</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
+ <source>Show &amp;Status Bar</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
+ <source>Show Status Bar</source>
+ <translation>Hiển thị thanh trạng thái</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
+ <source>F&amp;ullscreen</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
+ <source>&amp;Restart</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
+ <source>Load &amp;Amiibo...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
+ <source>&amp;Report Compatibility</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
+ <source>Open &amp;Mods Page</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
+ <source>Open &amp;Quickstart Guide</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
+ <source>&amp;FAQ</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
+ <source>Open &amp;yuzu Folder</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
+ <source>&amp;Capture Screenshot</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
+ <source>Configure C&amp;urrent Game...</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>&amp;Bắt đầu</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>MicroProfileDialog</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/profiler.cpp" line="51"/>
+ <source>&amp;MicroProfile</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>OverlayDialog</name>
+ <message>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="14"/>
+ <source>Dialog</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="134"/>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="353"/>
+ <source>Cancel</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="152"/>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="371"/>
+ <source>OK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/util/overlay_dialog.ui" line="313"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:18pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>PlayerControlPreview</name>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
+ <source>START/PAUSE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="244"/>
+ <source>Installed SD Titles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="252"/>
+ <source>Installed NAND Titles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="260"/>
+ <source>System Titles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="303"/>
+ <source>Add New Game Directory</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/game_list_p.h" line="326"/>
+ <source>Favorites</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
+ <source>Shift</source>
+ <translation>Shift</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
+ <source>Ctrl</source>
+ <translation>Ctrl</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
+ <source>Alt</source>
+ <translation>Alt</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
+ <source>[not set]</source>
+ <translation>[chưa đặt nút]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
+ <source>Hat %1 %2</source>
+ <translation>Mũ %1 %2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
+ <source>Axis %1%2</source>
+ <translation>Trục %1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
+ <source>Button %1</source>
+ <translation>Nút %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
+ <source>[unknown]</source>
+ <translation>[không xác định]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
+ <source>Down</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
+ <source>Up</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
+ <source>Z</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
+ <source>R</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
+ <source>L</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
+ <source>[unused]</source>
+ <translation>[không sử dụng]</translation>
+ </message>
+</context>
+<context>
+ <name>QtControllerSelectorDialog</name>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="14"/>
+ <source>Controller Applet</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="129"/>
+ <source>Supported Controller Types:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="282"/>
+ <source>Players:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="300"/>
+ <source>1 - 8</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="418"/>
+ <source>P4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="514"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="711"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="912"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1222"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1459"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
+ <source>Pro Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="519"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="716"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="917"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1227"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1464"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
+ <source>Dual Joycons</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="524"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="721"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="922"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1232"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1469"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <source>Left Joycon</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="529"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="726"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="927"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1237"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1474"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <source>Right Joycon</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="538"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="735"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="941"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1246"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1483"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1680"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1881"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2078"/>
+ <source>Use Current Config</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="615"/>
+ <source>P2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="812"/>
+ <source>P1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
+ <source>Handheld</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1126"/>
+ <source>P3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1363"/>
+ <source>P7</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1560"/>
+ <source>P8</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1757"/>
+ <source>P5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="1958"/>
+ <source>P6</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2272"/>
+ <source>Console Mode</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2293"/>
+ <source>Docked</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2303"/>
+ <source>Undocked</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2313"/>
+ <source>Vibration</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2349"/>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2395"/>
+ <source>Configure</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2359"/>
+ <source>Motion</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2405"/>
+ <source>Profiles</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2432"/>
+ <source>Create</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2467"/>
+ <source>Controllers</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2481"/>
+ <source>1</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2508"/>
+ <source>2</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2518"/>
+ <source>4</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2528"/>
+ <source>3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2538"/>
+ <source>Connected</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2552"/>
+ <source>5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2569"/>
+ <source>7</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2586"/>
+ <source>6</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.ui" line="2596"/>
+ <source>8</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
+ <source>GameCube Controller</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>QtErrorDisplay</name>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="22"/>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="35"/>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="50"/>
+ <source>Error Code: %1-%2 (0x%3)</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="26"/>
+ <source>An error has occurred.
+Please try again or contact the developer of the software.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="39"/>
+ <source>An error occurred on %1 at %2.
+Please try again or contact the developer of the software.</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_error.cpp" line="54"/>
+ <source>An error has occurred.
+
+%1
+
+%2</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>QtProfileSelectionDialog</name>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_profile_select.cpp" line="22"/>
+ <source>%1
+%2</source>
+ <comment>%1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF))</comment>
+ <translation>%1
+%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_profile_select.cpp" line="52"/>
+ <source>Select a user:</source>
+ <translation>Chọn một người dùng:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_profile_select.cpp" line="81"/>
+ <source>Users</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_profile_select.cpp" line="112"/>
+ <source>Profile Selector</source>
+ <translation>Chọn hồ sơ</translation>
+ </message>
+</context>
+<context>
+ <name>QtSoftwareKeyboardDialog</name>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="14"/>
+ <source>Software Keyboard</source>
+ <translation>Phần mềm bàn phím</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="199"/>
+ <source>Enter Text</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.ui" line="479"/>
+ <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:26pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
+ <source>OK</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
+ <source>Cancel</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>SequenceDialog</name>
+ <message>
+ <location filename="../../src/yuzu/util/sequence_dialog/sequence_dialog.cpp" line="11"/>
+ <source>Enter a hotkey</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>WaitTreeCallstack</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="150"/>
+ <source>Call stack</source>
+ <translation>Chùm cuộc gọi</translation>
+ </message>
+</context>
+<context>
+ <name>WaitTreeMutexInfo</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="129"/>
+ <source>waiting for mutex 0x%1</source>
+ <translation>chờ đợi loại trừ lẫn nhau 0x%1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="136"/>
+ <source>has waiters: %1</source>
+ <translation>đã chờ đợi: %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="138"/>
+ <source>owner handle: 0x%1</source>
+ <translation>chủ điều khiển: 0x%1</translation>
+ </message>
+</context>
+<context>
+ <name>WaitTreeObjectList</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="231"/>
+ <source>waiting for all objects</source>
+ <translation>chờ đợi toàn bộ đối tượng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="232"/>
+ <source>waiting for one of the following objects</source>
+ <translation>chờ đợi một đối tượng đang theo dõi</translation>
+ </message>
+</context>
+<context>
+ <name>WaitTreeSynchronizationObject</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="188"/>
+ <source>[%1] %2 %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="215"/>
+ <source>waited by no thread</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+<context>
+ <name>WaitTreeThread</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="253"/>
+ <source>runnable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="255"/>
+ <source>paused</source>
+ <translation>tạm dừng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="261"/>
+ <source>sleeping</source>
+ <translation>ngủ</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="264"/>
+ <source>waiting for IPC reply</source>
+ <translation>chờ đợi IPC phản hồi</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="267"/>
+ <source>waiting for objects</source>
+ <translation>chờ đợi đối tượng</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="270"/>
+ <source>waiting for condition variable</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="273"/>
+ <source>waiting for address arbiter</source>
+ <translation>chờ đợi địa chỉ người đứng giữa</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="276"/>
+ <source>waiting for suspend resume</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="279"/>
+ <source>waiting</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="284"/>
+ <source>initialized</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="287"/>
+ <source>terminated</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="290"/>
+ <source>unknown</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="295"/>
+ <source> PC = 0x%1 LR = 0x%2</source>
+ <translation> PC = 0x%1 LR = 0x%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="345"/>
+ <source>ideal</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="348"/>
+ <source>core %1</source>
+ <translation>lõi %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="352"/>
+ <source>processor = %1</source>
+ <translation>bộ xử lý = %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="354"/>
+ <source>ideal core = %1</source>
+ <translation>lõi lý tưởng = %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="356"/>
+ <source>affinity mask = %1</source>
+ <translation>che đậy tánh giống nhau = %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="357"/>
+ <source>thread id = %1</source>
+ <translation>id luồng = %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="358"/>
+ <source>priority = %1(current) / %2(normal)</source>
+ <translation>quyền ưu tiên = %1(hiện tại) / %2(bình thường)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="362"/>
+ <source>last running ticks = %1</source>
+ <translation>lần chạy cuối cùng = %1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="370"/>
+ <source>not waiting for mutex</source>
+ <translation>không có chờ đợi loại trừ lẫn nhau</translation>
+ </message>
+</context>
+<context>
+ <name>WaitTreeThreadList</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="394"/>
+ <source>waited by thread</source>
+ <translation>chờ đợi bởi vì có luồng</translation>
+ </message>
+</context>
+<context>
+ <name>WaitTreeWidget</name>
+ <message>
+ <location filename="../../src/yuzu/debugger/wait_tree.cpp" line="468"/>
+ <source>&amp;Wait Tree</source>
+ <translation type="unfinished"/>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts
index 488ca8dce..164cfbe14 100644
--- a/dist/languages/zh_CN.ts
+++ b/dist/languages/zh_CN.ts
@@ -663,7 +663,12 @@ p, li { white-space: pre-wrap; }
<translation>启用自动函数打桩(Auto-Stub)**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation>启用其他控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**该选项将在 yuzu 关闭时自动重置。</translation>
</message>
@@ -943,67 +948,78 @@ p, li { white-space: pre-wrap; }
<translation>通用</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>帧率限制</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation>使用全局帧率限制</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation>设置帧率限制:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
<translation>使用 FPS 限制器的热键才能进行运行速度的切换。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>帧率限制</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>运行速度限制</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>多核 CPU 仿真</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>在游戏运行时退出需要确认</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>游戏启动时提示选择用户</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>模拟器位于后台时暂停模拟</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>自动隐藏鼠标光标</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>重置所有设置项</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>将重置模拟器所有设置并删除所有游戏的单独设置。这不会删除游戏目录、个人文件及输入配置文件。是否继续?</translation>
</message>
@@ -1121,18 +1137,113 @@ p, li { white-space: pre-wrap; }
<translation>拉伸窗口</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>画面分辨率:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [实验性]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [实验性]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation>窗口滤镜:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation>近邻取样</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation>双线性过滤</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation>双三线过滤</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation>高斯模糊</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>强制缩放</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation>AMD FidelityFX™️ 超高清技术 [仅限 Vulkan 模式]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>抗锯齿方式:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>无</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>快速近似抗锯齿</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>使用全局背景颜色</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>设置背景颜色:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>背景颜色:</translation>
</message>
@@ -1201,28 +1312,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>系统默认</translation>
+ <source>Automatic</source>
+ <translation>自动</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation>2x (可能有问题)</translation>
+ <source>Default</source>
+ <translation>系统默认</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation>4x (可能有问题)</translation>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation>8x (可能有问题)</translation>
+ <source>4x</source>
+ <translation>4x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation>16x (可能有问题)</translation>
+ <source>8x</source>
+ <translation>8x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>16x</translation>
</message>
</context>
<context>
@@ -1549,8 +1665,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>其他</translation>
+ <source>Emulated Devices</source>
+ <translation>模拟设备</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1559,499 +1675,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>使用键盘输入映射模拟摇杆</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>启用鼠标平移</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>鼠标灵敏度</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>高级选项</translation>
+ <source>Mouse</source>
+ <translation>鼠标</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>触摸屏</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>鼠标</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>高级选项</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>体感/触摸</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>控制器调试</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>控制器调试</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>其他</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>使用键盘输入映射模拟摇杆</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>需要重启 yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>启用 XInput 8 输入支持 (禁用 web 应用程序)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>输入设置</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation>启用 UDP 控制器 (无需运动)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>连接控制器</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>启用鼠标平移</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro Controller</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>鼠标灵敏度</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>双 Joycons 手柄</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>左 Joycon 手柄</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>体感/触摸</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>右 Joycon 手柄</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>输入设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>掌机模式</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>连接控制器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>输入设备</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>任意</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>键盘/鼠标</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>用户配置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>保存</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>新建</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>删除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>左摇杆</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>上</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>左</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>右</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
<translation>按下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>轻推</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>灵敏度</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>摇杆死区:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>摇杆灵敏度:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>十字方向键</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>-</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>截图</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>+</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>Home</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>体感 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>体感 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>主要按键</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>右摇杆</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>清除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[未设置]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>切换按键</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation>反转按钮</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>体感方向倒置</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>阈值设定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>选择一个介于 0% 和 100% 之间的值</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>映射摇杆</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>在按下确定后,首先水平移动你的手柄,然后垂直移动它。
如果要使体感方向倒置,首先垂直移动你的手柄,然后水平移动它。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>体感方向倒置</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>摇杆死区:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>摇杆灵敏度:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro Controller</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>双 Joycons 手柄</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>左 Joycon 手柄</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>右 Joycon 手柄</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>掌机模式</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube 控制器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation>精灵球 PLUS</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation>NES 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation>SNES 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation>N64 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation>世嘉创世纪</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>开始 / 暂停</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>控制摇杆</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C 摇杆</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>摇动!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[等待中]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>保存自定义设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>输入配置文件名称:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>新建输入配置文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>输入的配置文件名称无效!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>新建输入配置文件 &quot;%1&quot; 失败</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>删除输入配置文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>删除输入配置文件 &quot;%1&quot; 失败</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>加载输入配置文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>加载输入配置文件 &quot;%1&quot; 失败</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>保存输入配置文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>保存输入配置文件 &quot;%1&quot; 失败</translation>
</message>
@@ -2077,85 +2218,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>体感/触摸设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>鼠标体感</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>灵敏度:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>触摸</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP 校准:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>使用按键映射:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation>触摸屏映射配置文件:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP 设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>您可以使用任何与 Cemuhook 兼容的 UDP 输入源来提供体感和触摸输入。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>服务器:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>端口:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>了解更多</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>测试</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>添加服务器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>移除服务器</translation>
</message>
@@ -2165,146 +2296,82 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;了解更多&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>端口号中包含无效字符</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>端口必须为 0 到 65353 之间</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>无效的 IP 地址</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>此 UDP 服务器已存在</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>最多只能添加 8 个服务器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>测试中</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>配置中</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>测试成功</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>已成功地从服务器获取数据。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>测试失败</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>无法从服务器获取数据。&lt;br&gt;请验证服务器是否正在运行,以及地址和端口是否配置正确。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP 测试或触摸校准正在进行中。&lt;br&gt;请耐心等待。</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>鼠标设置</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>鼠标按键</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>前:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>后:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>左:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>中:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>右:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>清除</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>系统默认</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[未设置]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>恢复默认</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[请按一个键]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
@@ -3087,31 +3154,26 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation>自动切换手柄配置文件</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
<translation>循环脚本</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
<translation>遇到载入画面时暂停执行</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
<translation>脚本目录</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>路径</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3124,7 +3186,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>TAS 设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
<translation>选择 TAS 载入目录...</translation>
</message>
@@ -3186,37 +3248,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>保存自定义设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>为新的自定义设置命名。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>删除自定义设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>真的要删除自定义设置 %1 吗?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>重命名自定义设置</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>新名称:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[请按一个键]</translation>
</message>
@@ -3636,12 +3698,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>控制器 P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>控制器 P1 (&amp;C)</translation>
</message>
@@ -3649,90 +3711,95 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;我们收集匿名数据&lt;/a&gt;来帮助改进 yuzu 。&lt;br/&gt;&lt;br/&gt;您愿意和我们分享您的使用数据吗?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>使用数据共享</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>正在加载 Web 应用程序...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>禁用 Web 应用程序</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>禁用 web 程序将导致它在模拟窗口中不再显示。这可能导致未知的后果,且只能用于《超级马里奥 3D 全明星》中。您确定要禁用 web 程序吗?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
- <translation>当前正在构建的着色器的数量</translation>
+ <translation>当前正在构建的着色器数量</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>当前选定的分辨率缩放比例。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>当前的模拟速度。高于或低于 100% 的值表示模拟正在运行得比实际 Switch 更快或更慢。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>游戏当前运行的帧率。这将因游戏和场景的不同而有所变化。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>在不计算速度限制和垂直同步的情况下,模拟一个 Switch 帧的实际时间。若要进行全速模拟,这个数值不应超过 16.67 毫秒。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>检测到无效配置</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>掌机手柄无法在主机模式中使用。将会选择 Pro controller。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>主机模式</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>清除最近文件 (&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation>TAS 录制</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>继续 (&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation>覆盖玩家 1 的文件?</translation>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation>暂停 (&amp;P)</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3783,660 +3850,727 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>发生了未知错误。请查看日志了解详情。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
<translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
<translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>开始</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>保存数据</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>Mod 数据</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>打开 %1 文件夹时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>文件夹不存在!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>打开可转移着色器缓存时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
<translation>为该游戏创建着色器缓存目录时失败。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>目录</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>游戏更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>删除项目</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>删除已安装的游戏 %1 ?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>删除成功</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>成功删除已安装的游戏。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>删除 %1 时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>该游戏未安装于 NAND 中,无法删除。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>成功删除已安装的游戏更新。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>这个游戏没有任何已安装的更新。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>这个游戏没有任何已安装的 DLC 。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>成功删除游戏 %1 安装的 DLC 。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
<translation>删除 OpenGL 模式的着色器缓存?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
<translation>删除 Vulkan 模式的着色器缓存?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
<translation>删除所有的着色器缓存?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>移除自定义游戏设置?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>删除文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>删除着色器缓存时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>这个游戏的着色器缓存不存在。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>成功删除着色器缓存。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>删除着色器缓存失败。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
<translation>删除着色器缓存时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
<translation>着色器缓存删除成功。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
<translation>删除着色器缓存目录失败。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>移除自定义游戏设置时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>这个游戏的自定义设置不存在。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>成功移除自定义游戏设置。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>移除自定义游戏设置失败。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS 提取失败!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>复制 RomFS 文件时出错,或用户取消了操作。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>完整</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>框架</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>选择 RomFS 转储模式</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>请选择希望 RomFS 转储的方式。&lt;br&gt;“Full” 会将所有文件复制到新目录中,而&lt;br&gt;“Skeleton” 只会创建目录结构。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
<translation>%1 没有足够的空间用于提取 RomFS。请保持足够的空间或于模拟—&gt;设置—&gt;系统—&gt;文件系统—&gt;转储根目录中选择一个其他目录。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>正在提取 RomFS...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS 提取成功!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>操作成功完成。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>打开 %1 时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>选择目录</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>属性</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>无法加载该游戏的属性信息。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch 可执行文件 (%1);;所有文件 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>加载文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>打开提取的 ROM 目录</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>选择的目录无效</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>选择的目录不包含 “main” 文件。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>可安装的 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂应用包 (*.nsp);;NX 卡带镜像 (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>安装文件</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>剩余 %n 个文件</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>正在安装文件 &quot;%1&quot;...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>安装结果</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>为了避免可能存在的冲突,我们不建议将游戏本体安装到 NAND 中。
此功能仅用于安装游戏更新和 DLC 。</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>最近安装了 %n 个文件
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n 个文件被覆盖
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n 个文件安装失败
</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>系统应用</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>系统档案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>系统应用更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>固件包 (A型)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>固件包 (B型)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>游戏</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>游戏更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>游戏 DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>差量程序</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>选择 NCA 安装类型...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>请选择此 NCA 的程序类型:
(在大多数情况下,选择默认的“游戏”即可。)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>安装失败</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>选择的 NCA 程序类型无效。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>找不到文件</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>文件 &quot;%1&quot; 未找到</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>继续 (&amp;C)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>确定</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>未设置 yuzu 账户</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>要提交游戏兼容性测试用例,您必须设置您的 yuzu 帐户。&lt;br&gt;&lt;br/&gt;要设置您的 yuzu 帐户,请转到模拟 &amp;gt; 设置 &amp;gt; 网络。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>打开 URL 时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>无法打开 URL : &quot;%1&quot; 。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>TAS 录制</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>覆盖玩家 1 的文件?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo 文件 (%1);; 全部文件 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
<translation>加载 Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>打开 Amiibo 数据文件时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>无法打开 Amiibo 文件 %1。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>读取 Amiibo 数据文件时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>无法完全读取 Amiibo 数据。应读取 %1 个字节,但实际仅能读取 %2 个字节。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>加载 Amiibo 数据时出错</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>无法加载 Amiibo 数据。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>捕获截图</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG 图像 (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
<translation>TAS 状态:正在运行 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
<translation>TAS 状态:正在录制 %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
<translation>TAS 状态:空闲 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
<translation>TAS 状态:无效</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation>停止运行 (&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation>开始 (&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation>停止录制 (&amp;E)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
+ <translation>录制 (&amp;E)</translation>
+ </message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
<translation><numerusform>正在编译 %n 个着色器文件</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>缩放比例: %1x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>速度: %1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>速度: %1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
<translation>游戏: %1 FPS (未锁定)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>FPS: %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>帧延迟:%1 毫秒</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
<translation>GPU NORMAL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
<translation>GPU HIGH</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
<translation>GPU EXTREME</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
<translation>GPU ERROR</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation>邻近取样</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation>双线性过滤</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
+ <translation>双三线过滤</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation>高斯模糊</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation>强制缩放</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation>FSR</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>抗锯齿关</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>您正尝试启动的游戏需要从 Switch 转储的其他文件。&lt;br/&gt;&lt;br/&gt;有关转储这些文件的更多信息,请参阅以下 wiki 页面:&lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;您要退出并返回至游戏列表吗?继续模拟可能会导致崩溃,存档损坏或其他错误。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>Yuzu 找不到 Switch 系统档案 %1 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>Yuzu 找不到 Switch 系统档案: %1, %2 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>未找到系统档案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>系统档案缺失</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>Yuzu 找不到 Swtich 共享字体 %1 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>未找到共享字体</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>共享字体文件缺失</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>致命错误</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu 遇到了致命错误,请查看日志了解详情。有关查找日志的更多信息,请参阅以下页面:&lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;您要退出并返回至游戏列表吗?继续模拟可能会导致崩溃,存档损坏或其他错误。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>发生致命错误</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>确认重新生成密钥</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4452,37 +4586,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
这将删除您自动生成的密钥文件并重新运行密钥生成模块。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>项目丢失</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- 丢失 BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - 丢失 BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- 丢失 PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>组件丢失</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>缺少组件可能会影响游戏的正常运行。&lt;br&gt;请查看&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu 快速导航&lt;/a&gt;以获得你的密钥和游戏。&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>密钥缺失。&lt;br&gt;请查看&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu 快速导航&lt;/a&gt;以获得你的密钥、固件和游戏。&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4491,39 +4625,39 @@ on your system&apos;s performance.</source>
您的系统性能。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>生成密钥</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>选择 RomFS 转储目标</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>请选择希望转储的 RomFS。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>您确定要关闭 yuzu 吗?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>您确定要停止模拟吗?未保存的进度将会丢失。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4535,38 +4669,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>OpenGL 模式不可用!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu 没有使用 OpenGL 进行编译。</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>初始化 OpenGL 时出错!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>您的 GPU 可能不支持 OpenGL ,或者您没有安装最新的显卡驱动。</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>初始化 OpenGL 4.6 时出错!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>您的 GPU 可能不支持 OpenGL 4.6 ,或者您没有安装最新的显卡驱动。&lt;br&gt;&lt;br&gt;GL 渲染器:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>您的 GPU 可能不支持某些必需的 OpenGL 扩展。请确保您已经安装最新的显卡驱动。&lt;br&gt;&lt;br&gt;GL 渲染器:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;不支持的扩展:&lt;br&gt;%2</translation>
</message>
@@ -4923,190 +5057,205 @@ Screen.</source>
<translation>模拟 (&amp;E)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>视图 (&amp;V)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>重置窗口大小 (&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>调试 (&amp;D)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>重置窗口大小为720p (&amp;7)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>重置窗口大小为720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>重置窗口大小为900p (&amp;9)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>重置窗口大小为900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>重置窗口大小为1080p (&amp;1)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>重置窗口大小为1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>调试 (&amp;D)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>工具 (&amp;T)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation>TAS (&amp;T)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>帮助 (&amp;H)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>安装文件到 NAND... (&amp;I)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
<translation>加载文件... (&amp;O)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>加载文件夹... (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>退出 (&amp;X)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>开始 (&amp;S)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>暂停 (&amp;P)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>停止 (&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>重新生成密钥... (&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>关于 yuzu (&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
<translation>单窗口模式 (&amp;W)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>设置... (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
<translation>显示停靠小部件的标题 (&amp;O)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>显示搜索栏 (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>显示状态栏 (&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>显示状态栏</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>全屏 (&amp;U)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>重新启动 (&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
<translation>加载 Amiibo... (&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>报告兼容性 (&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
<translation>打开 Mod 页面 (&amp;M)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>查看快速导航 (&amp;Q)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>FAQ (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>打开 yuzu 文件夹 (&amp;Y)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>捕获截图 (&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
- <translation>配置 TAS… (&amp;T)</translation>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
+ <translation>配置 TAS... (&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
<translation>配置当前游戏... (&amp;U)</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>开始 (&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation>重置 (&amp;R)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation>录制 (&amp;E)</translation>
+ </message>
</context>
<context>
<name>MicroProfileDialog</name>
@@ -5152,10 +5301,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>开始/暂停</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation>充电中</translation>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5186,142 +5340,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[未设置]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>方向键 %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>轴 %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>按键 %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[未知]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation>左</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation>右</translation>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>点击 0</translation>
+ <source>Down</source>
+ <translation>下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>点击 1</translation>
+ <source>Up</source>
+ <translation>上</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>点击 2</translation>
+ <source>Z</source>
+ <translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>点击 3</translation>
+ <source>R</source>
+ <translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>点击 4</translation>
+ <source>L</source>
+ <translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC 轴 %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC 按键 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
- <translation>TAS 轴 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation>开始</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
+ <translation>L1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
+ <translation>L2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation>L3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation>R1</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation>R2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
- <translation>TAS 按钮 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation>R3</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>体感 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation>○</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1按钮 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation>╳</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL 体感</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation>□</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1点击 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation>Δ</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation>分享</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation>选项</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation>[未指定]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation>[无效]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation>%1%2Hat 控制器 %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation>%1%2轴 %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation>%1%2轴 %3,%4,%5</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation>%1%2体感 %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation>%1%2按键 %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[未使用]</translation>
</message>
@@ -5362,7 +5596,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro Controller</translation>
</message>
@@ -5375,7 +5609,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>双 Joycons 手柄</translation>
</message>
@@ -5388,7 +5622,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>左 Joycon 手柄</translation>
</message>
@@ -5401,7 +5635,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>右 Joycon 手柄</translation>
</message>
@@ -5429,7 +5663,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>掌机模式</translation>
</message>
@@ -5550,7 +5784,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>GameCube 控制器</translation>
</message>
@@ -5644,13 +5878,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>确定</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts
index f7ddf1843..bcb12064b 100644
--- a/dist/languages/zh_TW.ts
+++ b/dist/languages/zh_TW.ts
@@ -36,7 +36,7 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;yuzu是一個實驗性的開源Nintendo Switch模擬器,使用GPLv2.0+授權。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;本軟體不得用於執行非法取得的遊戲。&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:12pt;&quot;&gt;此軟體不得用於執行非法取得的遊戲。&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/aboutdialog.ui" line="118"/>
@@ -321,12 +321,14 @@ p, li { white-space: pre-wrap; }
<source>
&lt;div&gt;This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+&lt;div&gt;此選項使用不精確的四捨五入,能提高 32 位元 ASIMD 浮點數函式的速度。&lt;/div&gt;
+</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="125"/>
<source>Faster ASIMD instructions (32 bits only)</source>
- <translation type="unfinished"/>
+ <translation>快速 ASIMD 指令(僅限 32 位元)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="132"/>
@@ -347,17 +349,19 @@ p, li { white-space: pre-wrap; }
<source>
&lt;div&gt;This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+ &lt;div&gt;此選項不執行每次模擬記憶體讀寫前的安全檢查以提高速度。停用此選項可能會允許遊戲讀寫模擬器記憶體。&lt;/div&gt;
+ </translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="149"/>
<source>Disable address space checks</source>
- <translation type="unfinished"/>
+ <translation>停用位址空間檢查</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu.ui" line="174"/>
<source>CPU settings are available only when game is not running.</source>
- <translation>僅當遊戲未執行時才可修改 CPU 設定</translation>
+ <translation>僅在遊戲未執行時才能調整 CPU 設定</translation>
</message>
</context>
<context>
@@ -380,7 +384,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="31"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;For debugging only.&lt;/span&gt;&lt;br/&gt;If you&apos;re not sure what these do, keep all of these enabled. &lt;br/&gt;These settings, when disabled, only take effect when CPU Debugging is enabled. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;僅供偵錯。&lt;/span&gt;&lt;br/&gt;如果您不確定這些選項的功能,請保持它們的啟用狀態。&lt;br/&gt;這些選項僅在啟用 CPU 偵錯模式時生效。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="41"/>
@@ -506,17 +510,21 @@ p, li { white-space: pre-wrap; }
&lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.&lt;/div&gt;
&lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
</source>
- <translation type="unfinished"/>
+ <translation>
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;This optimization speeds up memory accesses by the guest program.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host&apos;s MMU.&lt;/div&gt;
+ &lt;div style=&quot;white-space: nowrap&quot;&gt;Disabling this forces all memory accesses to use Software MMU Emulation.&lt;/div&gt;
+ </translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="147"/>
<source>Enable Host MMU Emulation</source>
- <translation type="unfinished"/>
+ <translation>Enable Host MMU Emulation</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_cpu_debug.ui" line="172"/>
<source>CPU settings are available only when game is not running.</source>
- <translation>僅當遊戲未執行時才可調整 CPU 設定</translation>
+ <translation>僅在遊戲未執行時才能調整 CPU 設定</translation>
</message>
</context>
<context>
@@ -549,7 +557,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="49"/>
<source>Enable Extended Logging**</source>
- <translation>啟用紀錄擴充**</translation>
+ <translation>啟用延伸紀錄**</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="59"/>
@@ -569,7 +577,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="91"/>
<source>When checked, the graphics API enters a slower debugging mode</source>
- <translation>啟用時圖形 API 會進入較慢的偵錯模式</translation>
+ <translation>啟用時圖形 API 會進入較慢的偵錯模式。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="94"/>
@@ -579,17 +587,17 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="101"/>
<source>When checked, it enables Nsight Aftermath crash dumps</source>
- <translation type="unfinished"/>
+ <translation>啟用時 yuzu 將會儲存 Nsight Aftermath 格式的錯誤傾印檔案。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="104"/>
<source>Enable Nsight Aftermath</source>
- <translation type="unfinished"/>
+ <translation>啟用 Nsight Aftermath</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="114"/>
<source>When checked, it disables the macro Just In Time compiler. Enabling this makes games run slower</source>
- <translation>啟用後將停用批次 Just In Time 編譯器,會使得效能降低。</translation>
+ <translation>啟用時將停用 Macro Just In Time 編譯器,會使得效能降低。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="117"/>
@@ -599,7 +607,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="124"/>
<source>When checked, yuzu will log statistics about the compiled pipeline cache</source>
- <translation type="unfinished"/>
+ <translation>啟用時 yuzu 將記錄有關編譯著色器快取的統計資訊。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="127"/>
@@ -609,12 +617,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="134"/>
<source>When checked, it executes shaders without loop logic changes</source>
- <translation type="unfinished"/>
+ <translation>啟用時 yuzu 在執行著色器時,不會修改循環結構的條件判斷。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="137"/>
<source>Disable Loop safety checks</source>
- <translation type="unfinished"/>
+ <translation>停用循環安全檢查</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="147"/>
@@ -624,12 +632,12 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="153"/>
<source>Enable FS Access Log</source>
- <translation type="unfinished"/>
+ <translation>啟用檔案系統存取記錄</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="160"/>
<source>Enable Verbose Reporting Services**</source>
- <translation type="unfinished"/>
+ <translation>啟用詳細報告服務</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="170"/>
@@ -654,10 +662,15 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug.ui" line="197"/>
<source>Enable Auto-Stub**</source>
- <translation type="unfinished"/>
+ <translation>啟用自動偵錯**</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_debug.ui" line="212"/>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="204"/>
+ <source>Enable all Controller Types</source>
+ <translation>啟用所有控制器類型</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_debug.ui" line="219"/>
<source>**This will be reset automatically when yuzu closes.</source>
<translation>**當 yuzu 關閉時會自動重設。</translation>
</message>
@@ -685,7 +698,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_debug_tab.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished"/>
+ <translation>Form</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_debug_tab.ui" line="17"/>
@@ -842,7 +855,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="124"/>
<source>Patch Manager</source>
- <translation>擴充功能管理</translation>
+ <translation>延伸模組管理</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_filesystem.ui" line="152"/>
@@ -937,67 +950,78 @@ p, li { white-space: pre-wrap; }
<translation>一般</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="35"/>
- <source>Framerate Cap</source>
- <translation>畫面速率限制</translation>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="50"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="57"/>
+ <source>Use global framerate cap</source>
+ <translation>使用全域畫面速率限制</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="62"/>
+ <source>Set framerate cap:</source>
+ <translation>設定畫面速率限制:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="38"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="70"/>
<source>Requires the use of the FPS Limiter Toggle hotkey to take effect.</source>
- <translation type="unfinished"/>
+ <translation>需要使用 FPS 限制器的快速鍵才能切換執行速度。</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="73"/>
+ <source>Framerate Cap</source>
+ <translation>畫面速率限制</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="45"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="95"/>
<source>x</source>
<translation>x</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="116"/>
<source>Limit Speed Percent</source>
<translation>執行速度限制</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="123"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="90"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="141"/>
<source>Multicore CPU Emulation</source>
<translation>多核心 CPU 模擬</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="97"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="148"/>
<source>Confirm exit while emulation is running</source>
<translation>退出遊戲時需要確認</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="104"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="155"/>
<source>Prompt for user on game boot</source>
<translation>啟動遊戲時提示選擇使用者</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="111"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="162"/>
<source>Pause emulation when in background</source>
<translation>模擬器在背景執行時暫停</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="118"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="169"/>
<source>Hide mouse on inactivity</source>
<translation>滑鼠閒置時自動隱藏</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.ui" line="160"/>
+ <location filename="../../src/yuzu/configuration/configure_general.ui" line="211"/>
<source>Reset All Settings</source>
<translation>重設所有設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="70"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="78"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_general.cpp" line="71"/>
+ <location filename="../../src/yuzu/configuration/configure_general.cpp" line="79"/>
<source>This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed?</source>
<translation>這將重設所有遊戲的額外設定,但不會刪除遊戲資料夾、使用者設定檔、輸入設定檔,是否繼續?</translation>
</message>
@@ -1042,7 +1066,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="162"/>
<source>Use disk pipeline cache</source>
- <translation>使用硬碟流水線快取</translation>
+ <translation>使用硬碟管線快取</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics.ui" line="169"/>
@@ -1115,18 +1139,113 @@ p, li { white-space: pre-wrap; }
<translation>延伸視窗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="339"/>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="330"/>
+ <source>Resolution:</source>
+ <translation>解析度:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="338"/>
+ <source>0.5X (360p/540p) [EXPERIMENTAL]</source>
+ <translation>0.5X (360p/540p) [實驗性]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="343"/>
+ <source>0.75X (540p/810p) [EXPERIMENTAL]</source>
+ <translation>0.75X (540p/810p) [實驗性]</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="348"/>
+ <source>1X (720p/1080p)</source>
+ <translation>1X (720p/1080p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="353"/>
+ <source>2X (1440p/2160p)</source>
+ <translation>2X (1440p/2160p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="358"/>
+ <source>3X (2160p/3240p)</source>
+ <translation>3X (2160p/3240p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="363"/>
+ <source>4X (2880p/4320p)</source>
+ <translation>4X (2880p/4320p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="368"/>
+ <source>5X (3600p/5400p)</source>
+ <translation>5X (3600p/5400p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="373"/>
+ <source>6X (4320p/6480p)</source>
+ <translation>6X (4320p/6480p)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="399"/>
+ <source>Window Adapting Filter:</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="407"/>
+ <source>Nearest Neighbor</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="412"/>
+ <source>Bilinear</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="417"/>
+ <source>Bicubic</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="422"/>
+ <source>Gaussian</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="427"/>
+ <source>ScaleForce</source>
+ <translation>強制縮放</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="432"/>
+ <source>AMD FidelityFX™️ Super Resolution [Vulkan Only]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="458"/>
+ <source>Anti-Aliasing Method:</source>
+ <translation>抗鋸齒方式:</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="466"/>
+ <source>None</source>
+ <translation>無</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="471"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="506"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="516"/>
<source>Use global background color</source>
<translation>使用全域背景顏色</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="354"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="521"/>
<source>Set background color:</source>
<translation>設定背景顏色:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="362"/>
+ <location filename="../../src/yuzu/configuration/configure_graphics.ui" line="529"/>
<source>Background Color:</source>
<translation>背景顏色:</translation>
</message>
@@ -1181,7 +1300,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="95"/>
<source>Enables Fast GPU Time. This option will force most games to run at their highest native resolution.</source>
- <translation type="unfinished"/>
+ <translation>啟用快速 GPU 時間。此選項將強制大多數遊戲以其最高解析度執行。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="98"/>
@@ -1195,28 +1314,33 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="128"/>
- <source>Default</source>
- <translation>預設</translation>
+ <source>Automatic</source>
+ <translation>自動</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="133"/>
- <source>2x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>Default</source>
+ <translation>預設</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="138"/>
- <source>4x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>2x</source>
+ <translation>2x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="143"/>
- <source>8x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>4x</source>
+ <translation>4x</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="148"/>
- <source>16x (WILL BREAK THINGS)</source>
- <translation type="unfinished"/>
+ <source>8x</source>
+ <translation>8x</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_graphics_advanced.ui" line="153"/>
+ <source>16x</source>
+ <translation>16x</translation>
</message>
</context>
<context>
@@ -1468,7 +1592,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="1955"/>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2241"/>
<source>L Body</source>
- <translation>左側主體</translation>
+ <translation>左側搖桿</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="219"/>
@@ -1492,7 +1616,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2086"/>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2372"/>
<source>R Body</source>
- <translation>右側主體</translation>
+ <translation>右側搖桿</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="350"/>
@@ -1543,8 +1667,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2533"/>
- <source>Other</source>
- <translation>其他</translation>
+ <source>Emulated Devices</source>
+ <translation>模擬設備</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2545"/>
@@ -1553,499 +1677,524 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2558"/>
- <source>Emulate Analog with Keyboard Input</source>
- <translation>使用鍵盤模擬搖桿</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2571"/>
- <source>Enable mouse panning</source>
- <translation>啟用滑鼠平移</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2578"/>
- <source>Mouse sensitivity</source>
- <translation>滑鼠靈敏度</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2584"/>
- <source>%</source>
- <translation>%</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2600"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2623"/>
- <source>Advanced</source>
- <translation>進階</translation>
+ <source>Mouse</source>
+ <translation>滑鼠</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2630"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2565"/>
<source>Touchscreen</source>
<translation>觸控螢幕</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2643"/>
- <source>Mouse</source>
- <translation>滑鼠</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2588"/>
+ <source>Advanced</source>
+ <translation>進階</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2650"/>
- <source>Motion / Touch</source>
- <translation>體感/觸控</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2595"/>
+ <source>Debug Controller</source>
+ <translation>控制器偵錯</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2657"/>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2602"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2702"/>
<source>Configure</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2664"/>
- <source>Debug Controller</source>
- <translation>控制器偵錯</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2612"/>
+ <source>Other</source>
+ <translation>其他</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2678"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2624"/>
+ <source>Emulate Analog with Keyboard Input</source>
+ <translation>使用鍵盤模擬搖桿</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2631"/>
<source>Requires restarting yuzu</source>
<translation>需要重新啟動 yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2687"/>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2640"/>
<source>Enable XInput 8 player support (disables web applet)</source>
<translation>啟用 XInput 8 輸入支援(停用 web applet)</translation>
</message>
-</context>
-<context>
- <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
- <source>Configure Input</source>
- <translation>輸入設定</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2653"/>
+ <source>Enable UDP controllers (not needed for motion)</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
- <source>Connect Controller</source>
- <translation>控制器連線</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2666"/>
+ <source>Enable mouse panning</source>
+ <translation>啟用滑鼠平移</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="94"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="535"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="986"/>
- <source>Pro Controller</source>
- <translation>Pro 手把</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2673"/>
+ <source>Mouse sensitivity</source>
+ <translation>滑鼠靈敏度</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="99"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="992"/>
- <source>Dual Joycons</source>
- <translation>雙 Joycon 手把</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2679"/>
+ <source>%</source>
+ <translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="104"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="998"/>
- <source>Left Joycon</source>
- <translation>左 Joycon 手把</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_advanced.ui" line="2695"/>
+ <source>Motion / Touch</source>
+ <translation>體感/觸控</translation>
</message>
+</context>
+<context>
+ <name>ConfigureInputPlayer</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="109"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1004"/>
- <source>Right Joycon</source>
- <translation>右 Joycon 手把</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="14"/>
+ <source>Configure Input</source>
+ <translation>輸入設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="114"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1010"/>
- <source>Handheld</source>
- <translation>掌機模式</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="63"/>
+ <source>Connect Controller</source>
+ <translation>控制器連線</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="125"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="100"/>
<source>Input Device</source>
<translation>輸入裝置:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="153"/>
- <source>Any</source>
- <translation>任意</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="158"/>
- <source>Keyboard/Mouse</source>
- <translation>鍵盤/滑鼠</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="194"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="156"/>
<source>Profile</source>
<translation>設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="234"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="196"/>
<source>Save</source>
<translation>儲存</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="212"/>
<source>New</source>
<translation>新增</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="266"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="228"/>
<source>Delete</source>
<translation>刪除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="329"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1267"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="291"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1190"/>
<source>Left Stick</source>
<translation>左搖桿</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="387"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="429"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="963"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1002"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2621"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2660"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="391"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="925"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="964"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2583"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2622"/>
<source>Up</source>
<translation>上</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="460"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="499"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1033"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1072"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2107"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2691"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2730"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="422"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="995"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1034"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2069"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2653"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2692"/>
<source>Left</source>
<translation>左</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="509"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="548"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1082"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1121"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2156"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2740"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2779"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="510"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1044"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1083"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2118"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2702"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2741"/>
<source>Right</source>
<translation>右</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="591"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="630"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1164"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1203"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2822"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2861"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="553"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="592"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1126"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1165"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2784"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2823"/>
<source>Down</source>
<translation>下</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="661"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="700"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2892"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2931"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="623"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="662"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2854"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2893"/>
<source>Pressed</source>
- <translation>按下</translation>
+ <translation>按壓</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="710"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="749"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2941"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2980"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="672"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="711"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2903"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2942"/>
<source>Modifier</source>
<translation>輕推</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="759"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2990"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="721"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2952"/>
<source>Range</source>
<translation>靈敏度</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="792"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3023"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="754"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2985"/>
<source>%</source>
<translation>%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="835"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3063"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="797"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3025"/>
<source>Deadzone: 0%</source>
<translation>無感帶:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="859"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3087"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="821"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="3049"/>
<source>Modifier Range: 0%</source>
<translation>輕推靈敏度:0%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="905"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="867"/>
<source>D-Pad</source>
<translation>十字鍵</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1289"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1328"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1272"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1251"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1290"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1195"/>
<source>L</source>
<translation>L</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1344"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1383"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1264"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1306"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1345"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1187"/>
<source>ZL</source>
<translation>ZL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1464"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1503"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1426"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1465"/>
<source>Minus</source>
<translation>-</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1513"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1552"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1475"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1514"/>
<source>Capture</source>
<translation>截圖</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1583"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1622"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1263"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1545"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1584"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1186"/>
<source>Plus</source>
<translation>+</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1632"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1671"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1594"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1633"/>
<source>Home</source>
<translation>HOME</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1736"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1775"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1273"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1698"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1737"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1189"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1196"/>
<source>R</source>
<translation>R</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1791"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1830"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1265"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1753"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1792"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1188"/>
<source>ZR</source>
<translation>ZR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1911"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1950"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1873"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1912"/>
<source>SL</source>
<translation>SL</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1960"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1999"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1922"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="1961"/>
<source>SR</source>
<translation>SR</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2068"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2030"/>
<source>Motion 1</source>
<translation>體感 1</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2117"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2079"/>
<source>Motion 2</source>
<translation>體感 2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2208"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2170"/>
<source>Face Buttons</source>
<translation>主要按鍵</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2266"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2305"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2228"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2267"/>
<source>X</source>
<translation>X</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2336"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2375"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2298"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2337"/>
<source>Y</source>
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2385"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2424"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2347"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2386"/>
<source>A</source>
<translation>A</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2467"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2506"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2429"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2468"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2554"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1268"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.ui" line="2516"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1191"/>
<source>Right Stick</source>
<translation>右搖桿</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="322"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="372"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="430"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="474"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="330"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="396"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="461"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="507"/>
<source>Clear</source>
<translation>清除</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="324"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="374"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="432"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="476"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="332"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="398"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="463"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="509"/>
<source>[not set]</source>
<translation>[未設定]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="327"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="512"/>
<source>Toggle button</source>
<translation>切換按鍵</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="335"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="341"/>
+ <source>Invert button</source>
+ <translation>無效按鈕</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="349"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="465"/>
+ <source>Invert axis</source>
+ <translation>方向反轉</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="355"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Set threshold</source>
<translation>設定閾值</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="339"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="359"/>
<source>Choose a value between 0% and 100%</source>
<translation>選擇介於 0% 和 100% 之間的值</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="406"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="436"/>
<source>Map Analog Stick</source>
<translation>搖桿映射</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="407"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="437"/>
<source>After pressing OK, first move your joystick horizontally, and then vertically.
To invert the axes, first move your joystick vertically, and then horizontally.</source>
<translation>按下確定後,先水平再上下移動您的搖桿。
要反轉方向,則先上下再水平移動您的搖桿。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="434"/>
- <source>Invert axis</source>
- <translation>方向反轉</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="500"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="952"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="537"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="891"/>
<source>Deadzone: %1%</source>
<translation>無感帶:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="508"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="963"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="546"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="896"/>
<source>Modifier Range: %1%</source>
<translation>輕推靈敏度:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1016"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="572"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="918"/>
+ <source>Pro Controller</source>
+ <translation>Pro 手把</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="924"/>
+ <source>Dual Joycons</source>
+ <translation>雙 Joycon 手把</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="930"/>
+ <source>Left Joycon</source>
+ <translation>左 Joycon 手把</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="936"/>
+ <source>Right Joycon</source>
+ <translation>右 Joycon 手把</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="942"/>
+ <source>Handheld</source>
+ <translation>掌機模式</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="948"/>
<source>GameCube Controller</source>
<translation>GameCube 手把</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1271"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="958"/>
+ <source>Poke Ball Plus</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="964"/>
+ <source>NES Controller</source>
+ <translation>NES 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="970"/>
+ <source>SNES Controller</source>
+ <translation>SNES 控制器</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="976"/>
+ <source>N64 Controller</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="982"/>
+ <source>Sega Genesis</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1194"/>
<source>Start / Pause</source>
<translation>開始 / 暫停</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1274"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1197"/>
<source>Z</source>
<translation>Z</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1275"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1198"/>
<source>Control Stick</source>
<translation>控制搖桿</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1276"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1199"/>
<source>C-Stick</source>
<translation>C 搖桿</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1335"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1297"/>
<source>Shake!</source>
<translation>搖動!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1337"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1299"/>
<source>[waiting]</source>
<translation>[等待中]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>New Profile</source>
<translation>新增設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1381"/>
<source>Enter a profile name:</source>
<translation>輸入設定檔名稱:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1470"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1478"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1389"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1397"/>
<source>Create Input Profile</source>
<translation>建立輸入設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1471"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1390"/>
<source>The given profile name is not valid!</source>
<translation>輸入的設定檔名稱無效!</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1479"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1398"/>
<source>Failed to create the input profile &quot;%1&quot;</source>
<translation>建立輸入設定檔「%1」失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1499"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1418"/>
<source>Delete Input Profile</source>
<translation>刪除輸入設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1500"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1419"/>
<source>Failed to delete the input profile &quot;%1&quot;</source>
<translation>刪除輸入設定檔「%1」失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1522"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1441"/>
<source>Load Input Profile</source>
<translation>載入輸入設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1523"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1442"/>
<source>Failed to load the input profile &quot;%1&quot;</source>
<translation>載入輸入設定檔「%1」失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1542"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1461"/>
<source>Save Input Profile</source>
<translation>儲存輸入設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1543"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="1462"/>
<source>Failed to save the input profile &quot;%1&quot;</source>
<translation>儲存輸入設定檔「%1」失敗</translation>
</message>
@@ -2071,85 +2220,75 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<context>
<name>ConfigureMotionTouch</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="14"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="6"/>
<source>Configure Motion / Touch</source>
<translation>體感/觸控設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
- <source>Mouse Motion</source>
- <translation>滑鼠體感</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="31"/>
- <source>Sensitivity:</source>
- <translation>靈敏度:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="65"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="15"/>
<source>Touch</source>
<translation>觸控</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="23"/>
<source>UDP Calibration:</source>
<translation>UDP 校正:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="80"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="30"/>
<source>(100, 50) - (1800, 850)</source>
<translation>(100, 50) - (1800, 850)</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="96"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="129"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="250"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="46"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="73"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="245"/>
<source>Configure</source>
<translation>設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="113"/>
- <source>Use button mapping:</source>
- <translation>使用按鍵映射:</translation>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="57"/>
+ <source>Touch from button profile:</source>
+ <translation>觸控螢幕配置:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="141"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="85"/>
<source>CemuhookUDP Config</source>
<translation>CemuhookUDP 設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="147"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="91"/>
<source>You may use any Cemuhook compatible UDP input source to provide motion and touch input.</source>
<translation>您可使用與 Cemuhook 相容的 UDP 輸入裝置以使用體感和觸控功能。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="134"/>
<source>Server:</source>
<translation>伺服器:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="161"/>
<source>Port:</source>
<translation>連線埠:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="244"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="188"/>
<source>Learn More</source>
<translation>了解更多</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="257"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="273"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
<source>Test</source>
<translation>測試</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="270"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="214"/>
<source>Add Server</source>
<translation>新增伺服器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="303"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.ui" line="247"/>
<source>Remove Server</source>
<translation>移除伺服器</translation>
</message>
@@ -2159,151 +2298,87 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<translation>&lt;a href=&apos;https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;了解更多&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="171"/>
<source>%1:%2</source>
<translation>%1:%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="295"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="290"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="176"/>
<source>Port number has invalid characters</source>
<translation>連線埠中包含無效字元</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="185"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="180"/>
<source>Port has to be in range 0 and 65353</source>
<translation>連線埠必須為 0 到 65353 之間</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="189"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="184"/>
<source>IP address is not valid</source>
<translation>無效的 IP 位址</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="195"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="190"/>
<source>This UDP server already exists</source>
<translation>此 UDP 伺服器已存在</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="201"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="196"/>
<source>Unable to add more than 8 servers</source>
<translation>最多只能新增 8 個伺服器</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="217"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="212"/>
<source>Testing</source>
<translation>測試中</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="228"/>
<source>Configuring</source>
<translation>設定中</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="264"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="259"/>
<source>Test Successful</source>
<translation>測試成功</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="265"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="260"/>
<source>Successfully received data from the server.</source>
<translation>已成功從伺服器取得資料</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="267"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="262"/>
<source>Test Failed</source>
<translation>測試失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="268"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="263"/>
<source>Could not receive valid data from the server.&lt;br&gt;Please verify that the server is set up correctly and the address and port are correct.</source>
<translation>無法從伺服器取得有效的資料。&lt;br&gt;請檢查伺服器是否正確設定以及位址和連接埠是否正確。</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="296"/>
+ <location filename="../../src/yuzu/configuration/configure_motion_touch.cpp" line="291"/>
<source>UDP Test or calibration configuration is in progress.&lt;br&gt;Please wait for them to finish.</source>
<translation>UDP 測試或觸控校正進行中。&lt;br&gt;請耐心等候。</translation>
</message>
</context>
<context>
- <name>ConfigureMouseAdvanced</name>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="14"/>
- <source>Configure Mouse</source>
- <translation>滑鼠設定</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="25"/>
- <source>Mouse Buttons</source>
- <translation>滑鼠按鍵</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="35"/>
- <source>Forward:</source>
- <translation>下一頁:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="75"/>
- <source>Back:</source>
- <translation>上一頁:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="103"/>
- <source>Left:</source>
- <translation>左鍵:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="131"/>
- <source>Middle:</source>
- <translation>中鍵:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="197"/>
- <source>Right:</source>
- <translation>右鍵:</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="270"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="109"/>
- <source>Clear</source>
- <translation>清除</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.ui" line="289"/>
- <source>Defaults</source>
- <translation>預設</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="111"/>
- <source>[not set]</source>
- <translation>[未設定]</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="113"/>
- <source>Restore Default</source>
- <translation>還原預設值</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="200"/>
- <source>[press key]</source>
- <translation>[按下按鍵]</translation>
- </message>
-</context>
-<context>
<name>ConfigureNetwork</name>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished"/>
+ <translation>Form</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="17"/>
@@ -2318,7 +2393,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_network.ui" line="34"/>
<source>Network Interface</source>
- <translation>網路介面</translation>
+ <translation>網路卡</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_network.cpp" line="17"/>
@@ -2376,7 +2451,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="64"/>
<source>Add-Ons</source>
- <translation>擴充功能</translation>
+ <translation>延伸模組</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="65"/>
@@ -2401,7 +2476,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="69"/>
<source>Adv. Graphics</source>
- <translation type="unfinished"/>
+ <translation>進階圖形</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game.cpp" line="70"/>
@@ -2429,12 +2504,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.ui" line="17"/>
<source>Add-Ons</source>
- <translation>擴充功能</translation>
+ <translation>延伸模組</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="48"/>
<source>Patch Name</source>
- <translation>擴充功能名稱</translation>
+ <translation>延伸模組名稱</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_per_game_addons.cpp" line="49"/>
@@ -2472,7 +2547,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="110"/>
<source>Set Image</source>
- <translation>設定圖片</translation>
+ <translation>選擇圖片</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="130"/>
@@ -2492,7 +2567,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.ui" line="162"/>
<source>Profile management is available only when game is not running.</source>
- <translation>僅當遊戲未執行時才可修改使用者設定檔</translation>
+ <translation>僅在遊戲未執行時才能修改使用者設定檔</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="55"/>
@@ -2585,12 +2660,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="314"/>
<source>Error resizing user image</source>
- <translation type="unfinished"/>
+ <translation>調整使用者圖片大小時發生錯誤</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_profile_manager.cpp" line="315"/>
<source>Unable to resize image</source>
- <translation type="unfinished"/>
+ <translation>無法調整圖片大小</translation>
</message>
</context>
<context>
@@ -3014,7 +3089,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="464"/>
<source>Sound output mode</source>
- <translation>聲音輸出模式</translation>
+ <translation>聲道</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="478"/>
@@ -3029,7 +3104,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_system.ui" line="540"/>
<source>System settings are available only when game is not running.</source>
- <translation>僅當遊戲未執行時才可調整系統設定</translation>
+ <translation>僅在遊戲未執行時才能修改使用者設定檔</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_system.cpp" line="166"/>
@@ -3057,17 +3132,17 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="17"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reads controller input from scripts in the same format as TAS-nx scripts.&lt;br/&gt;For a more detailed explanation, please consult the &lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;help page&lt;/span&gt;&lt;/a&gt; on the yuzu website.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"/>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;通過讀取與 TAS-nx 腳本具有相同格式的腳本來讀取控制器的輸入。&lt;br/&gt;有關詳細資訊,請參閱 yuzu 官方網站的&lt;a href=&quot;https://yuzu-emu.org/help/feature/tas/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#039be5;&quot;&gt;說明網頁&lt;/span&gt;&lt;/a&gt;。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="24"/>
<source>To check which hotkeys control the playback/recording, please refer to the Hotkey settings (Configure -&gt; General -&gt; Hotkeys).</source>
- <translation type="unfinished"/>
+ <translation>要確認是哪些快速鍵控制播放/錄製,請參閱快速鍵設定。(設定 &gt; 一般 &gt; 快速鍵)</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="34"/>
<source>WARNING: This is an experimental feature.&lt;br/&gt;It will not play back scripts frame perfectly with the current, imperfect syncing method.</source>
- <translation type="unfinished"/>
+ <translation>警告:這是實驗性功能。&lt;br/&gt;由於不完善的同步方式,可能無法完整的重現。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="51"/>
@@ -3077,35 +3152,30 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="57"/>
<source>Enable TAS features</source>
- <translation type="unfinished"/>
+ <translation>啟用 TAS 功能</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_tas.ui" line="64"/>
- <source>Automatic controller profile swapping</source>
- <translation type="unfinished"/>
- </message>
- <message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="71"/>
<source>Loop script</source>
- <translation type="unfinished"/>
+ <translation>循環腳本</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="81"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="74"/>
<source>Pause execution during loads</source>
- <translation type="unfinished"/>
+ <translation>載入畫面時暫停執行</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="95"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="88"/>
<source>Script Directory</source>
- <translation type="unfinished"/>
+ <translation>腳本資料夾</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="94"/>
<source>Path</source>
<translation>路徑</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.ui" line="108"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.ui" line="101"/>
<source>...</source>
<translation>...</translation>
</message>
@@ -3115,12 +3185,12 @@ To invert the axes, first move your joystick vertically, and then horizontally.<
<message>
<location filename="../../src/yuzu/configuration/configure_tas.cpp" line="20"/>
<source>TAS Configuration</source>
- <translation type="unfinished"/>
+ <translation>TAS 設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="53"/>
+ <location filename="../../src/yuzu/configuration/configure_tas.cpp" line="51"/>
<source>Select TAS Load Directory...</source>
- <translation type="unfinished"/>
+ <translation>選擇 TAS 載入資料夾...</translation>
</message>
</context>
<context>
@@ -3180,37 +3250,37 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>Y</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>New Profile</source>
<translation>新增設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="200"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="197"/>
<source>Enter the name for the new profile.</source>
<translation>輸入新設定檔的名稱</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete Profile</source>
<translation>刪除設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="211"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="208"/>
<source>Delete profile %1?</source>
<translation>是否刪除設定檔 %1?</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>Rename Profile</source>
<translation>重新命名設定檔</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="224"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="221"/>
<source>New name:</source>
<translation>新名稱:</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="233"/>
+ <location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="230"/>
<source>[press key]</source>
<translation>[按下按鍵]</translation>
</message>
@@ -3225,7 +3295,7 @@ Drag points to change position, or double-click table cells to edit values.</sou
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="26"/>
<source>Warning: The settings in this page affect the inner workings of yuzu&apos;s emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing.</source>
- <translation>警告:本頁設定會影響 yuzu 模擬觸控螢幕的內部運作。修改設定可能會導致非預期結果,例如觸控螢幕完全或部分失效。若您不知道自己在做甚麼,請不要使用此頁面。</translation>
+ <translation>警告:此處設定會影響 yuzu 模擬觸控螢幕的內部運作。修改設定可能會導致非預期結果,例如觸控螢幕完全或部分失效。請在充分了解的情況下修改此處設定。</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touchscreen_advanced.ui" line="52"/>
@@ -3358,7 +3428,7 @@ Drag points to change position, or double-click table cells to edit values.</sou
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="82"/>
<source>Show Add-Ons Column</source>
- <translation>顯示擴充功能欄位</translation>
+ <translation>顯示延伸模組欄位</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_ui.ui" line="91"/>
@@ -3537,7 +3607,7 @@ Drag points to change position, or double-click table cells to edit values.</sou
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="93"/>
<source>What is my token?</source>
- <translation>我的 Token 是什麼?</translation>
+ <translation>Token 說明</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_web.ui" line="118"/>
@@ -3630,12 +3700,12 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>ControllerDialog</name>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="17"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="21"/>
<source>Controller P1</source>
<translation>Controller P1</translation>
</message>
<message>
- <location filename="../../src/yuzu/debugger/controller.cpp" line="52"/>
+ <location filename="../../src/yuzu/debugger/controller.cpp" line="60"/>
<source>&amp;Controller P1</source>
<translation>&amp;Controller P1</translation>
</message>
@@ -3643,90 +3713,95 @@ Drag points to change position, or double-click table cells to edit values.</sou
<context>
<name>GMainWindow</name>
<message>
- <location filename="../../src/yuzu/main.cpp" line="174"/>
+ <location filename="../../src/yuzu/main.cpp" line="176"/>
<source>&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;Anonymous data is collected&lt;/a&gt; to help improve yuzu. &lt;br/&gt;&lt;br/&gt;Would you like to share your usage data with us?</source>
<translation>我們&lt;a href=&apos;https://yuzu-emu.org/help/feature/telemetry/&apos;&gt;蒐集匿名的資料&lt;/a&gt;以幫助改善 yuzu。&lt;br/&gt;&lt;br/&gt;您願意和我們分享您的使用資料嗎?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="177"/>
+ <location filename="../../src/yuzu/main.cpp" line="179"/>
<source>Telemetry</source>
<translation>遙測</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="592"/>
+ <location filename="../../src/yuzu/main.cpp" line="600"/>
<source>Loading Web Applet...</source>
<translation>載入 Web Applet...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="639"/>
- <location filename="../../src/yuzu/main.cpp" line="642"/>
+ <location filename="../../src/yuzu/main.cpp" line="647"/>
+ <location filename="../../src/yuzu/main.cpp" line="650"/>
<source>Disable Web Applet</source>
<translation>停用 Web Applet</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="643"/>
+ <location filename="../../src/yuzu/main.cpp" line="651"/>
<source>Disabling the web applet will cause it to not be shown again for the rest of the emulated session. This can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet?</source>
<translation>停用 web applet 會導致不再顯示於模擬視窗。可能導致非預期後果,且只能用於《超級瑪利歐 3D 收藏輯》。您確定要停用 web applet?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="746"/>
+ <location filename="../../src/yuzu/main.cpp" line="754"/>
<source>The amount of shaders currently being built</source>
<translation>目前正在建構的著色器數量</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="749"/>
+ <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <source>The current selected resolution scaling multiplier.</source>
+ <translation>目前選擇的解析度縮放比例。</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="759"/>
<source>Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch.</source>
<translation>目前的模擬速度。高於或低於 100% 表示比實際 Switch 執行速度更快或更慢。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="752"/>
+ <location filename="../../src/yuzu/main.cpp" line="762"/>
<source>How many frames per second the game is currently displaying. This will vary from game to game and scene to scene.</source>
<translation>遊戲即時 FPS。會因遊戲和場景的不同而改變。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="756"/>
+ <location filename="../../src/yuzu/main.cpp" line="766"/>
<source>Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms.</source>
<translation>在不考慮幀數限制和垂直同步的情況下模擬一個 Switch 畫格的實際時間,若要全速模擬,此數值不得超過 16.67 毫秒。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="781"/>
+ <location filename="../../src/yuzu/main.cpp" line="841"/>
<source>Invalid config detected</source>
<translation>偵測到無效設定</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="782"/>
+ <location filename="../../src/yuzu/main.cpp" line="842"/>
<source>Handheld controller can&apos;t be used on docked mode. Pro controller will be selected.</source>
<translation>掌機手把無法在主機模式中使用。將會選擇 Pro 手把。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="794"/>
+ <location filename="../../src/yuzu/main.cpp" line="854"/>
<source>DOCK</source>
<translation>TV 模式</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>VULKAN</source>
<translation>VULKAN</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="828"/>
+ <location filename="../../src/yuzu/main.cpp" line="888"/>
<source>OPENGL</source>
<translation>OPENGL</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="886"/>
+ <location filename="../../src/yuzu/main.cpp" line="951"/>
<source>&amp;Clear Recent Files</source>
<translation>清除最近的檔案(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1055"/>
- <source>TAS Recording</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1210"/>
+ <source>&amp;Continue</source>
+ <translation>繼續(&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1056"/>
- <source>Overwrite file of player 1?</source>
- <translation type="unfinished"/>
+ <location filename="../../src/yuzu/main.cpp" line="1212"/>
+ <source>&amp;Pause</source>
+ <translation>&amp;暫停</translation>
</message>
<message>
<location filename="../../src/yuzu/main.cpp" line="1285"/>
@@ -3777,659 +3852,726 @@ Drag points to change position, or double-click table cells to edit values.</sou
<translation>發生未知錯誤,請檢視紀錄了解細節。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(64-bit)</source>
- <translation type="unfinished"/>
+ <translation>(64-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1462"/>
+ <location filename="../../src/yuzu/main.cpp" line="1460"/>
<source>(32-bit)</source>
- <translation type="unfinished"/>
+ <translation>(32-bit)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1463"/>
+ <location filename="../../src/yuzu/main.cpp" line="1461"/>
<source>%1 %2</source>
<comment>%1 is the title name. %2 indicates if the title is 64-bit or 32-bit</comment>
<translation>%1 %2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1507"/>
- <source>Start</source>
- <translation>開始</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="1612"/>
+ <location filename="../../src/yuzu/main.cpp" line="1605"/>
<source>Save Data</source>
<translation>儲存資料</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1660"/>
+ <location filename="../../src/yuzu/main.cpp" line="1653"/>
<source>Mod Data</source>
<translation>模組資料</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1672"/>
+ <location filename="../../src/yuzu/main.cpp" line="1665"/>
<source>Error Opening %1 Folder</source>
<translation>開啟資料夾 %1 時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1673"/>
- <location filename="../../src/yuzu/main.cpp" line="2079"/>
+ <location filename="../../src/yuzu/main.cpp" line="1666"/>
+ <location filename="../../src/yuzu/main.cpp" line="2072"/>
<source>Folder does not exist!</source>
<translation>資料夾不存在</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1685"/>
+ <location filename="../../src/yuzu/main.cpp" line="1678"/>
<source>Error Opening Transferable Shader Cache</source>
<translation>開啟通用著色器快取位置時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1686"/>
+ <location filename="../../src/yuzu/main.cpp" line="1679"/>
<source>Failed to create the shader cache directory for this title.</source>
- <translation type="unfinished"/>
+ <translation>無法新增此遊戲的著色器快取資料夾。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1738"/>
+ <location filename="../../src/yuzu/main.cpp" line="1731"/>
<source>Contents</source>
<translation>內容</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1740"/>
+ <location filename="../../src/yuzu/main.cpp" line="1733"/>
<source>Update</source>
<translation>遊戲更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1742"/>
+ <location filename="../../src/yuzu/main.cpp" line="1735"/>
<source>DLC</source>
<translation>DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Entry</source>
<translation>移除項目</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1749"/>
+ <location filename="../../src/yuzu/main.cpp" line="1742"/>
<source>Remove Installed Game %1?</source>
<translation>移除已安裝的遊戲「%1」?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1779"/>
- <location filename="../../src/yuzu/main.cpp" line="1795"/>
- <location filename="../../src/yuzu/main.cpp" line="1826"/>
- <location filename="../../src/yuzu/main.cpp" line="1887"/>
- <location filename="../../src/yuzu/main.cpp" line="1905"/>
- <location filename="../../src/yuzu/main.cpp" line="1928"/>
+ <location filename="../../src/yuzu/main.cpp" line="1772"/>
+ <location filename="../../src/yuzu/main.cpp" line="1788"/>
+ <location filename="../../src/yuzu/main.cpp" line="1819"/>
+ <location filename="../../src/yuzu/main.cpp" line="1880"/>
+ <location filename="../../src/yuzu/main.cpp" line="1898"/>
+ <location filename="../../src/yuzu/main.cpp" line="1921"/>
<source>Successfully Removed</source>
<translation>移除成功</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1780"/>
+ <location filename="../../src/yuzu/main.cpp" line="1773"/>
<source>Successfully removed the installed base game.</source>
<translation>成功移除已安裝的遊戲。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1783"/>
- <location filename="../../src/yuzu/main.cpp" line="1798"/>
- <location filename="../../src/yuzu/main.cpp" line="1821"/>
+ <location filename="../../src/yuzu/main.cpp" line="1776"/>
+ <location filename="../../src/yuzu/main.cpp" line="1791"/>
+ <location filename="../../src/yuzu/main.cpp" line="1814"/>
<source>Error Removing %1</source>
<translation>移除 %1 失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1784"/>
+ <location filename="../../src/yuzu/main.cpp" line="1777"/>
<source>The base game is not installed in the NAND and cannot be removed.</source>
<translation>此遊戲並非安裝在內部儲存空間,因此無法移除。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1796"/>
+ <location filename="../../src/yuzu/main.cpp" line="1789"/>
<source>Successfully removed the installed update.</source>
<translation>成功移除已安裝的遊戲更新。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1799"/>
+ <location filename="../../src/yuzu/main.cpp" line="1792"/>
<source>There is no update installed for this title.</source>
<translation>此遊戲沒有已安裝的更新。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1822"/>
+ <location filename="../../src/yuzu/main.cpp" line="1815"/>
<source>There are no DLC installed for this title.</source>
<translation>此遊戲沒有已安裝的 DLC。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1827"/>
+ <location filename="../../src/yuzu/main.cpp" line="1820"/>
<source>Successfully removed %1 installed DLC.</source>
<translation>成功移除遊戲 %1 已安裝的 DLC。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1835"/>
+ <location filename="../../src/yuzu/main.cpp" line="1828"/>
<source>Delete OpenGL Transferable Shader Cache?</source>
- <translation type="unfinished"/>
+ <translation>刪除 OpenGL 模式的著色器快取?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1837"/>
+ <location filename="../../src/yuzu/main.cpp" line="1830"/>
<source>Delete Vulkan Transferable Shader Cache?</source>
- <translation type="unfinished"/>
+ <translation>刪除 Vulkan 模式的著色器快取?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1839"/>
+ <location filename="../../src/yuzu/main.cpp" line="1832"/>
<source>Delete All Transferable Shader Caches?</source>
- <translation type="unfinished"/>
+ <translation>刪除所有的著色器快取?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1841"/>
+ <location filename="../../src/yuzu/main.cpp" line="1834"/>
<source>Remove Custom Game Configuration?</source>
<translation>移除額外遊戲設定?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1847"/>
+ <location filename="../../src/yuzu/main.cpp" line="1840"/>
<source>Remove File</source>
<translation>刪除檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1882"/>
- <location filename="../../src/yuzu/main.cpp" line="1890"/>
+ <location filename="../../src/yuzu/main.cpp" line="1875"/>
+ <location filename="../../src/yuzu/main.cpp" line="1883"/>
<source>Error Removing Transferable Shader Cache</source>
<translation>刪除通用著色器快取時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1883"/>
- <location filename="../../src/yuzu/main.cpp" line="1901"/>
+ <location filename="../../src/yuzu/main.cpp" line="1876"/>
+ <location filename="../../src/yuzu/main.cpp" line="1894"/>
<source>A shader cache for this title does not exist.</source>
<translation>此遊戲沒有著色器快取</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1888"/>
+ <location filename="../../src/yuzu/main.cpp" line="1881"/>
<source>Successfully removed the transferable shader cache.</source>
<translation>成功刪除著色器快取。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1891"/>
+ <location filename="../../src/yuzu/main.cpp" line="1884"/>
<source>Failed to remove the transferable shader cache.</source>
<translation>刪除通用著色器快取失敗。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1900"/>
- <location filename="../../src/yuzu/main.cpp" line="1908"/>
+ <location filename="../../src/yuzu/main.cpp" line="1893"/>
+ <location filename="../../src/yuzu/main.cpp" line="1901"/>
<source>Error Removing Transferable Shader Caches</source>
- <translation type="unfinished"/>
+ <translation>刪除通用著色器快取時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1906"/>
+ <location filename="../../src/yuzu/main.cpp" line="1899"/>
<source>Successfully removed the transferable shader caches.</source>
- <translation type="unfinished"/>
+ <translation>成功刪除通用著色器快取。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1909"/>
+ <location filename="../../src/yuzu/main.cpp" line="1902"/>
<source>Failed to remove the transferable shader cache directory.</source>
- <translation type="unfinished"/>
+ <translation>無法刪除著色器快取資料夾。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1922"/>
- <location filename="../../src/yuzu/main.cpp" line="1931"/>
+ <location filename="../../src/yuzu/main.cpp" line="1915"/>
+ <location filename="../../src/yuzu/main.cpp" line="1924"/>
<source>Error Removing Custom Configuration</source>
<translation>移除額外遊戲設定時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1923"/>
+ <location filename="../../src/yuzu/main.cpp" line="1916"/>
<source>A custom configuration for this title does not exist.</source>
<translation>此遊戲沒有額外設定。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1929"/>
+ <location filename="../../src/yuzu/main.cpp" line="1922"/>
<source>Successfully removed the custom game configuration.</source>
<translation>成功移除額外遊戲設定。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="1925"/>
<source>Failed to remove the custom game configuration.</source>
<translation>移除額外遊戲設定失敗。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1939"/>
- <location filename="../../src/yuzu/main.cpp" line="2018"/>
+ <location filename="../../src/yuzu/main.cpp" line="1932"/>
+ <location filename="../../src/yuzu/main.cpp" line="2011"/>
<source>RomFS Extraction Failed!</source>
<translation>RomFS 抽取失敗!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1940"/>
+ <location filename="../../src/yuzu/main.cpp" line="1933"/>
<source>There was an error copying the RomFS files or the user cancelled the operation.</source>
<translation>複製 RomFS 檔案時發生錯誤或使用者取消動作。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Full</source>
<translation>全部</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="1998"/>
+ <location filename="../../src/yuzu/main.cpp" line="1991"/>
<source>Skeleton</source>
<translation>部分</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2000"/>
+ <location filename="../../src/yuzu/main.cpp" line="1993"/>
<source>Select RomFS Dump Mode</source>
<translation>選擇RomFS傾印模式</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2001"/>
+ <location filename="../../src/yuzu/main.cpp" line="1994"/>
<source>Please select the how you would like the RomFS dumped.&lt;br&gt;Full will copy all of the files into the new directory while &lt;br&gt;skeleton will only create the directory structure.</source>
<translation>請選擇如何傾印 RomFS。&lt;br&gt;「全部」會複製所有檔案到新資料夾中,而&lt;br&gt;「部分」只會建立資料夾結構。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2012"/>
<source>There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation &gt; Configure &gt; System &gt; Filesystem &gt; Dump Root</source>
- <translation type="unfinished"/>
+ <translation>%1 沒有足夠的空間用於抽取 RomFS。請確保有足夠的空間或於模擬 &gt; 設定 &gt;系統 &gt;檔案系統 &gt; 傾印根目錄中選擇其他資料夾。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
<source>Extracting RomFS...</source>
<translation>抽取 RomFS 中...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2026"/>
- <location filename="../../src/yuzu/main.cpp" line="2206"/>
+ <location filename="../../src/yuzu/main.cpp" line="2019"/>
+ <location filename="../../src/yuzu/main.cpp" line="2199"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2033"/>
+ <location filename="../../src/yuzu/main.cpp" line="2026"/>
<source>RomFS Extraction Succeeded!</source>
<translation>RomFS 抽取完成!</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2034"/>
+ <location filename="../../src/yuzu/main.cpp" line="2027"/>
<source>The operation completed successfully.</source>
<translation>動作已成功完成</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2078"/>
+ <location filename="../../src/yuzu/main.cpp" line="2071"/>
<source>Error Opening %1</source>
<translation>開啟 %1 時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2087"/>
+ <location filename="../../src/yuzu/main.cpp" line="2080"/>
<source>Select Directory</source>
<translation>選擇資料夾</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2114"/>
+ <location filename="../../src/yuzu/main.cpp" line="2107"/>
<source>Properties</source>
<translation>屬性</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2115"/>
+ <location filename="../../src/yuzu/main.cpp" line="2108"/>
<source>The game properties could not be loaded.</source>
<translation>無法載入遊戲屬性</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2127"/>
+ <location filename="../../src/yuzu/main.cpp" line="2120"/>
<source>Switch Executable (%1);;All Files (*.*)</source>
<comment>%1 is an identifier for the Switch executable file extensions.</comment>
<translation>Switch 執行檔 (%1);;所有檔案 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2131"/>
+ <location filename="../../src/yuzu/main.cpp" line="2124"/>
<source>Load File</source>
<translation>開啟檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2143"/>
+ <location filename="../../src/yuzu/main.cpp" line="2136"/>
<source>Open Extracted ROM Directory</source>
<translation>開啟已抽取的 ROM 資料夾</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2154"/>
+ <location filename="../../src/yuzu/main.cpp" line="2147"/>
<source>Invalid Directory Selected</source>
<translation>選擇的資料夾無效</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2155"/>
+ <location filename="../../src/yuzu/main.cpp" line="2148"/>
<source>The directory you have selected does not contain a &apos;main&apos; file.</source>
<translation>選擇的資料夾未包含「main」檔案。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2165"/>
+ <location filename="../../src/yuzu/main.cpp" line="2158"/>
<source>Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci)</source>
<translation>可安装的 Switch 檔案 (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX 卡帶映像 (*.xci)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2170"/>
+ <location filename="../../src/yuzu/main.cpp" line="2163"/>
<source>Install Files</source>
<translation>安裝檔案</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2214"/>
+ <location filename="../../src/yuzu/main.cpp" line="2207"/>
<source>%n file(s) remaining</source>
<translation><numerusform>剩餘 %n 個檔案</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2216"/>
+ <location filename="../../src/yuzu/main.cpp" line="2209"/>
<source>Installing file &quot;%1&quot;...</source>
<translation>正在安裝檔案「%1」...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2262"/>
- <location filename="../../src/yuzu/main.cpp" line="2276"/>
+ <location filename="../../src/yuzu/main.cpp" line="2255"/>
+ <location filename="../../src/yuzu/main.cpp" line="2269"/>
<source>Install Results</source>
<translation>安裝結果</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2263"/>
+ <location filename="../../src/yuzu/main.cpp" line="2256"/>
<source>To avoid possible conflicts, we discourage users from installing base games to the NAND.
Please, only use this feature to install updates and DLC.</source>
<translation>為了避免潛在的衝突,不建議將遊戲本體安裝至內部儲存空間。
此功能僅用於安裝遊戲更新和 DLC。</translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2269"/>
+ <location filename="../../src/yuzu/main.cpp" line="2262"/>
<source>%n file(s) were newly installed
</source>
<translation><numerusform>最近安裝了 %n 個檔案
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2272"/>
+ <location filename="../../src/yuzu/main.cpp" line="2265"/>
<source>%n file(s) were overwritten
</source>
<translation><numerusform>%n 個檔案被取代
</numerusform></translation>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2274"/>
+ <location filename="../../src/yuzu/main.cpp" line="2267"/>
<source>%n file(s) failed to install
</source>
<translation><numerusform>%n 個檔案安裝失敗</numerusform></translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2375"/>
+ <location filename="../../src/yuzu/main.cpp" line="2368"/>
<source>System Application</source>
<translation>系統應用程式</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2376"/>
+ <location filename="../../src/yuzu/main.cpp" line="2369"/>
<source>System Archive</source>
<translation>系統檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2377"/>
+ <location filename="../../src/yuzu/main.cpp" line="2370"/>
<source>System Application Update</source>
<translation>系統應用程式更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2378"/>
+ <location filename="../../src/yuzu/main.cpp" line="2371"/>
<source>Firmware Package (Type A)</source>
<translation>韌體包(A型)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2379"/>
+ <location filename="../../src/yuzu/main.cpp" line="2372"/>
<source>Firmware Package (Type B)</source>
<translation>韌體包(B型)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2380"/>
+ <location filename="../../src/yuzu/main.cpp" line="2373"/>
<source>Game</source>
<translation>遊戲</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2381"/>
+ <location filename="../../src/yuzu/main.cpp" line="2374"/>
<source>Game Update</source>
<translation>遊戲更新</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2382"/>
+ <location filename="../../src/yuzu/main.cpp" line="2375"/>
<source>Game DLC</source>
<translation>遊戲 DLC</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2383"/>
+ <location filename="../../src/yuzu/main.cpp" line="2376"/>
<source>Delta Title</source>
<translation>Delta Title</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2386"/>
+ <location filename="../../src/yuzu/main.cpp" line="2379"/>
<source>Select NCA Install Type...</source>
<translation>選擇 NCA 安裝類型...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2387"/>
+ <location filename="../../src/yuzu/main.cpp" line="2380"/>
<source>Please select the type of title you would like to install this NCA as:
(In most instances, the default &apos;Game&apos; is fine.)</source>
<translation>請選擇此 NCA 的安裝類型:
(在多數情況下,選擇預設的「遊戲」即可。)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2393"/>
+ <location filename="../../src/yuzu/main.cpp" line="2386"/>
<source>Failed to Install</source>
<translation>安裝失敗</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2394"/>
+ <location filename="../../src/yuzu/main.cpp" line="2387"/>
<source>The title type you selected for the NCA is invalid.</source>
<translation>選擇的 NCA 安裝類型無效。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2429"/>
+ <location filename="../../src/yuzu/main.cpp" line="2422"/>
<source>File not found</source>
<translation>找不到檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2430"/>
+ <location filename="../../src/yuzu/main.cpp" line="2423"/>
<source>File &quot;%1&quot; not found</source>
<translation>找不到「%1」檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2445"/>
- <location filename="../../src/yuzu/main.cpp" line="3448"/>
- <source>&amp;Continue</source>
- <translation>繼續(&amp;C)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.cpp" line="2494"/>
+ <location filename="../../src/yuzu/main.cpp" line="2492"/>
<source>OK</source>
<translation>確定</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2508"/>
+ <location filename="../../src/yuzu/main.cpp" line="2506"/>
<source>Missing yuzu Account</source>
<translation>未設定 yuzu 帳號</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2509"/>
+ <location filename="../../src/yuzu/main.cpp" line="2507"/>
<source>In order to submit a game compatibility test case, you must link your yuzu account.&lt;br&gt;&lt;br/&gt;To link your yuzu account, go to Emulation &amp;gt; Configuration &amp;gt; Web.</source>
<translation>為了上傳相容性測試結果,您必須登入 yuzu 帳號。&lt;br&gt;&lt;br/&gt;欲登入 yuzu 帳號請至模擬 &amp;gt; 設定 &amp;gt; 網路。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2519"/>
+ <location filename="../../src/yuzu/main.cpp" line="2517"/>
<source>Error opening URL</source>
<translation>開啟 URL 時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2520"/>
+ <location filename="../../src/yuzu/main.cpp" line="2518"/>
<source>Unable to open the URL &quot;%1&quot;.</source>
<translation>無法開啟 URL:「%1」。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2802"/>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>TAS Recording</source>
+ <translation>TAS 錄製</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2777"/>
+ <source>Overwrite file of player 1?</source>
+ <translation>覆寫玩家 1 的檔案?</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2830"/>
<source>Amiibo File (%1);; All Files (*.*)</source>
<translation>Amiibo 檔案 (%1);; 所有檔案 (*.*)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2803"/>
+ <location filename="../../src/yuzu/main.cpp" line="2831"/>
<source>Load Amiibo</source>
- <translation>載入 Amiibo</translation>
+ <translation>開啟 Amiibo</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2821"/>
+ <location filename="../../src/yuzu/main.cpp" line="2849"/>
<source>Error opening Amiibo data file</source>
<translation>開啟 Amiibo 檔案時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2822"/>
+ <location filename="../../src/yuzu/main.cpp" line="2850"/>
<source>Unable to open Amiibo file &quot;%1&quot; for reading.</source>
<translation>無法開啟 Amiibo 檔案 %1。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2830"/>
+ <location filename="../../src/yuzu/main.cpp" line="2858"/>
<source>Error reading Amiibo data file</source>
<translation>讀取 Amiibo 檔案時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2831"/>
+ <location filename="../../src/yuzu/main.cpp" line="2859"/>
<source>Unable to fully read Amiibo data. Expected to read %1 bytes, but was only able to read %2 bytes.</source>
<translation>無法讀取完整的 Amiibo 資料。應讀取 %1 位元組,但實際僅讀取到 %2 位元組。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2839"/>
+ <location filename="../../src/yuzu/main.cpp" line="2867"/>
<source>Error loading Amiibo data</source>
<translation>載入 Amiibo 資料時發生錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2840"/>
+ <location filename="../../src/yuzu/main.cpp" line="2868"/>
<source>Unable to load Amiibo data.</source>
<translation>無法載入 Amiibo 資料。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2881"/>
+ <location filename="../../src/yuzu/main.cpp" line="2913"/>
<source>Capture Screenshot</source>
<translation>截圖</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2882"/>
+ <location filename="../../src/yuzu/main.cpp" line="2914"/>
<source>PNG Image (*.png)</source>
<translation>PNG 圖片 (*.png)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2948"/>
+ <location filename="../../src/yuzu/main.cpp" line="2979"/>
<source>TAS state: Running %1/%2</source>
- <translation type="unfinished"/>
+ <translation>TAS 狀態:正在執行 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2950"/>
+ <location filename="../../src/yuzu/main.cpp" line="2981"/>
<source>TAS state: Recording %1</source>
- <translation type="unfinished"/>
+ <translation>TAS 狀態:正在錄製 %1</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2952"/>
+ <location filename="../../src/yuzu/main.cpp" line="2983"/>
<source>TAS state: Idle %1/%2</source>
- <translation type="unfinished"/>
+ <translation>TAS 狀態:閒置 %1/%2</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2954"/>
+ <location filename="../../src/yuzu/main.cpp" line="2985"/>
<source>TAS State: Invalid</source>
+ <translation>TAS 狀態:無效</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Stop Running</source>
+ <translation>&amp;停止執行</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="2999"/>
+ <source>&amp;Start</source>
+ <translation>開始(&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>Stop R&amp;ecording</source>
+ <translation>停止錄製</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3000"/>
+ <source>R&amp;ecord</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
- <location filename="../../src/yuzu/main.cpp" line="2975"/>
+ <location filename="../../src/yuzu/main.cpp" line="3024"/>
<source>Building: %n shader(s)</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>正在編譯 %n 個著色器檔案</numerusform></translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3033"/>
+ <source>Scale: %1x</source>
+ <comment>%1 is the resolution scaling factor</comment>
+ <translation>縮放比例:%1x</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2982"/>
+ <location filename="../../src/yuzu/main.cpp" line="3036"/>
<source>Speed: %1% / %2%</source>
<translation>速度:%1% / %2%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2986"/>
+ <location filename="../../src/yuzu/main.cpp" line="3040"/>
<source>Speed: %1%</source>
<translation>速度:%1%</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2990"/>
+ <location filename="../../src/yuzu/main.cpp" line="3044"/>
<source>Game: %1 FPS (Unlocked)</source>
- <translation type="unfinished"/>
+ <translation>遊戲: %1 FPS(未限制)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2992"/>
+ <location filename="../../src/yuzu/main.cpp" line="3046"/>
<source>Game: %1 FPS</source>
<translation>遊戲:%1 FPS</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="2994"/>
+ <location filename="../../src/yuzu/main.cpp" line="3048"/>
<source>Frame: %1 ms</source>
<translation>畫格延遲:%1 ms</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3004"/>
+ <location filename="../../src/yuzu/main.cpp" line="3059"/>
<source>GPU NORMAL</source>
- <translation type="unfinished"/>
+ <translation>GPU 一般效能</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3009"/>
+ <location filename="../../src/yuzu/main.cpp" line="3064"/>
<source>GPU HIGH</source>
- <translation type="unfinished"/>
+ <translation>GPU 高效能</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3014"/>
+ <location filename="../../src/yuzu/main.cpp" line="3069"/>
<source>GPU EXTREME</source>
- <translation type="unfinished"/>
+ <translation>GPU 最高效能</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3019"/>
+ <location filename="../../src/yuzu/main.cpp" line="3074"/>
<source>GPU ERROR</source>
+ <translation>GPU 錯誤</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3084"/>
+ <source>NEAREST</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3087"/>
+ <location filename="../../src/yuzu/main.cpp" line="3102"/>
+ <source>BILINEAR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3090"/>
+ <source>BICUBIC</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3076"/>
+ <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <source>GAUSSIAN</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3096"/>
+ <source>SCALEFORCE</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <source>FSR</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3111"/>
+ <location filename="../../src/yuzu/main.cpp" line="3117"/>
+ <source>NO AA</source>
+ <translation>抗鋸齒關</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <source>FXAA</source>
+ <translation>FXAA</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.cpp" line="3175"/>
<source>The game you are trying to load requires additional files from your Switch to be dumped before playing.&lt;br/&gt;&lt;br/&gt;For more information on dumping these files, please see the following wiki page: &lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;Dumping System Archives and the Shared Fonts from a Switch Console&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>此遊戲需要從您的 Switch 傾印額外檔案。&lt;br/&gt;&lt;br/&gt;有關傾印這些檔案的更多資訊,請參閱以下 wiki 網頁:Dumping System Archives and the Shared Fonts from a Switch Console&lt;a href=&apos;https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/&apos;&gt;。&lt;br/&gt;&lt;br/&gt;您要停止並回到遊戲清單嗎?繼續模擬可能會導致當機、存檔損毀或其他錯誤。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3091"/>
+ <location filename="../../src/yuzu/main.cpp" line="3190"/>
<source>yuzu was unable to locate a Switch system archive. %1</source>
<translation>Yuzu 找不到 Switch 系統檔案 %1 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3093"/>
+ <location filename="../../src/yuzu/main.cpp" line="3192"/>
<source>yuzu was unable to locate a Switch system archive: %1. %2</source>
<translation>Yuzu 找不到 Switch 系統檔案:%1。%2 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3097"/>
+ <location filename="../../src/yuzu/main.cpp" line="3196"/>
<source>System Archive Not Found</source>
<translation>找不到系統檔案</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3099"/>
+ <location filename="../../src/yuzu/main.cpp" line="3198"/>
<source>System Archive Missing</source>
<translation>系統檔案遺失</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3105"/>
+ <location filename="../../src/yuzu/main.cpp" line="3204"/>
<source>yuzu was unable to locate the Switch shared fonts. %1</source>
<translation>Yuzu 找不到 Switch 共享字型 %1 </translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3106"/>
+ <location filename="../../src/yuzu/main.cpp" line="3205"/>
<source>Shared Fonts Not Found</source>
<translation>找不到共享字型</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3108"/>
+ <location filename="../../src/yuzu/main.cpp" line="3207"/>
<source>Shared Font Missing</source>
<translation>遺失共享字型</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3114"/>
+ <location filename="../../src/yuzu/main.cpp" line="3213"/>
<source>Fatal Error</source>
<translation>嚴重錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3115"/>
+ <location filename="../../src/yuzu/main.cpp" line="3214"/>
<source>yuzu has encountered a fatal error, please see the log for more details. For more information on accessing the log, please see the following page: &lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs.</source>
<translation>yuzu 發生嚴重錯誤,請檢視紀錄以了解細節。更多資訊請參閱網頁:&lt;a href=&apos;https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;How to Upload the Log File&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;您要停止模擬並回到遊戲清單嗎?繼續模擬可能會導致當機、存檔損毀或其他錯誤。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3124"/>
+ <location filename="../../src/yuzu/main.cpp" line="3223"/>
<source>Fatal Error encountered</source>
<translation>發生嚴重錯誤</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3147"/>
+ <location filename="../../src/yuzu/main.cpp" line="3246"/>
<source>Confirm Key Rederivation</source>
<translation>確認重新產生金鑰</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3148"/>
+ <location filename="../../src/yuzu/main.cpp" line="3247"/>
<source>You are about to force rederive all of your keys.
If you do not know what this means or what you are doing,
this is a potentially destructive action.
@@ -4445,37 +4587,37 @@ This will delete your autogenerated key files and re-run the key derivation modu
這將刪除您自動產生的金鑰檔案並重新執行產生金鑰模組。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3180"/>
+ <location filename="../../src/yuzu/main.cpp" line="3279"/>
<source>Missing fuses</source>
<translation>遺失項目</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3183"/>
+ <location filename="../../src/yuzu/main.cpp" line="3282"/>
<source> - Missing BOOT0</source>
<translation>- 遺失 BOOT0</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3186"/>
+ <location filename="../../src/yuzu/main.cpp" line="3285"/>
<source> - Missing BCPKG2-1-Normal-Main</source>
<translation> - 遺失 BCPKG2-1-Normal-Main</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3189"/>
+ <location filename="../../src/yuzu/main.cpp" line="3288"/>
<source> - Missing PRODINFO</source>
<translation>- 遺失 PRODINFO</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3193"/>
+ <location filename="../../src/yuzu/main.cpp" line="3292"/>
<source>Derivation Components Missing</source>
<translation>遺失產生元件</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3194"/>
- <source>Components are missing that may hinder key derivation from completing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
- <translation>缺少元件可能會影響遊戲的正常運作。&lt;br&gt;請檢視 &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;yuzu 快速指引&lt;/a&gt;以取得您的金鑰和遊戲。&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</translation>
+ <location filename="../../src/yuzu/main.cpp" line="3293"/>
+ <source>Encryption keys are missing. &lt;br&gt;Please follow &lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;the yuzu quickstart guide&lt;/a&gt; to get all your keys, firmware and games.&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)&lt;/small&gt;</source>
+ <translation>缺少加密金鑰。 &lt;br&gt;請按照&lt;a href=&apos;https://yuzu-emu.org/help/quickstart/&apos;&gt;《Yuzu快速入門指南》來取得所有金鑰、韌體、遊戲&lt;br&gt;&lt;br&gt;&lt;small&gt;(%1)。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3203"/>
+ <location filename="../../src/yuzu/main.cpp" line="3302"/>
<source>Deriving keys...
This may take up to a minute depending
on your system&apos;s performance.</source>
@@ -4484,39 +4626,39 @@ on your system&apos;s performance.</source>
您的系統效能。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3205"/>
+ <location filename="../../src/yuzu/main.cpp" line="3304"/>
<source>Deriving Keys</source>
<translation>產生金鑰</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3250"/>
+ <location filename="../../src/yuzu/main.cpp" line="3349"/>
<source>Select RomFS Dump Target</source>
<translation>選擇 RomFS 傾印目標</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3251"/>
+ <location filename="../../src/yuzu/main.cpp" line="3350"/>
<source>Please select which RomFS you would like to dump.</source>
<translation>請選擇希望傾印的 RomFS。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3266"/>
+ <location filename="../../src/yuzu/main.cpp" line="3365"/>
<source>Are you sure you want to close yuzu?</source>
<translation>您確定要關閉 yuzu 嗎?</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3267"/>
- <location filename="../../src/yuzu/main.cpp" line="3342"/>
- <location filename="../../src/yuzu/main.cpp" line="3355"/>
+ <location filename="../../src/yuzu/main.cpp" line="3366"/>
+ <location filename="../../src/yuzu/main.cpp" line="3443"/>
+ <location filename="../../src/yuzu/main.cpp" line="3456"/>
<source>yuzu</source>
<translation>yuzu</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3343"/>
+ <location filename="../../src/yuzu/main.cpp" line="3444"/>
<source>Are you sure you want to stop the emulation? Any unsaved progress will be lost.</source>
<translation>您確定要停止模擬嗎?未儲存的進度將會遺失。</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.cpp" line="3352"/>
+ <location filename="../../src/yuzu/main.cpp" line="3453"/>
<source>The currently running application has requested yuzu to not exit.
Would you like to bypass this and exit anyway?</source>
@@ -4528,38 +4670,38 @@ Would you like to bypass this and exit anyway?</source>
<context>
<name>GRenderWindow</name>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="675"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="976"/>
<source>OpenGL not available!</source>
<translation>無法使用 OpenGL 模式!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="676"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="977"/>
<source>yuzu has not been compiled with OpenGL support.</source>
<translation>yuzu 未以支援 OpenGL 的方式編譯。</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="695"/>
- <location filename="../../src/yuzu/bootmanager.cpp" line="715"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="996"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1016"/>
<source>Error while initializing OpenGL!</source>
<translation>初始化 OpenGL 時發生錯誤!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="696"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="997"/>
<source>Your GPU may not support OpenGL, or you do not have the latest graphics driver.</source>
<translation>您的 GPU 可能不支援 OpenGL,或是未安裝最新的圖形驅動程式</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="705"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1006"/>
<source>Error while initializing OpenGL 4.6!</source>
<translation>初始化 OpenGL 4.6 時發生錯誤!</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="706"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1007"/>
<source>Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1</source>
<translation>您的 GPU 可能不支援 OpenGL 4.6,或是未安裝最新的圖形驅動程式&lt;br&gt;&lt;br&gt;GL 渲染器:&lt;br&gt;%1</translation>
</message>
<message>
- <location filename="../../src/yuzu/bootmanager.cpp" line="716"/>
+ <location filename="../../src/yuzu/bootmanager.cpp" line="1017"/>
<source>Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.&lt;br&gt;&lt;br&gt;GL Renderer:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;Unsupported extensions:&lt;br&gt;%2</source>
<translation>您的 GPU 可能不支援某些必需的 OpenGL 功能。請確保您已安裝最新的圖形驅動程式。&lt;br&gt;&lt;br&gt;GL 渲染器:&lt;br&gt;%1&lt;br&gt;&lt;br&gt;不支援的功能:&lt;br&gt;%2</translation>
</message>
@@ -4579,7 +4721,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="333"/>
<source>Add-ons</source>
- <translation>擴充功能</translation>
+ <translation>延伸模組</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="335"/>
@@ -4619,7 +4761,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="517"/>
<source>Open Transferable Pipeline Cache</source>
- <translation type="unfinished"/>
+ <translation>開啟通用著色器管線快取位置</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="519"/>
@@ -4644,17 +4786,17 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="523"/>
<source>Remove OpenGL Pipeline Cache</source>
- <translation type="unfinished"/>
+ <translation>刪除 OpenGL 著色器管線快取</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="524"/>
<source>Remove Vulkan Pipeline Cache</source>
- <translation type="unfinished"/>
+ <translation>刪除 Vulkan 著色器管線快取</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="526"/>
<source>Remove All Pipeline Caches</source>
- <translation type="unfinished"/>
+ <translation>刪除所有著色器管線快取</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="527"/>
@@ -4670,7 +4812,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="530"/>
<source>Dump RomFS to SDMC</source>
- <translation type="unfinished"/>
+ <translation>傾印 RomFS 到 SDMC</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="531"/>
@@ -4690,7 +4832,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="606"/>
<source>Scan Subfolders</source>
- <translation>掃描子資料夾</translation>
+ <translation>包含子資料夾</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="607"/>
@@ -4710,7 +4852,7 @@ Would you like to bypass this and exit anyway?</source>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="628"/>
<source>Open Directory Location</source>
- <translation>開啟目錄資料夾</translation>
+ <translation>開啟資料夾位置</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list.cpp" line="673"/>
@@ -4851,7 +4993,7 @@ Screen.</source>
<location filename="../../src/yuzu/util/limitable_input_dialog.cpp" line="62"/>
<source>The text can't contain any of the following characters:
%1</source>
- <translation type="unfinished"/>
+ <translation>文字中不能包含以下字元:%1</translation>
</message>
</context>
<context>
@@ -4915,189 +5057,204 @@ Screen.</source>
<translation>模擬 (&amp;E)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="79"/>
+ <location filename="../../src/yuzu/main.ui" line="78"/>
<source>&amp;View</source>
<translation>檢視 (&amp;V)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="83"/>
+ <location filename="../../src/yuzu/main.ui" line="82"/>
<source>&amp;Reset Window Size</source>
<translation>重設視窗大小(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="88"/>
+ <location filename="../../src/yuzu/main.ui" line="87"/>
+ <source>&amp;Debugging</source>
+ <translation>偵錯 (&amp;D)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="92"/>
<source>Reset Window Size to &amp;720p</source>
<translation>重設視窗大小為 &amp;720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="91"/>
+ <location filename="../../src/yuzu/main.ui" line="95"/>
<source>Reset Window Size to 720p</source>
<translation>重設視窗大小為 720p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="96"/>
+ <location filename="../../src/yuzu/main.ui" line="100"/>
<source>Reset Window Size to &amp;900p</source>
<translation>重設視窗大小為 &amp;900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="99"/>
+ <location filename="../../src/yuzu/main.ui" line="103"/>
<source>Reset Window Size to 900p</source>
<translation>重設視窗大小為 900p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="104"/>
+ <location filename="../../src/yuzu/main.ui" line="108"/>
<source>Reset Window Size to &amp;1080p</source>
<translation>重設視窗大小為 &amp;1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="107"/>
+ <location filename="../../src/yuzu/main.ui" line="111"/>
<source>Reset Window Size to 1080p</source>
<translation>重設視窗大小為 1080p</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="112"/>
- <source>&amp;Debugging</source>
- <translation>偵錯 (&amp;D)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="126"/>
+ <location filename="../../src/yuzu/main.ui" line="125"/>
<source>&amp;Tools</source>
<translation>工具 (&amp;T)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="135"/>
+ <location filename="../../src/yuzu/main.ui" line="129"/>
+ <source>&amp;TAS</source>
+ <translation>TAS (&amp;T)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="144"/>
<source>&amp;Help</source>
<translation>說明 (&amp;H)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="155"/>
+ <location filename="../../src/yuzu/main.ui" line="164"/>
<source>&amp;Install Files to NAND...</source>
<translation>&amp;安裝檔案至內部儲存空間</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="160"/>
+ <location filename="../../src/yuzu/main.ui" line="169"/>
<source>L&amp;oad File...</source>
- <translation>載入檔案(&amp;O)...</translation>
+ <translation>開啟檔案(&amp;O)...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="165"/>
+ <location filename="../../src/yuzu/main.ui" line="174"/>
<source>Load &amp;Folder...</source>
<translation>開啟資料夾(&amp;F)...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="170"/>
+ <location filename="../../src/yuzu/main.ui" line="179"/>
<source>E&amp;xit</source>
<translation>結束(&amp;X)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="178"/>
- <source>&amp;Start</source>
- <translation>開始(&amp;S)</translation>
- </message>
- <message>
- <location filename="../../src/yuzu/main.ui" line="186"/>
+ <location filename="../../src/yuzu/main.ui" line="187"/>
<source>&amp;Pause</source>
<translation>暫停(&amp;P)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="194"/>
+ <location filename="../../src/yuzu/main.ui" line="195"/>
<source>&amp;Stop</source>
<translation>停止(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="199"/>
+ <location filename="../../src/yuzu/main.ui" line="200"/>
<source>&amp;Reinitialize keys...</source>
<translation>重新初始化金鑰(&amp;R)...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="204"/>
+ <location filename="../../src/yuzu/main.ui" line="205"/>
<source>&amp;About yuzu</source>
<translation>關於 yuzu(&amp;A)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="212"/>
+ <location filename="../../src/yuzu/main.ui" line="213"/>
<source>Single &amp;Window Mode</source>
- <translation>單視窗模式(&amp;W)</translation>
+ <translation>單一視窗模式(&amp;W)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="217"/>
+ <location filename="../../src/yuzu/main.ui" line="218"/>
<source>Con&amp;figure...</source>
<translation>設定 (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="225"/>
+ <location filename="../../src/yuzu/main.ui" line="226"/>
<source>Display D&amp;ock Widget Headers</source>
- <translation>顯示停駐小工具的標題 (&amp;O)</translation>
+ <translation>顯示 Dock 小工具標題 (&amp;O)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="233"/>
+ <location filename="../../src/yuzu/main.ui" line="234"/>
<source>Show &amp;Filter Bar</source>
<translation>顯示搜尋列(&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="241"/>
+ <location filename="../../src/yuzu/main.ui" line="242"/>
<source>Show &amp;Status Bar</source>
<translation>顯示狀態列(&amp;S)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="244"/>
+ <location filename="../../src/yuzu/main.ui" line="245"/>
<source>Show Status Bar</source>
<translation>顯示狀態列</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="252"/>
+ <location filename="../../src/yuzu/main.ui" line="253"/>
<source>F&amp;ullscreen</source>
<translation>全螢幕(&amp;U)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="260"/>
+ <location filename="../../src/yuzu/main.ui" line="261"/>
<source>&amp;Restart</source>
<translation>重新啟動(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="268"/>
+ <location filename="../../src/yuzu/main.ui" line="269"/>
<source>Load &amp;Amiibo...</source>
- <translation>載入 &amp;Amiibo...</translation>
+ <translation>開啟 &amp;Amiibo...</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="276"/>
+ <location filename="../../src/yuzu/main.ui" line="277"/>
<source>&amp;Report Compatibility</source>
<translation>回報相容性(&amp;R)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="284"/>
+ <location filename="../../src/yuzu/main.ui" line="285"/>
<source>Open &amp;Mods Page</source>
- <translation>模組網頁 (&amp;M)</translation>
+ <translation>模組資訊 (&amp;M)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="289"/>
+ <location filename="../../src/yuzu/main.ui" line="290"/>
<source>Open &amp;Quickstart Guide</source>
<translation>快速入門 (&amp;Q)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="294"/>
+ <location filename="../../src/yuzu/main.ui" line="295"/>
<source>&amp;FAQ</source>
<translation>常見問題 (&amp;F)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="299"/>
+ <location filename="../../src/yuzu/main.ui" line="300"/>
<source>Open &amp;yuzu Folder</source>
<translation>開啟 yuzu 資料夾(&amp;Y)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="307"/>
+ <location filename="../../src/yuzu/main.ui" line="308"/>
<source>&amp;Capture Screenshot</source>
<translation>截圖 (&amp;C)</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="312"/>
- <source>Configure &amp;TAS...</source>
+ <location filename="../../src/yuzu/main.ui" line="313"/>
+ <source>&amp;Configure TAS...</source>
<translation>設定 &amp;TAS…</translation>
</message>
<message>
- <location filename="../../src/yuzu/main.ui" line="320"/>
+ <location filename="../../src/yuzu/main.ui" line="321"/>
<source>Configure C&amp;urrent Game...</source>
- <translation>設定目前遊戲...(&amp;U)</translation>
+ <translation>目前遊戲設定...(&amp;U)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="329"/>
+ <source>&amp;Start</source>
+ <translation>開始(&amp;S)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="337"/>
+ <source>&amp;Reset</source>
+ <translation>重設 (&amp;R)</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/main.ui" line="345"/>
+ <source>R&amp;ecord</source>
+ <translation type="unfinished"/>
</message>
</context>
<context>
@@ -5144,10 +5301,15 @@ p, li { white-space: pre-wrap; }
<context>
<name>PlayerControlPreview</name>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1566"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="1572"/>
<source>START/PAUSE</source>
<translation>開始 / 暫停</translation>
</message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player_widget.cpp" line="2685"/>
+ <source>Charging</source>
+ <translation type="unfinished"/>
+ </message>
</context>
<context>
<name>QObject</name>
@@ -5169,7 +5331,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../../src/yuzu/game_list_p.h" line="303"/>
<source>Add New Game Directory</source>
- <translation>新增遊戲資料夾</translation>
+ <translation>加入遊戲資料夾</translation>
</message>
<message>
<location filename="../../src/yuzu/game_list_p.h" line="326"/>
@@ -5178,142 +5340,222 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="23"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="32"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="25"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="34"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="45"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="27"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="36"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="47"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="37"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="46"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="103"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="196"/>
<source>[not set]</source>
<translation>[未設定]</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="49"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="58"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="152"/>
<source>Hat %1 %2</source>
<translation>方向鍵 %1 %2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="56"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="65"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="159"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="210"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="218"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="222"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="219"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="223"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="231"/>
<source>Axis %1%2</source>
<translation>Axis %1%2</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="62"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="71"/>
<source>Button %1</source>
<translation>按鍵 %1</translation>
</message>
<message>
<location filename="../../src/yuzu/configuration/configure_touch_from_button.cpp" line="68"/>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="76"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="185"/>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="227"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="190"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="204"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="234"/>
<source>[unknown]</source>
<translation>[未知]</translation>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="22"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="58"/>
+ <source>Left</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="60"/>
+ <source>Right</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="62"/>
- <source>Click 0</source>
- <translation>點擊 0</translation>
+ <source>Down</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="24"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="64"/>
- <source>Click 1</source>
- <translation>點擊 1</translation>
+ <source>Up</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="26"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="66"/>
- <source>Click 2</source>
- <translation>點擊 2</translation>
+ <source>Z</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="28"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="68"/>
- <source>Click 3</source>
- <translation>點擊 3</translation>
+ <source>R</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_mouse_advanced.cpp" line="30"/>
<location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="70"/>
- <source>Click 4</source>
- <translation>點擊 4</translation>
+ <source>L</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="109"/>
- <source>%1%2</source>
- <translation>%1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="72"/>
+ <source>A</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="117"/>
- <source>GC Axis %1%2</source>
- <translation>GC Axis %1%2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="74"/>
+ <source>B</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="121"/>
- <source>GC Button %1</source>
- <translation>GC 按鍵 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="76"/>
+ <source>X</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="130"/>
- <source>TAS Axis %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="78"/>
+ <source>Y</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="80"/>
+ <source>Start</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="82"/>
+ <source>L1</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="134"/>
- <source>TAS Btn %1</source>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="84"/>
+ <source>L2</source>
<translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="142"/>
- <source>Motion %1</source>
- <translation>體感 %1</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="86"/>
+ <source>L3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="166"/>
- <source>%1Button %2</source>
- <translation>%1按鍵 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="88"/>
+ <source>R1</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="170"/>
- <source>SDL Motion</source>
- <translation>SDL 體感</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="90"/>
+ <source>R2</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="180"/>
- <source>%1Click %2</source>
- <translation>%1點擊 %2</translation>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="92"/>
+ <source>R3</source>
+ <translation type="unfinished"/>
</message>
<message>
- <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="205"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="94"/>
+ <source>Circle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="96"/>
+ <source>Cross</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="98"/>
+ <source>Square</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="100"/>
+ <source>Triangle</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="102"/>
+ <source>Share</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="104"/>
+ <source>Options</source>
+ <translation>選項</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="106"/>
+ <source>[undefined]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="140"/>
+ <source>%1%2</source>
+ <translation>%1%2</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="144"/>
+ <source>[invalid]</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="154"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="178"/>
+ <source>%1%2Hat %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="158"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="181"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="184"/>
+ <source>%1%2Axis %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="164"/>
+ <source>%1%2Axis %3,%4,%5</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="168"/>
+ <source>%1%2Motion %3</source>
+ <translation type="unfinished"/>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="172"/>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="187"/>
+ <source>%1%2Button %3</source>
+ <translation>%1%2按鈕 %3</translation>
+ </message>
+ <message>
+ <location filename="../../src/yuzu/configuration/configure_input_player.cpp" line="214"/>
<source>[unused]</source>
<translation>[未使用]</translation>
</message>
@@ -5354,7 +5596,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1656"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1857"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2054"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="411"/>
<source>Pro Controller</source>
<translation>Pro 手把</translation>
</message>
@@ -5367,7 +5609,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1661"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1862"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2059"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="415"/>
<source>Dual Joycons</source>
<translation>雙 Joycon 手把</translation>
</message>
@@ -5380,7 +5622,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1666"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1867"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2064"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="427"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="419"/>
<source>Left Joycon</source>
<translation>左 Joycon 手把</translation>
</message>
@@ -5393,7 +5635,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1671"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="1872"/>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="2069"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="431"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="423"/>
<source>Right Joycon</source>
<translation>右 Joycon 手把</translation>
</message>
@@ -5421,7 +5663,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../../src/yuzu/applets/qt_controller.ui" line="932"/>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="436"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="428"/>
<source>Handheld</source>
<translation>掌機模式</translation>
</message>
@@ -5542,7 +5784,7 @@ p, li { white-space: pre-wrap; }
<translation>8</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_controller.cpp" line="441"/>
+ <location filename="../../src/yuzu/applets/qt_controller.cpp" line="433"/>
<source>GameCube Controller</source>
<translation>GameCube 手把</translation>
</message>
@@ -5636,13 +5878,13 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="396"/>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="399"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>OK</source>
<translation>確定</translation>
</message>
<message>
- <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="406"/>
+ <location filename="../../src/yuzu/applets/qt_software_keyboard.cpp" line="409"/>
<source>Cancel</source>
<translation>取消</translation>
</message>
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index a76a3d800..64d1e6aec 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -44,10 +44,6 @@ target_include_directories(mbedtls PUBLIC ./mbedtls/include)
add_library(microprofile INTERFACE)
target_include_directories(microprofile INTERFACE ./microprofile)
-# Unicorn
-add_library(unicorn-headers INTERFACE)
-target_include_directories(unicorn-headers INTERFACE ./unicorn/include)
-
# libusb
if (NOT LIBUSB_FOUND OR YUZU_USE_BUNDLED_LIBUSB)
add_subdirectory(libusb)
diff --git a/externals/SDL b/externals/SDL
-Subproject 25f9ed87ff6947d9576fc9d79dee0784e638ac5
+Subproject 2e9821423a237a1206e3c09020778faacfe430b
diff --git a/externals/cubeb b/externals/cubeb
-Subproject 1d66483ad2b93f0e00e175f9480c771af90003a
+Subproject 75d9d125ee655ef80f3bfcd97ae5a805931042b
diff --git a/externals/find-modules/FindUnicorn.cmake b/externals/find-modules/FindUnicorn.cmake
deleted file mode 100644
index a0f2a71f6..000000000
--- a/externals/find-modules/FindUnicorn.cmake
+++ /dev/null
@@ -1,18 +0,0 @@
-# Exports:
-# LIBUNICORN_FOUND
-# LIBUNICORN_INCLUDE_DIR
-# LIBUNICORN_LIBRARY
-
-find_path(LIBUNICORN_INCLUDE_DIR
- unicorn/unicorn.h
- HINTS $ENV{UNICORNDIR}
- PATH_SUFFIXES include)
-
-find_library(LIBUNICORN_LIBRARY
- NAMES unicorn
- HINTS $ENV{UNICORNDIR})
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(unicorn DEFAULT_MSG
- LIBUNICORN_LIBRARY LIBUNICORN_INCLUDE_DIR)
-mark_as_advanced(LIBUNICORN_INCLUDE_DIR LIBUNICORN_LIBRARY)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 63dd9febf..19d16147d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -24,6 +24,7 @@ if (MSVC)
# /W3 - Level 3 warnings
# /MP - Multi-threaded compilation
# /Zi - Output debugging information
+ # /Zm - Specifies the precompiled header memory allocation limit
# /Zo - Enhanced debug info for optimized builds
# /permissive- - Enables stricter C++ standards conformance checks
# /EHsc - C++-only exception handling semantics
@@ -36,6 +37,7 @@ if (MSVC)
add_compile_options(
/MP
/Zi
+ /Zm200
/Zo
/permissive-
/EHsc
diff --git a/src/audio_core/delay_line.cpp b/src/audio_core/delay_line.cpp
index f4e4dd8d2..2793ed8db 100644
--- a/src/audio_core/delay_line.cpp
+++ b/src/audio_core/delay_line.cpp
@@ -1,3 +1,7 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
#include <cstring>
#include "audio_core/delay_line.h"
diff --git a/src/audio_core/delay_line.h b/src/audio_core/delay_line.h
index cafddd432..84f11bc52 100644
--- a/src/audio_core/delay_line.h
+++ b/src/audio_core/delay_line.h
@@ -1,3 +1,7 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
#pragma once
#include "common/common_types.h"
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 23d43a394..919da4a53 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -73,6 +73,7 @@ add_library(common STATIC
hex_util.h
host_memory.cpp
host_memory.h
+ input.h
intrusive_red_black_tree.h
literals.h
logging/backend.cpp
diff --git a/src/common/bit_util.h b/src/common/bit_util.h
index 64520ca4e..eef8c1c5a 100644
--- a/src/common/bit_util.h
+++ b/src/common/bit_util.h
@@ -7,6 +7,7 @@
#include <bit>
#include <climits>
#include <cstddef>
+#include <type_traits>
#include "common/common_types.h"
@@ -44,4 +45,10 @@ template <typename T>
return static_cast<u32>(log2_f + static_cast<u64>((value ^ (1ULL << log2_f)) != 0ULL));
}
+template <typename T>
+requires std::is_integral_v<T>
+[[nodiscard]] T NextPow2(T value) {
+ return static_cast<T>(1ULL << ((8U * sizeof(T)) - std::countl_zero(value - 1U)));
+}
+
} // namespace Common
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index b44a44949..28949fe5e 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -1,3 +1,7 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
#ifdef _WIN32
#include <iterator>
diff --git a/src/common/input.h b/src/common/input.h
new file mode 100644
index 000000000..f775a4c01
--- /dev/null
+++ b/src/common/input.h
@@ -0,0 +1,366 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <functional>
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <utility>
+#include "common/logging/log.h"
+#include "common/param_package.h"
+#include "common/uuid.h"
+
+namespace Common::Input {
+
+// Type of data that is expected to recieve or send
+enum class InputType {
+ None,
+ Battery,
+ Button,
+ Stick,
+ Analog,
+ Trigger,
+ Motion,
+ Touch,
+ Color,
+ Vibration,
+ Nfc,
+ Ir,
+};
+
+// Internal battery charge level
+enum class BatteryLevel : u32 {
+ None,
+ Empty,
+ Critical,
+ Low,
+ Medium,
+ Full,
+ Charging,
+};
+
+enum class PollingMode {
+ // Constant polling of buttons, analogs and motion data
+ Active,
+ // Only update on button change, digital analogs
+ Pasive,
+ // Enable near field communication polling
+ NFC,
+ // Enable infrared camera polling
+ IR,
+};
+
+// Vibration reply from the controller
+enum class VibrationError {
+ None,
+ NotSupported,
+ Disabled,
+ Unknown,
+};
+
+// Polling mode reply from the controller
+enum class PollingError {
+ None,
+ NotSupported,
+ Unknown,
+};
+
+// Hint for amplification curve to be used
+enum class VibrationAmplificationType {
+ Linear,
+ Exponential,
+};
+
+// Analog properties for calibration
+struct AnalogProperties {
+ // Anything below this value will be detected as zero
+ float deadzone{};
+ // Anyting above this values will be detected as one
+ float range{1.0f};
+ // Minimum value to be detected as active
+ float threshold{0.5f};
+ // Drift correction applied to the raw data
+ float offset{};
+ // Invert direction of the sensor data
+ bool inverted{};
+};
+
+// Single analog sensor data
+struct AnalogStatus {
+ float value{};
+ float raw_value{};
+ AnalogProperties properties{};
+};
+
+// Button data
+struct ButtonStatus {
+ Common::UUID uuid{};
+ bool value{};
+ bool inverted{};
+ bool toggle{};
+ bool locked{};
+};
+
+// Internal battery data
+using BatteryStatus = BatteryLevel;
+
+// Analog and digital joystick data
+struct StickStatus {
+ Common::UUID uuid{};
+ AnalogStatus x{};
+ AnalogStatus y{};
+ bool left{};
+ bool right{};
+ bool up{};
+ bool down{};
+};
+
+// Analog and digital trigger data
+struct TriggerStatus {
+ Common::UUID uuid{};
+ AnalogStatus analog{};
+ ButtonStatus pressed{};
+};
+
+// 3D vector representing motion input
+struct MotionSensor {
+ AnalogStatus x{};
+ AnalogStatus y{};
+ AnalogStatus z{};
+};
+
+// Motion data used to calculate controller orientation
+struct MotionStatus {
+ // Gyroscope vector measurement in radians/s.
+ MotionSensor gyro{};
+ // Acceleration vector measurement in G force
+ MotionSensor accel{};
+ // Time since last measurement in microseconds
+ u64 delta_timestamp{};
+ // Request to update after reading the value
+ bool force_update{};
+};
+
+// Data of a single point on a touch screen
+struct TouchStatus {
+ ButtonStatus pressed{};
+ AnalogStatus x{};
+ AnalogStatus y{};
+ int id{};
+};
+
+// Physical controller color in RGB format
+struct BodyColorStatus {
+ u32 body{};
+ u32 buttons{};
+};
+
+// HD rumble data
+struct VibrationStatus {
+ f32 low_amplitude{};
+ f32 low_frequency{};
+ f32 high_amplitude{};
+ f32 high_frequency{};
+ VibrationAmplificationType type;
+};
+
+// Physical controller LED pattern
+struct LedStatus {
+ bool led_1{};
+ bool led_2{};
+ bool led_3{};
+ bool led_4{};
+};
+
+// List of buttons to be passed to Qt that can be translated
+enum class ButtonNames {
+ Undefined,
+ Invalid,
+ // This will display the engine name instead of the button name
+ Engine,
+ // This will display the button by value instead of the button name
+ Value,
+ ButtonLeft,
+ ButtonRight,
+ ButtonDown,
+ ButtonUp,
+ TriggerZ,
+ TriggerR,
+ TriggerL,
+ ButtonA,
+ ButtonB,
+ ButtonX,
+ ButtonY,
+ ButtonStart,
+
+ // DS4 button names
+ L1,
+ L2,
+ L3,
+ R1,
+ R2,
+ R3,
+ Circle,
+ Cross,
+ Square,
+ Triangle,
+ Share,
+ Options,
+};
+
+// Callback data consisting of an input type and the equivalent data status
+struct CallbackStatus {
+ InputType type{InputType::None};
+ ButtonStatus button_status{};
+ StickStatus stick_status{};
+ AnalogStatus analog_status{};
+ TriggerStatus trigger_status{};
+ MotionStatus motion_status{};
+ TouchStatus touch_status{};
+ BodyColorStatus color_status{};
+ BatteryStatus battery_status{};
+ VibrationStatus vibration_status{};
+};
+
+// Triggered once every input change
+struct InputCallback {
+ std::function<void(const CallbackStatus&)> on_change;
+};
+
+/// An abstract class template for an input device (a button, an analog input, etc.).
+class InputDevice {
+public:
+ virtual ~InputDevice() = default;
+
+ // Request input device to update if necessary
+ virtual void SoftUpdate() {}
+
+ // Force input device to update data regardless of the current state
+ virtual void ForceUpdate() {}
+
+ // Sets the function to be triggered when input changes
+ void SetCallback(InputCallback callback_) {
+ callback = std::move(callback_);
+ }
+
+ // Triggers the function set in the callback
+ void TriggerOnChange(const CallbackStatus& status) {
+ if (callback.on_change) {
+ callback.on_change(status);
+ }
+ }
+
+private:
+ InputCallback callback;
+};
+
+/// An abstract class template for an output device (rumble, LED pattern, polling mode).
+class OutputDevice {
+public:
+ virtual ~OutputDevice() = default;
+
+ virtual void SetLED([[maybe_unused]] const LedStatus& led_status) {}
+
+ virtual VibrationError SetVibration([[maybe_unused]] const VibrationStatus& vibration_status) {
+ return VibrationError::NotSupported;
+ }
+
+ virtual PollingError SetPollingMode([[maybe_unused]] PollingMode polling_mode) {
+ return PollingError::NotSupported;
+ }
+};
+
+/// An abstract class template for a factory that can create input devices.
+template <typename InputDeviceType>
+class Factory {
+public:
+ virtual ~Factory() = default;
+ virtual std::unique_ptr<InputDeviceType> Create(const Common::ParamPackage&) = 0;
+};
+
+namespace Impl {
+
+template <typename InputDeviceType>
+using FactoryListType = std::unordered_map<std::string, std::shared_ptr<Factory<InputDeviceType>>>;
+
+template <typename InputDeviceType>
+struct FactoryList {
+ static FactoryListType<InputDeviceType> list;
+};
+
+template <typename InputDeviceType>
+FactoryListType<InputDeviceType> FactoryList<InputDeviceType>::list;
+
+} // namespace Impl
+
+/**
+ * Registers an input device factory.
+ * @tparam InputDeviceType the type of input devices the factory can create
+ * @param name the name of the factory. Will be used to match the "engine" parameter when creating
+ * a device
+ * @param factory the factory object to register
+ */
+template <typename InputDeviceType>
+void RegisterFactory(const std::string& name, std::shared_ptr<Factory<InputDeviceType>> factory) {
+ auto pair = std::make_pair(name, std::move(factory));
+ if (!Impl::FactoryList<InputDeviceType>::list.insert(std::move(pair)).second) {
+ LOG_ERROR(Input, "Factory '{}' already registered", name);
+ }
+}
+
+/**
+ * Unregisters an input device factory.
+ * @tparam InputDeviceType the type of input devices the factory can create
+ * @param name the name of the factory to unregister
+ */
+template <typename InputDeviceType>
+void UnregisterFactory(const std::string& name) {
+ if (Impl::FactoryList<InputDeviceType>::list.erase(name) == 0) {
+ LOG_ERROR(Input, "Factory '{}' not registered", name);
+ }
+}
+
+/**
+ * Create an input device from given paramters.
+ * @tparam InputDeviceType the type of input devices to create
+ * @param params a serialized ParamPackage string that contains all parameters for creating the
+ * device
+ */
+template <typename InputDeviceType>
+std::unique_ptr<InputDeviceType> CreateDeviceFromString(const std::string& params) {
+ const Common::ParamPackage package(params);
+ const std::string engine = package.Get("engine", "null");
+ const auto& factory_list = Impl::FactoryList<InputDeviceType>::list;
+ const auto pair = factory_list.find(engine);
+ if (pair == factory_list.end()) {
+ if (engine != "null") {
+ LOG_ERROR(Input, "Unknown engine name: {}", engine);
+ }
+ return std::make_unique<InputDeviceType>();
+ }
+ return pair->second->Create(package);
+}
+
+/**
+ * Create an input device from given paramters.
+ * @tparam InputDeviceType the type of input devices to create
+ * @param A ParamPackage that contains all parameters for creating the device
+ */
+template <typename InputDeviceType>
+std::unique_ptr<InputDeviceType> CreateDevice(const Common::ParamPackage package) {
+ const std::string engine = package.Get("engine", "null");
+ const auto& factory_list = Impl::FactoryList<InputDeviceType>::list;
+ const auto pair = factory_list.find(engine);
+ if (pair == factory_list.end()) {
+ if (engine != "null") {
+ LOG_ERROR(Input, "Unknown engine name: {}", engine);
+ }
+ return std::make_unique<InputDeviceType>();
+ }
+ return pair->second->Create(package);
+}
+
+} // namespace Common::Input
diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp
index 42744c994..b898a652c 100644
--- a/src/common/logging/filter.cpp
+++ b/src/common/logging/filter.cpp
@@ -114,6 +114,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
SUB(Service, NGCT) \
SUB(Service, NIFM) \
SUB(Service, NIM) \
+ SUB(Service, NOTIF) \
SUB(Service, NPNS) \
SUB(Service, NS) \
SUB(Service, NVDRV) \
diff --git a/src/common/logging/types.h b/src/common/logging/types.h
index 2d21fc483..9ed0c7ad6 100644
--- a/src/common/logging/types.h
+++ b/src/common/logging/types.h
@@ -82,6 +82,7 @@ enum class Class : u8 {
Service_NGCT, ///< The NGCT (No Good Content for Terra) service
Service_NIFM, ///< The NIFM (Network interface) service
Service_NIM, ///< The NIM service
+ Service_NOTIF, ///< The NOTIF (Notification) service
Service_NPNS, ///< The NPNS service
Service_NS, ///< The NS services
Service_NVDRV, ///< The NVDRV (Nvidia driver) service
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index 3bcaa072f..6964a8273 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -183,6 +183,7 @@ void RestoreGlobalState(bool is_powered_on) {
values.max_anisotropy.SetGlobal(true);
values.use_speed_limit.SetGlobal(true);
values.speed_limit.SetGlobal(true);
+ values.fps_cap.SetGlobal(true);
values.use_disk_shader_cache.SetGlobal(true);
values.gpu_accuracy.SetGlobal(true);
values.use_asynchronous_gpu_emulation.SetGlobal(true);
diff --git a/src/common/settings.h b/src/common/settings.h
index 42f8b4a7d..313f1fa7f 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -6,7 +6,6 @@
#include <algorithm>
#include <array>
-#include <atomic>
#include <map>
#include <optional>
#include <string>
@@ -525,7 +524,7 @@ struct Values {
Setting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"};
Setting<bool> accelerate_astc{true, "accelerate_astc"};
Setting<bool> use_vsync{true, "use_vsync"};
- BasicRangedSetting<u16> fps_cap{1000, 1, 1000, "fps_cap"};
+ RangedSetting<u16> fps_cap{1000, 1, 1000, "fps_cap"};
BasicSetting<bool> disable_fps_limit{false, "disable_fps_limit"};
RangedSetting<ShaderBackend> shader_backend{ShaderBackend::GLASM, ShaderBackend::GLSL,
ShaderBackend::SPIRV, "shader_backend"};
@@ -560,25 +559,19 @@ struct Values {
Setting<bool> enable_accurate_vibrations{false, "enable_accurate_vibrations"};
Setting<bool> motion_enabled{true, "motion_enabled"};
- BasicSetting<std::string> motion_device{"engine:motion_emu,update_period:100,sensitivity:0.01",
- "motion_device"};
BasicSetting<std::string> udp_input_servers{"127.0.0.1:26760", "udp_input_servers"};
+ BasicSetting<bool> enable_udp_controller{false, "enable_udp_controller"};
BasicSetting<bool> pause_tas_on_load{true, "pause_tas_on_load"};
BasicSetting<bool> tas_enable{false, "tas_enable"};
BasicSetting<bool> tas_loop{false, "tas_loop"};
- BasicSetting<bool> tas_swap_controllers{true, "tas_swap_controllers"};
BasicSetting<bool> mouse_panning{false, "mouse_panning"};
BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"};
BasicSetting<bool> mouse_enabled{false, "mouse_enabled"};
- std::string mouse_device;
- MouseButtonsRaw mouse_buttons;
BasicSetting<bool> emulate_analog_keyboard{false, "emulate_analog_keyboard"};
BasicSetting<bool> keyboard_enabled{false, "keyboard_enabled"};
- KeyboardKeysRaw keyboard_keys;
- KeyboardModsRaw keyboard_mods;
BasicSetting<bool> debug_pad_enabled{false, "debug_pad_enabled"};
ButtonsRaw debug_pad_buttons;
@@ -586,14 +579,11 @@ struct Values {
TouchscreenInput touchscreen;
- BasicSetting<bool> use_touch_from_button{false, "use_touch_from_button"};
BasicSetting<std::string> touch_device{"min_x:100,min_y:50,max_x:1800,max_y:850",
"touch_device"};
BasicSetting<int> touch_from_button_map_index{0, "touch_from_button_map"};
std::vector<TouchFromButtonMap> touch_from_button_maps;
- std::atomic_bool is_device_reload_pending{true};
-
// Data Storage
BasicSetting<bool> use_virtual_sd{true, "use_virtual_sd"};
BasicSetting<bool> gamecard_inserted{false, "gamecard_inserted"};
@@ -614,6 +604,7 @@ struct Values {
BasicSetting<bool> extended_logging{false, "extended_logging"};
BasicSetting<bool> use_debug_asserts{false, "use_debug_asserts"};
BasicSetting<bool> use_auto_stub{false, "use_auto_stub"};
+ BasicSetting<bool> enable_all_controllers{false, "enable_all_controllers"};
// Miscellaneous
BasicSetting<std::string> log_filter{"*:Info", "log_filter"};
diff --git a/src/common/settings_input.h b/src/common/settings_input.h
index 609600582..4ff37e186 100644
--- a/src/common/settings_input.h
+++ b/src/common/settings_input.h
@@ -62,11 +62,22 @@ enum Values : int {
constexpr int STICK_HID_BEGIN = LStick;
constexpr int STICK_HID_END = NumAnalogs;
-constexpr int NUM_STICKS_HID = NumAnalogs;
extern const std::array<const char*, NumAnalogs> mapping;
} // namespace NativeAnalog
+namespace NativeTrigger {
+enum Values : int {
+ LTrigger,
+ RTrigger,
+
+ NumTriggers,
+};
+
+constexpr int TRIGGER_HID_BEGIN = LTrigger;
+constexpr int TRIGGER_HID_END = NumTriggers;
+} // namespace NativeTrigger
+
namespace NativeVibration {
enum Values : int {
LeftVibrationDevice,
@@ -115,10 +126,20 @@ constexpr int NUM_MOUSE_HID = NumMouseButtons;
extern const std::array<const char*, NumMouseButtons> mapping;
} // namespace NativeMouseButton
+namespace NativeMouseWheel {
+enum Values {
+ X,
+ Y,
+
+ NumMouseWheels,
+};
+
+extern const std::array<const char*, NumMouseWheels> mapping;
+} // namespace NativeMouseWheel
+
namespace NativeKeyboard {
enum Keys {
None,
- Error,
A = 4,
B,
@@ -156,22 +177,22 @@ enum Keys {
N8,
N9,
N0,
- Enter,
+ Return,
Escape,
Backspace,
Tab,
Space,
Minus,
- Equal,
- LeftBrace,
- RightBrace,
- Backslash,
+ Plus,
+ OpenBracket,
+ CloseBracket,
+ Pipe,
Tilde,
Semicolon,
- Apostrophe,
- Grave,
+ Quote,
+ Backquote,
Comma,
- Dot,
+ Period,
Slash,
CapsLockKey,
@@ -188,7 +209,7 @@ enum Keys {
F11,
F12,
- SystemRequest,
+ PrintScreen,
ScrollLockKey,
Pause,
Insert,
@@ -257,8 +278,18 @@ enum Keys {
ScrollLockActive,
KPComma,
- KPLeftParenthesis,
- KPRightParenthesis,
+ Ro = 0x87,
+ KatakanaHiragana,
+ Yen,
+ Henkan,
+ Muhenkan,
+ NumPadCommaPc98,
+
+ HangulEnglish = 0x90,
+ Hanja,
+ KatakanaKey,
+ HiraganaKey,
+ ZenkakuHankaku,
LeftControlKey = 0xE0,
LeftShiftKey,
@@ -307,6 +338,8 @@ enum Modifiers {
CapsLock,
ScrollLock,
NumLock,
+ Katakana,
+ Hiragana,
NumKeyboardMods,
};
@@ -324,11 +357,6 @@ constexpr int NUM_KEYBOARD_MODS_HID = NumKeyboardMods;
using AnalogsRaw = std::array<std::string, NativeAnalog::NumAnalogs>;
using ButtonsRaw = std::array<std::string, NativeButton::NumButtons>;
using MotionsRaw = std::array<std::string, NativeMotion::NumMotions>;
-using VibrationsRaw = std::array<std::string, NativeVibration::NumVibrations>;
-
-using MouseButtonsRaw = std::array<std::string, NativeMouseButton::NumMouseButtons>;
-using KeyboardKeysRaw = std::array<std::string, NativeKeyboard::NumKeyboardKeys>;
-using KeyboardModsRaw = std::array<std::string, NativeKeyboard::NumKeyboardMods>;
constexpr u32 JOYCON_BODY_NEON_RED = 0xFF3C28;
constexpr u32 JOYCON_BUTTONS_NEON_RED = 0x1E0A0A;
@@ -342,6 +370,11 @@ enum class ControllerType {
RightJoycon,
Handheld,
GameCube,
+ Pokeball,
+ NES,
+ SNES,
+ N64,
+ SegaGenesis,
};
struct PlayerInput {
@@ -349,7 +382,6 @@ struct PlayerInput {
ControllerType controller_type;
ButtonsRaw buttons;
AnalogsRaw analogs;
- VibrationsRaw vibrations;
MotionsRaw motions;
bool vibration_enabled;
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index fccd2eee5..fbeacc7e2 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -71,9 +71,6 @@ static CPUCaps Detect() {
else
caps.manufacturer = Manufacturer::Unknown;
- u32 family = {};
- u32 model = {};
-
__cpuid(cpu_id, 0x80000000);
u32 max_ex_fn = cpu_id[0];
@@ -84,15 +81,6 @@ static CPUCaps Detect() {
// Detect family and other miscellaneous features
if (max_std_fn >= 1) {
__cpuid(cpu_id, 0x00000001);
- family = (cpu_id[0] >> 8) & 0xf;
- model = (cpu_id[0] >> 4) & 0xf;
- if (family == 0xf) {
- family += (cpu_id[0] >> 20) & 0xff;
- }
- if (family >= 6) {
- model += ((cpu_id[0] >> 16) & 0xf) << 4;
- }
-
if ((cpu_id[3] >> 25) & 1)
caps.sse = true;
if ((cpu_id[3] >> 26) & 1)
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp
index 87de40624..82ee2c8a1 100644
--- a/src/common/x64/native_clock.cpp
+++ b/src/common/x64/native_clock.cpp
@@ -15,26 +15,26 @@
namespace Common {
u64 EstimateRDTSCFrequency() {
- const auto milli_10 = std::chrono::milliseconds{10};
- // get current time
+ // Discard the first result measuring the rdtsc.
_mm_mfence();
- const u64 tscStart = __rdtsc();
- const auto startTime = std::chrono::high_resolution_clock::now();
- // wait roughly 3 seconds
- while (true) {
- auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(
- std::chrono::high_resolution_clock::now() - startTime);
- if (milli.count() >= 3000)
- break;
- std::this_thread::sleep_for(milli_10);
- }
- const auto endTime = std::chrono::high_resolution_clock::now();
+ __rdtsc();
+ std::this_thread::sleep_for(std::chrono::milliseconds{1});
+ _mm_mfence();
+ __rdtsc();
+
+ // Get the current time.
+ const auto start_time = std::chrono::steady_clock::now();
+ _mm_mfence();
+ const u64 tsc_start = __rdtsc();
+ // Wait for 200 milliseconds.
+ std::this_thread::sleep_for(std::chrono::milliseconds{200});
+ const auto end_time = std::chrono::steady_clock::now();
_mm_mfence();
- const u64 tscEnd = __rdtsc();
- // calculate difference
- const u64 timer_diff =
- std::chrono::duration_cast<std::chrono::nanoseconds>(endTime - startTime).count();
- const u64 tsc_diff = tscEnd - tscStart;
+ const u64 tsc_end = __rdtsc();
+ // Calculate differences.
+ const u64 timer_diff = static_cast<u64>(
+ std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time).count());
+ const u64 tsc_diff = tsc_end - tsc_start;
const u64 tsc_freq = MultiplyAndDivide64(tsc_diff, 1000000000ULL, timer_diff);
return tsc_freq;
}
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 9f0fbba2d..49bed614a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -132,11 +132,23 @@ add_library(core STATIC
frontend/emu_window.h
frontend/framebuffer_layout.cpp
frontend/framebuffer_layout.h
- frontend/input_interpreter.cpp
- frontend/input_interpreter.h
- frontend/input.h
hardware_interrupt_manager.cpp
hardware_interrupt_manager.h
+ hid/emulated_console.cpp
+ hid/emulated_console.h
+ hid/emulated_controller.cpp
+ hid/emulated_controller.h
+ hid/emulated_devices.cpp
+ hid/emulated_devices.h
+ hid/hid_core.cpp
+ hid/hid_core.h
+ hid/hid_types.h
+ hid/input_converter.cpp
+ hid/input_converter.h
+ hid/input_interpreter.cpp
+ hid/input_interpreter.h
+ hid/motion_input.cpp
+ hid/motion_input.h
hle/api_version.h
hle/ipc.h
hle/ipc_helpers.h
@@ -167,12 +179,15 @@ add_library(core STATIC
hle/kernel/k_client_port.h
hle/kernel/k_client_session.cpp
hle/kernel/k_client_session.h
+ hle/kernel/k_code_memory.cpp
+ hle/kernel/k_code_memory.h
hle/kernel/k_condition_variable.cpp
hle/kernel/k_condition_variable.h
hle/kernel/k_event.cpp
hle/kernel/k_event.h
hle/kernel/k_handle_table.cpp
hle/kernel/k_handle_table.h
+ hle/kernel/k_light_condition_variable.cpp
hle/kernel/k_light_condition_variable.h
hle/kernel/k_light_lock.cpp
hle/kernel/k_light_lock.h
@@ -225,6 +240,7 @@ add_library(core STATIC
hle/kernel/k_system_control.h
hle/kernel/k_thread.cpp
hle/kernel/k_thread.h
+ hle/kernel/k_thread_queue.cpp
hle/kernel/k_thread_queue.h
hle/kernel/k_trace.h
hle/kernel/k_transfer_memory.cpp
@@ -396,12 +412,15 @@ add_library(core STATIC
hle/service/glue/glue.h
hle/service/glue/glue_manager.cpp
hle/service/glue/glue_manager.h
+ hle/service/glue/notif.cpp
+ hle/service/glue/notif.h
hle/service/grc/grc.cpp
hle/service/grc/grc.h
hle/service/hid/hid.cpp
hle/service/hid/hid.h
hle/service/hid/irs.cpp
hle/service/hid/irs.h
+ hle/service/hid/ring_lifo.h
hle/service/hid/xcd.cpp
hle/service/hid/xcd.h
hle/service/hid/errors.h
@@ -466,6 +485,8 @@ add_library(core STATIC
hle/service/ns/language.h
hle/service/ns/ns.cpp
hle/service/ns/ns.h
+ hle/service/ns/pdm_qry.cpp
+ hle/service/ns/pdm_qry.h
hle/service/ns/pl_u.cpp
hle/service/ns/pl_u.h
hle/service/nvdrv/devices/nvdevice.h
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index 4e73cc03a..56836bd05 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -86,6 +86,26 @@ public:
num_instructions, MemoryReadCode(pc));
}
+ void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op,
+ VAddr value) override {
+ switch (op) {
+ case Dynarmic::A64::InstructionCacheOperation::InvalidateByVAToPoU: {
+ static constexpr u64 ICACHE_LINE_SIZE = 64;
+
+ const u64 cache_line_start = value & ~(ICACHE_LINE_SIZE - 1);
+ parent.InvalidateCacheRange(cache_line_start, ICACHE_LINE_SIZE);
+ break;
+ }
+ case Dynarmic::A64::InstructionCacheOperation::InvalidateAllToPoU:
+ parent.ClearInstructionCache();
+ break;
+ case Dynarmic::A64::InstructionCacheOperation::InvalidateAllToPoUInnerSharable:
+ default:
+ LOG_DEBUG(Core_ARM, "Unprocesseed instruction cache operation: {}", op);
+ break;
+ }
+ }
+
void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override {
switch (exception) {
case Dynarmic::A64::Exception::WaitForInterrupt:
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 07448fd29..aa96f709b 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -27,6 +27,7 @@
#include "core/file_sys/vfs_concat.h"
#include "core/file_sys/vfs_real.h"
#include "core/hardware_interrupt_manager.h"
+#include "core/hid/hid_core.h"
#include "core/hle/kernel/k_process.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/kernel.h"
@@ -126,7 +127,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
struct System::Impl {
explicit Impl(System& system)
- : kernel{system}, fs_controller{system}, memory{system},
+ : kernel{system}, fs_controller{system}, memory{system}, hid_core{},
cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system} {}
SystemResultStatus Run() {
@@ -391,6 +392,7 @@ struct System::Impl {
std::unique_ptr<Hardware::InterruptManager> interrupt_manager;
std::unique_ptr<Core::DeviceMemory> device_memory;
Core::Memory::Memory memory;
+ Core::HID::HIDCore hid_core;
CpuManager cpu_manager;
std::atomic_bool is_powered_on{};
bool exit_lock = false;
@@ -519,12 +521,6 @@ const ARM_Interface& System::CurrentArmInterface() const {
return impl->kernel.CurrentPhysicalCore().ArmInterface();
}
-std::size_t System::CurrentCoreIndex() const {
- std::size_t core = impl->kernel.GetCurrentHostThreadID();
- ASSERT(core < Core::Hardware::NUM_CPU_CORES);
- return core;
-}
-
Kernel::PhysicalCore& System::CurrentPhysicalCore() {
return impl->kernel.CurrentPhysicalCore();
}
@@ -615,6 +611,14 @@ const Kernel::KernelCore& System::Kernel() const {
return impl->kernel;
}
+HID::HIDCore& System::HIDCore() {
+ return impl->hid_core;
+}
+
+const HID::HIDCore& System::HIDCore() const {
+ return impl->hid_core;
+}
+
Timing::CoreTiming& System::CoreTiming() {
return impl->core_timing;
}
@@ -825,8 +829,6 @@ void System::ApplySettings() {
if (IsPoweredOn()) {
Renderer().RefreshBaseSettings();
}
-
- Service::HID::ReloadInputDevices();
}
} // namespace Core
diff --git a/src/core/core.h b/src/core/core.h
index 01bc0a2c7..52ff90359 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -89,6 +89,10 @@ namespace Core::Hardware {
class InterruptManager;
}
+namespace Core::HID {
+class HIDCore;
+}
+
namespace Core {
class ARM_Interface;
@@ -204,9 +208,6 @@ public:
/// Gets an ARM interface to the CPU core that is currently running
[[nodiscard]] const ARM_Interface& CurrentArmInterface() const;
- /// Gets the index of the currently running CPU core
- [[nodiscard]] std::size_t CurrentCoreIndex() const;
-
/// Gets the physical core for the CPU core that is currently running
[[nodiscard]] Kernel::PhysicalCore& CurrentPhysicalCore();
@@ -285,6 +286,12 @@ public:
/// Provides a constant reference to the kernel instance.
[[nodiscard]] const Kernel::KernelCore& Kernel() const;
+ /// Gets a mutable reference to the HID interface.
+ [[nodiscard]] HID::HIDCore& HIDCore();
+
+ /// Gets an immutable reference to the HID interface.
+ [[nodiscard]] const HID::HIDCore& HIDCore() const;
+
/// Provides a reference to the internal PerfStats instance.
[[nodiscard]] Core::PerfStats& GetPerfStats();
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index 5d43c6e5d..cbcc54891 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -117,17 +117,18 @@ void CpuManager::MultiCoreRunGuestLoop() {
physical_core = &kernel.CurrentPhysicalCore();
}
system.ExitDynarmicProfile();
- physical_core->ArmInterface().ClearExclusiveState();
- kernel.CurrentScheduler()->RescheduleCurrentCore();
+ {
+ Kernel::KScopedDisableDispatch dd(kernel);
+ physical_core->ArmInterface().ClearExclusiveState();
+ }
}
}
void CpuManager::MultiCoreRunIdleThread() {
auto& kernel = system.Kernel();
while (true) {
- auto& physical_core = kernel.CurrentPhysicalCore();
- physical_core.Idle();
- kernel.CurrentScheduler()->RescheduleCurrentCore();
+ Kernel::KScopedDisableDispatch dd(kernel);
+ kernel.CurrentPhysicalCore().Idle();
}
}
@@ -135,12 +136,12 @@ void CpuManager::MultiCoreRunSuspendThread() {
auto& kernel = system.Kernel();
kernel.CurrentScheduler()->OnThreadStart();
while (true) {
- auto core = kernel.GetCurrentHostThreadID();
+ auto core = kernel.CurrentPhysicalCoreIndex();
auto& scheduler = *kernel.CurrentScheduler();
Kernel::KThread* current_thread = scheduler.GetCurrentThread();
Common::Fiber::YieldTo(current_thread->GetHostContext(), *core_data[core].host_context);
ASSERT(scheduler.ContextSwitchPending());
- ASSERT(core == kernel.GetCurrentHostThreadID());
+ ASSERT(core == kernel.CurrentPhysicalCoreIndex());
scheduler.RescheduleCurrentCore();
}
}
@@ -346,13 +347,9 @@ void CpuManager::RunThread(std::stop_token stop_token, std::size_t core) {
sc_sync_first_use = false;
}
- // Abort if emulation was killed before the session really starts
- if (!system.IsPoweredOn()) {
- return;
- }
-
+ // Emulation was stopped
if (stop_token.stop_requested()) {
- break;
+ return;
}
auto current_thread = system.Kernel().CurrentScheduler()->GetCurrentThread();
diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp
index 03bbedf8b..6dbd38ffa 100644
--- a/src/core/frontend/applets/controller.cpp
+++ b/src/core/frontend/applets/controller.cpp
@@ -5,16 +5,15 @@
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/frontend/applets/controller.h"
-#include "core/hle/service/hid/controllers/npad.h"
-#include "core/hle/service/hid/hid.h"
-#include "core/hle/service/sm/sm.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
namespace Core::Frontend {
ControllerApplet::~ControllerApplet() = default;
-DefaultControllerApplet::DefaultControllerApplet(Service::SM::ServiceManager& service_manager_)
- : service_manager{service_manager_} {}
+DefaultControllerApplet::DefaultControllerApplet(HID::HIDCore& hid_core_) : hid_core{hid_core_} {}
DefaultControllerApplet::~DefaultControllerApplet() = default;
@@ -22,24 +21,20 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb
const ControllerParameters& parameters) const {
LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!");
- auto& npad =
- service_manager.GetService<Service::HID::Hid>("hid")
- ->GetAppletResource()
- ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad);
-
- auto& players = Settings::values.players.GetValue();
-
const std::size_t min_supported_players =
parameters.enable_single_mode ? 1 : parameters.min_players;
// Disconnect Handheld first.
- npad.DisconnectNpadAtIndex(8);
+ auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ handheld->Disconnect();
// Deduce the best configuration based on the input parameters.
- for (std::size_t index = 0; index < players.size() - 2; ++index) {
+ for (std::size_t index = 0; index < hid_core.available_controllers - 2; ++index) {
+ auto* controller = hid_core.GetEmulatedControllerByIndex(index);
+
// First, disconnect all controllers regardless of the value of keep_controllers_connected.
// This makes it easy to connect the desired controllers.
- npad.DisconnectNpadAtIndex(index);
+ controller->Disconnect();
// Only connect the minimum number of required players.
if (index >= min_supported_players) {
@@ -49,27 +44,27 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb
// Connect controllers based on the following priority list from highest to lowest priority:
// Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld
if (parameters.allow_pro_controller) {
- npad.AddNewControllerAt(
- npad.MapSettingsTypeToNPad(Settings::ControllerType::ProController), index);
+ controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController);
+ controller->Connect();
} else if (parameters.allow_dual_joycons) {
- npad.AddNewControllerAt(
- npad.MapSettingsTypeToNPad(Settings::ControllerType::DualJoyconDetached), index);
+ controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::JoyconDual);
+ controller->Connect();
} else if (parameters.allow_left_joycon && parameters.allow_right_joycon) {
// Assign left joycons to even player indices and right joycons to odd player indices.
// We do this since Captain Toad Treasure Tracker expects a left joycon for Player 1 and
// a right Joycon for Player 2 in 2 Player Assist mode.
if (index % 2 == 0) {
- npad.AddNewControllerAt(
- npad.MapSettingsTypeToNPad(Settings::ControllerType::LeftJoycon), index);
+ controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::JoyconLeft);
+ controller->Connect();
} else {
- npad.AddNewControllerAt(
- npad.MapSettingsTypeToNPad(Settings::ControllerType::RightJoycon), index);
+ controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::JoyconRight);
+ controller->Connect();
}
} else if (index == 0 && parameters.enable_single_mode && parameters.allow_handheld &&
!Settings::values.use_docked_mode.GetValue()) {
// We should *never* reach here under any normal circumstances.
- npad.AddNewControllerAt(npad.MapSettingsTypeToNPad(Settings::ControllerType::Handheld),
- index);
+ controller->SetNpadStyleIndex(Core::HID::NpadStyleIndex::Handheld);
+ controller->Connect();
} else {
UNREACHABLE_MSG("Unable to add a new controller based on the given parameters!");
}
diff --git a/src/core/frontend/applets/controller.h b/src/core/frontend/applets/controller.h
index b0626a0f9..014bc8901 100644
--- a/src/core/frontend/applets/controller.h
+++ b/src/core/frontend/applets/controller.h
@@ -8,8 +8,8 @@
#include "common/common_types.h"
-namespace Service::SM {
-class ServiceManager;
+namespace Core::HID {
+class HIDCore;
}
namespace Core::Frontend {
@@ -44,14 +44,14 @@ public:
class DefaultControllerApplet final : public ControllerApplet {
public:
- explicit DefaultControllerApplet(Service::SM::ServiceManager& service_manager_);
+ explicit DefaultControllerApplet(HID::HIDCore& hid_core_);
~DefaultControllerApplet() override;
void ReconfigureControllers(std::function<void()> callback,
const ControllerParameters& parameters) const override;
private:
- Service::SM::ServiceManager& service_manager;
+ HID::HIDCore& hid_core;
};
} // namespace Core::Frontend
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index e1f7e5886..57c6ffc43 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -3,87 +3,23 @@
// Refer to the license.txt file included.
#include <mutex>
-#include "common/settings.h"
#include "core/frontend/emu_window.h"
-#include "core/frontend/input.h"
namespace Core::Frontend {
GraphicsContext::~GraphicsContext() = default;
-class EmuWindow::TouchState : public Input::Factory<Input::TouchDevice>,
- public std::enable_shared_from_this<TouchState> {
-public:
- std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage&) override {
- return std::make_unique<Device>(shared_from_this());
- }
-
- std::mutex mutex;
-
- Input::TouchStatus status;
-
-private:
- class Device : public Input::TouchDevice {
- public:
- explicit Device(std::weak_ptr<TouchState>&& touch_state_) : touch_state(touch_state_) {}
- Input::TouchStatus GetStatus() const override {
- if (auto state = touch_state.lock()) {
- std::lock_guard guard{state->mutex};
- return state->status;
- }
- return {};
- }
-
- private:
- std::weak_ptr<TouchState> touch_state;
- };
-};
-
EmuWindow::EmuWindow() {
// TODO: Find a better place to set this.
config.min_client_area_size =
std::make_pair(Layout::MinimumSize::Width, Layout::MinimumSize::Height);
active_config = config;
- touch_state = std::make_shared<TouchState>();
- Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state);
-}
-
-EmuWindow::~EmuWindow() {
- Input::UnregisterFactory<Input::TouchDevice>("emu_window");
-}
-
-/**
- * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout
- * @param layout FramebufferLayout object describing the framebuffer size and screen positions
- * @param framebuffer_x Framebuffer x-coordinate to check
- * @param framebuffer_y Framebuffer y-coordinate to check
- * @return True if the coordinates are within the touchpad, otherwise false
- */
-static bool IsWithinTouchscreen(const Layout::FramebufferLayout& layout, u32 framebuffer_x,
- u32 framebuffer_y) {
- return (framebuffer_y >= layout.screen.top && framebuffer_y < layout.screen.bottom &&
- framebuffer_x >= layout.screen.left && framebuffer_x < layout.screen.right);
-}
-
-std::pair<u32, u32> EmuWindow::ClipToTouchScreen(u32 new_x, u32 new_y) const {
- new_x = std::max(new_x, framebuffer_layout.screen.left);
- new_x = std::min(new_x, framebuffer_layout.screen.right - 1);
-
- new_y = std::max(new_y, framebuffer_layout.screen.top);
- new_y = std::min(new_y, framebuffer_layout.screen.bottom - 1);
-
- return std::make_pair(new_x, new_y);
}
-void EmuWindow::TouchPressed(u32 framebuffer_x, u32 framebuffer_y, size_t id) {
- if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) {
- return;
- }
- if (id >= touch_state->status.size()) {
- return;
- }
+EmuWindow::~EmuWindow() {}
- std::lock_guard guard{touch_state->mutex};
+std::pair<f32, f32> EmuWindow::MapToTouchScreen(u32 framebuffer_x, u32 framebuffer_y) const {
+ std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y);
const float x =
static_cast<float>(framebuffer_x - framebuffer_layout.screen.left) /
static_cast<float>(framebuffer_layout.screen.right - framebuffer_layout.screen.left);
@@ -91,31 +27,17 @@ void EmuWindow::TouchPressed(u32 framebuffer_x, u32 framebuffer_y, size_t id) {
static_cast<float>(framebuffer_y - framebuffer_layout.screen.top) /
static_cast<float>(framebuffer_layout.screen.bottom - framebuffer_layout.screen.top);
- touch_state->status[id] = std::make_tuple(x, y, true);
-}
-
-void EmuWindow::TouchReleased(size_t id) {
- if (id >= touch_state->status.size()) {
- return;
- }
- std::lock_guard guard{touch_state->mutex};
- touch_state->status[id] = std::make_tuple(0.0f, 0.0f, false);
+ return std::make_pair(x, y);
}
-void EmuWindow::TouchMoved(u32 framebuffer_x, u32 framebuffer_y, size_t id) {
- if (id >= touch_state->status.size()) {
- return;
- }
-
- if (!std::get<2>(touch_state->status[id])) {
- return;
- }
+std::pair<u32, u32> EmuWindow::ClipToTouchScreen(u32 new_x, u32 new_y) const {
+ new_x = std::max(new_x, framebuffer_layout.screen.left);
+ new_x = std::min(new_x, framebuffer_layout.screen.right - 1);
- if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) {
- std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y);
- }
+ new_y = std::max(new_y, framebuffer_layout.screen.top);
+ new_y = std::min(new_y, framebuffer_layout.screen.bottom - 1);
- TouchPressed(framebuffer_x, framebuffer_y, id);
+ return std::make_pair(new_x, new_y);
}
void EmuWindow::UpdateCurrentFramebufferLayout(u32 width, u32 height) {
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h
index 8a86a1d27..e413a520a 100644
--- a/src/core/frontend/emu_window.h
+++ b/src/core/frontend/emu_window.h
@@ -113,28 +113,6 @@ public:
virtual bool IsShown() const = 0;
/**
- * Signal that a touch pressed event has occurred (e.g. mouse click pressed)
- * @param framebuffer_x Framebuffer x-coordinate that was pressed
- * @param framebuffer_y Framebuffer y-coordinate that was pressed
- * @param id Touch event ID
- */
- void TouchPressed(u32 framebuffer_x, u32 framebuffer_y, size_t id);
-
- /**
- * Signal that a touch released event has occurred (e.g. mouse click released)
- * @param id Touch event ID
- */
- void TouchReleased(size_t id);
-
- /**
- * Signal that a touch movement event has occurred (e.g. mouse was moved over the emu window)
- * @param framebuffer_x Framebuffer x-coordinate
- * @param framebuffer_y Framebuffer y-coordinate
- * @param id Touch event ID
- */
- void TouchMoved(u32 framebuffer_x, u32 framebuffer_y, size_t id);
-
- /**
* Returns currently active configuration.
* @note Accesses to the returned object need not be consistent because it may be modified in
* another thread
@@ -212,6 +190,11 @@ protected:
client_area_height = size.second;
}
+ /**
+ * Converts a screen postion into the equivalent touchscreen position.
+ */
+ std::pair<f32, f32> MapToTouchScreen(u32 framebuffer_x, u32 framebuffer_y) const;
+
WindowSystemInfo window_info;
private:
@@ -237,9 +220,6 @@ private:
WindowConfig config; ///< Internal configuration (changes pending for being applied in
/// ProcessConfigurationChanges)
WindowConfig active_config; ///< Internal active configuration
-
- class TouchState;
- std::shared_ptr<TouchState> touch_state;
};
} // namespace Core::Frontend
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp
index 4b58b672a..26a5b12aa 100644
--- a/src/core/frontend/framebuffer_layout.cpp
+++ b/src/core/frontend/framebuffer_layout.cpp
@@ -25,7 +25,12 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) {
ASSERT(height > 0);
// The drawing code needs at least somewhat valid values for both screens
// so just calculate them both even if the other isn't showing.
- FramebufferLayout res{width, height, false, {}};
+ FramebufferLayout res{
+ .width = width,
+ .height = height,
+ .screen = {},
+ .is_srgb = false,
+ };
const float window_aspect_ratio = static_cast<float>(height) / static_cast<float>(width);
const float emulation_aspect_ratio = EmulationAspectRatio(
diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h
index 2e36c0163..8e341e4e2 100644
--- a/src/core/frontend/framebuffer_layout.h
+++ b/src/core/frontend/framebuffer_layout.h
@@ -35,17 +35,8 @@ enum class AspectRatio {
struct FramebufferLayout {
u32 width{ScreenUndocked::Width};
u32 height{ScreenUndocked::Height};
- bool is_srgb{};
-
Common::Rectangle<u32> screen;
-
- /**
- * Returns the ration of pixel size of the screen, compared to the native size of the undocked
- * Switch screen.
- */
- float GetScalingRatio() const {
- return static_cast<float>(screen.GetWidth()) / ScreenUndocked::Width;
- }
+ bool is_srgb{};
};
/**
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h
deleted file mode 100644
index f1747c5b2..000000000
--- a/src/core/frontend/input.h
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright 2017 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <functional>
-#include <memory>
-#include <string>
-#include <tuple>
-#include <unordered_map>
-#include <utility>
-#include "common/logging/log.h"
-#include "common/param_package.h"
-#include "common/quaternion.h"
-#include "common/vector_math.h"
-
-namespace Input {
-
-enum class AnalogDirection : u8 {
- RIGHT,
- LEFT,
- UP,
- DOWN,
-};
-struct AnalogProperties {
- float deadzone;
- float range;
- float threshold;
-};
-template <typename StatusType>
-struct InputCallback {
- std::function<void(StatusType)> on_change;
-};
-
-/// An abstract class template for an input device (a button, an analog input, etc.).
-template <typename StatusType>
-class InputDevice {
-public:
- virtual ~InputDevice() = default;
- virtual StatusType GetStatus() const {
- return {};
- }
- virtual StatusType GetRawStatus() const {
- return GetStatus();
- }
- virtual AnalogProperties GetAnalogProperties() const {
- return {};
- }
- virtual bool GetAnalogDirectionStatus([[maybe_unused]] AnalogDirection direction) const {
- return {};
- }
- virtual bool SetRumblePlay([[maybe_unused]] f32 amp_low, [[maybe_unused]] f32 freq_low,
- [[maybe_unused]] f32 amp_high,
- [[maybe_unused]] f32 freq_high) const {
- return {};
- }
- void SetCallback(InputCallback<StatusType> callback_) {
- callback = std::move(callback_);
- }
- void TriggerOnChange() {
- if (callback.on_change) {
- callback.on_change(GetStatus());
- }
- }
-
-private:
- InputCallback<StatusType> callback;
-};
-
-/// An abstract class template for a factory that can create input devices.
-template <typename InputDeviceType>
-class Factory {
-public:
- virtual ~Factory() = default;
- virtual std::unique_ptr<InputDeviceType> Create(const Common::ParamPackage&) = 0;
-};
-
-namespace Impl {
-
-template <typename InputDeviceType>
-using FactoryListType = std::unordered_map<std::string, std::shared_ptr<Factory<InputDeviceType>>>;
-
-template <typename InputDeviceType>
-struct FactoryList {
- static FactoryListType<InputDeviceType> list;
-};
-
-template <typename InputDeviceType>
-FactoryListType<InputDeviceType> FactoryList<InputDeviceType>::list;
-
-} // namespace Impl
-
-/**
- * Registers an input device factory.
- * @tparam InputDeviceType the type of input devices the factory can create
- * @param name the name of the factory. Will be used to match the "engine" parameter when creating
- * a device
- * @param factory the factory object to register
- */
-template <typename InputDeviceType>
-void RegisterFactory(const std::string& name, std::shared_ptr<Factory<InputDeviceType>> factory) {
- auto pair = std::make_pair(name, std::move(factory));
- if (!Impl::FactoryList<InputDeviceType>::list.insert(std::move(pair)).second) {
- LOG_ERROR(Input, "Factory '{}' already registered", name);
- }
-}
-
-/**
- * Unregisters an input device factory.
- * @tparam InputDeviceType the type of input devices the factory can create
- * @param name the name of the factory to unregister
- */
-template <typename InputDeviceType>
-void UnregisterFactory(const std::string& name) {
- if (Impl::FactoryList<InputDeviceType>::list.erase(name) == 0) {
- LOG_ERROR(Input, "Factory '{}' not registered", name);
- }
-}
-
-/**
- * Create an input device from given paramters.
- * @tparam InputDeviceType the type of input devices to create
- * @param params a serialized ParamPackage string contains all parameters for creating the device
- */
-template <typename InputDeviceType>
-std::unique_ptr<InputDeviceType> CreateDevice(const std::string& params) {
- const Common::ParamPackage package(params);
- const std::string engine = package.Get("engine", "null");
- const auto& factory_list = Impl::FactoryList<InputDeviceType>::list;
- const auto pair = factory_list.find(engine);
- if (pair == factory_list.end()) {
- if (engine != "null") {
- LOG_ERROR(Input, "Unknown engine name: {}", engine);
- }
- return std::make_unique<InputDeviceType>();
- }
- return pair->second->Create(package);
-}
-
-/**
- * A button device is an input device that returns bool as status.
- * true for pressed; false for released.
- */
-using ButtonDevice = InputDevice<bool>;
-
-/**
- * An analog device is an input device that returns a tuple of x and y coordinates as status. The
- * coordinates are within the unit circle. x+ is defined as right direction, and y+ is defined as up
- * direction
- */
-using AnalogDevice = InputDevice<std::tuple<float, float>>;
-
-/**
- * A vibration device is an input device that returns an unsigned byte as status.
- * It represents whether the vibration device supports vibration or not.
- * If the status returns 1, it supports vibration. Otherwise, it does not support vibration.
- */
-using VibrationDevice = InputDevice<u8>;
-
-/**
- * A motion status is an object that returns a tuple of accelerometer state vector,
- * gyroscope state vector, rotation state vector, orientation state matrix and quaterion state
- * vector.
- *
- * For both 3D vectors:
- * x+ is the same direction as RIGHT on D-pad.
- * y+ is normal to the touch screen, pointing outward.
- * z+ is the same direction as UP on D-pad.
- *
- * For accelerometer state vector
- * Units: g (gravitational acceleration)
- *
- * For gyroscope state vector:
- * Orientation is determined by right-hand rule.
- * Units: deg/sec
- *
- * For rotation state vector
- * Units: rotations
- *
- * For orientation state matrix
- * x vector
- * y vector
- * z vector
- *
- * For quaternion state vector
- * xyz vector
- * w float
- */
-using MotionStatus = std::tuple<Common::Vec3<float>, Common::Vec3<float>, Common::Vec3<float>,
- std::array<Common::Vec3f, 3>, Common::Quaternion<f32>>;
-
-/**
- * A motion device is an input device that returns a motion status object
- */
-using MotionDevice = InputDevice<MotionStatus>;
-
-/**
- * A touch status is an object that returns an array of 16 tuple elements of two floats and a bool.
- * The floats are x and y coordinates in the range 0.0 - 1.0, and the bool indicates whether it is
- * pressed.
- */
-using TouchStatus = std::array<std::tuple<float, float, bool>, 16>;
-
-/**
- * A touch device is an input device that returns a touch status object
- */
-using TouchDevice = InputDevice<TouchStatus>;
-
-/**
- * A mouse device is an input device that returns a tuple of two floats and four ints.
- * The first two floats are X and Y device coordinates of the mouse (from 0-1).
- * The s32s are the mouse wheel.
- */
-using MouseDevice = InputDevice<std::tuple<float, float, s32, s32>>;
-
-} // namespace Input
diff --git a/src/core/hid/emulated_console.cpp b/src/core/hid/emulated_console.cpp
new file mode 100644
index 000000000..685ec080c
--- /dev/null
+++ b/src/core/hid/emulated_console.cpp
@@ -0,0 +1,232 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/settings.h"
+#include "core/hid/emulated_console.h"
+#include "core/hid/input_converter.h"
+
+namespace Core::HID {
+EmulatedConsole::EmulatedConsole() = default;
+
+EmulatedConsole::~EmulatedConsole() = default;
+
+void EmulatedConsole::ReloadFromSettings() {
+ // Using first motion device from player 1. No need to assign any unique config at the moment
+ const auto& player = Settings::values.players.GetValue()[0];
+ motion_params = Common::ParamPackage(player.motions[0]);
+
+ ReloadInput();
+}
+
+void EmulatedConsole::SetTouchParams() {
+ // TODO(german77): Support any number of fingers
+ std::size_t index = 0;
+
+ // Hardcode mouse, touchscreen and cemuhook parameters
+ if (!Settings::values.mouse_enabled) {
+ // We can't use mouse as touch if native mouse is enabled
+ touch_params[index++] = Common::ParamPackage{"engine:mouse,axis_x:10,axis_y:11,button:0"};
+ }
+ touch_params[index++] = Common::ParamPackage{"engine:touch,axis_x:0,axis_y:1,button:0"};
+ touch_params[index++] = Common::ParamPackage{"engine:touch,axis_x:2,axis_y:3,button:1"};
+ touch_params[index++] =
+ Common::ParamPackage{"engine:cemuhookudp,axis_x:17,axis_y:18,button:65536"};
+ touch_params[index++] =
+ Common::ParamPackage{"engine:cemuhookudp,axis_x:19,axis_y:20,button:131072"};
+
+ const auto button_index =
+ static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue());
+ const auto& touch_buttons = Settings::values.touch_from_button_maps[button_index].buttons;
+
+ // Map the rest of the fingers from touch from button configuration
+ for (const auto& config_entry : touch_buttons) {
+ if (index >= touch_params.size()) {
+ continue;
+ }
+ Common::ParamPackage params{config_entry};
+ Common::ParamPackage touch_button_params;
+ const int x = params.Get("x", 0);
+ const int y = params.Get("y", 0);
+ params.Erase("x");
+ params.Erase("y");
+ touch_button_params.Set("engine", "touch_from_button");
+ touch_button_params.Set("button", params.Serialize());
+ touch_button_params.Set("x", x);
+ touch_button_params.Set("y", y);
+ touch_button_params.Set("touch_id", static_cast<int>(index));
+ touch_params[index] = touch_button_params;
+ index++;
+ }
+}
+
+void EmulatedConsole::ReloadInput() {
+ // If you load any device here add the equivalent to the UnloadInput() function
+ SetTouchParams();
+
+ motion_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(motion_params);
+ if (motion_devices) {
+ motion_devices->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback) { SetMotion(callback); },
+ });
+ }
+
+ // Unique index for identifying touch device source
+ std::size_t index = 0;
+ for (auto& touch_device : touch_devices) {
+ touch_device = Common::Input::CreateDevice<Common::Input::InputDevice>(touch_params[index]);
+ if (!touch_device) {
+ continue;
+ }
+ touch_device->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetTouch(callback, index);
+ },
+ });
+ index++;
+ }
+}
+
+void EmulatedConsole::UnloadInput() {
+ motion_devices.reset();
+ for (auto& touch : touch_devices) {
+ touch.reset();
+ }
+}
+
+void EmulatedConsole::EnableConfiguration() {
+ is_configuring = true;
+ SaveCurrentConfig();
+}
+
+void EmulatedConsole::DisableConfiguration() {
+ is_configuring = false;
+}
+
+bool EmulatedConsole::IsConfiguring() const {
+ return is_configuring;
+}
+
+void EmulatedConsole::SaveCurrentConfig() {
+ if (!is_configuring) {
+ return;
+ }
+}
+
+void EmulatedConsole::RestoreConfig() {
+ if (!is_configuring) {
+ return;
+ }
+ ReloadFromSettings();
+}
+
+Common::ParamPackage EmulatedConsole::GetMotionParam() const {
+ return motion_params;
+}
+
+void EmulatedConsole::SetMotionParam(Common::ParamPackage param) {
+ motion_params = param;
+ ReloadInput();
+}
+
+void EmulatedConsole::SetMotion(const Common::Input::CallbackStatus& callback) {
+ std::lock_guard lock{mutex};
+ auto& raw_status = console.motion_values.raw_status;
+ auto& emulated = console.motion_values.emulated;
+
+ raw_status = TransformToMotion(callback);
+ emulated.SetAcceleration(Common::Vec3f{
+ raw_status.accel.x.value,
+ raw_status.accel.y.value,
+ raw_status.accel.z.value,
+ });
+ emulated.SetGyroscope(Common::Vec3f{
+ raw_status.gyro.x.value,
+ raw_status.gyro.y.value,
+ raw_status.gyro.z.value,
+ });
+ emulated.UpdateRotation(raw_status.delta_timestamp);
+ emulated.UpdateOrientation(raw_status.delta_timestamp);
+
+ if (is_configuring) {
+ TriggerOnChange(ConsoleTriggerType::Motion);
+ return;
+ }
+
+ auto& motion = console.motion_state;
+ motion.accel = emulated.GetAcceleration();
+ motion.gyro = emulated.GetGyroscope();
+ motion.rotation = emulated.GetGyroscope();
+ motion.orientation = emulated.GetOrientation();
+ motion.quaternion = emulated.GetQuaternion();
+ motion.is_at_rest = !emulated.IsMoving(motion_sensitivity);
+
+ TriggerOnChange(ConsoleTriggerType::Motion);
+}
+
+void EmulatedConsole::SetTouch(const Common::Input::CallbackStatus& callback, std::size_t index) {
+ if (index >= console.touch_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+
+ console.touch_values[index] = TransformToTouch(callback);
+
+ if (is_configuring) {
+ TriggerOnChange(ConsoleTriggerType::Touch);
+ return;
+ }
+
+ // TODO(german77): Remap touch id in sequential order
+ console.touch_state[index] = {
+ .position = {console.touch_values[index].x.value, console.touch_values[index].y.value},
+ .id = static_cast<u32>(console.touch_values[index].id),
+ .pressed = console.touch_values[index].pressed.value,
+ };
+
+ TriggerOnChange(ConsoleTriggerType::Touch);
+}
+
+ConsoleMotionValues EmulatedConsole::GetMotionValues() const {
+ return console.motion_values;
+}
+
+TouchValues EmulatedConsole::GetTouchValues() const {
+ return console.touch_values;
+}
+
+ConsoleMotion EmulatedConsole::GetMotion() const {
+ return console.motion_state;
+}
+
+TouchFingerState EmulatedConsole::GetTouch() const {
+ return console.touch_state;
+}
+
+void EmulatedConsole::TriggerOnChange(ConsoleTriggerType type) {
+ for (const auto& poller_pair : callback_list) {
+ const ConsoleUpdateCallback& poller = poller_pair.second;
+ if (poller.on_change) {
+ poller.on_change(type);
+ }
+ }
+}
+
+int EmulatedConsole::SetCallback(ConsoleUpdateCallback update_callback) {
+ std::lock_guard lock{mutex};
+ callback_list.insert_or_assign(last_callback_key, update_callback);
+ return last_callback_key++;
+}
+
+void EmulatedConsole::DeleteCallback(int key) {
+ std::lock_guard lock{mutex};
+ const auto& iterator = callback_list.find(key);
+ if (iterator == callback_list.end()) {
+ LOG_ERROR(Input, "Tried to delete non-existent callback {}", key);
+ return;
+ }
+ callback_list.erase(iterator);
+}
+} // namespace Core::HID
diff --git a/src/core/hid/emulated_console.h b/src/core/hid/emulated_console.h
new file mode 100644
index 000000000..3afd284d5
--- /dev/null
+++ b/src/core/hid/emulated_console.h
@@ -0,0 +1,190 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include <functional>
+#include <memory>
+#include <mutex>
+#include <unordered_map>
+
+#include "common/common_types.h"
+#include "common/input.h"
+#include "common/param_package.h"
+#include "common/point.h"
+#include "common/quaternion.h"
+#include "common/vector_math.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/motion_input.h"
+
+namespace Core::HID {
+
+struct ConsoleMotionInfo {
+ Common::Input::MotionStatus raw_status{};
+ MotionInput emulated{};
+};
+
+using ConsoleMotionDevices = std::unique_ptr<Common::Input::InputDevice>;
+using TouchDevices = std::array<std::unique_ptr<Common::Input::InputDevice>, 16>;
+
+using ConsoleMotionParams = Common::ParamPackage;
+using TouchParams = std::array<Common::ParamPackage, 16>;
+
+using ConsoleMotionValues = ConsoleMotionInfo;
+using TouchValues = std::array<Common::Input::TouchStatus, 16>;
+
+struct TouchFinger {
+ u64 last_touch{};
+ Common::Point<float> position{};
+ u32 id{};
+ TouchAttribute attribute{};
+ bool pressed{};
+};
+
+// Contains all motion related data that is used on the services
+struct ConsoleMotion {
+ Common::Vec3f accel{};
+ Common::Vec3f gyro{};
+ Common::Vec3f rotation{};
+ std::array<Common::Vec3f, 3> orientation{};
+ Common::Quaternion<f32> quaternion{};
+ bool is_at_rest{};
+};
+
+using TouchFingerState = std::array<TouchFinger, 16>;
+
+struct ConsoleStatus {
+ // Data from input_common
+ ConsoleMotionValues motion_values{};
+ TouchValues touch_values{};
+
+ // Data for HID services
+ ConsoleMotion motion_state{};
+ TouchFingerState touch_state{};
+};
+
+enum class ConsoleTriggerType {
+ Motion,
+ Touch,
+ All,
+};
+
+struct ConsoleUpdateCallback {
+ std::function<void(ConsoleTriggerType)> on_change;
+};
+
+class EmulatedConsole {
+public:
+ /**
+ * Contains all input data within the emulated switch console tablet such as touch and motion
+ */
+ explicit EmulatedConsole();
+ ~EmulatedConsole();
+
+ YUZU_NON_COPYABLE(EmulatedConsole);
+ YUZU_NON_MOVEABLE(EmulatedConsole);
+
+ /// Removes all callbacks created from input devices
+ void UnloadInput();
+
+ /**
+ * Sets the emulated console into configuring mode
+ * This prevents the modification of the HID state of the emulated console by input commands
+ */
+ void EnableConfiguration();
+
+ /// Returns the emulated console into normal mode, allowing the modification of the HID state
+ void DisableConfiguration();
+
+ /// Returns true if the emulated console is in configuring mode
+ bool IsConfiguring() const;
+
+ /// Reload all input devices
+ void ReloadInput();
+
+ /// Overrides current mapped devices with the stored configuration and reloads all input devices
+ void ReloadFromSettings();
+
+ /// Saves the current mapped configuration
+ void SaveCurrentConfig();
+
+ /// Reverts any mapped changes made that weren't saved
+ void RestoreConfig();
+
+ // Returns the current mapped motion device
+ Common::ParamPackage GetMotionParam() const;
+
+ /**
+ * Updates the current mapped motion device
+ * @param param ParamPackage with controller data to be mapped
+ */
+ void SetMotionParam(Common::ParamPackage param);
+
+ /// Returns the latest status of motion input from the console with parameters
+ ConsoleMotionValues GetMotionValues() const;
+
+ /// Returns the latest status of touch input from the console with parameters
+ TouchValues GetTouchValues() const;
+
+ /// Returns the latest status of motion input from the console
+ ConsoleMotion GetMotion() const;
+
+ /// Returns the latest status of touch input from the console
+ TouchFingerState GetTouch() const;
+
+ /**
+ * Adds a callback to the list of events
+ * @param update_callback A ConsoleUpdateCallback that will be triggered
+ * @return an unique key corresponding to the callback index in the list
+ */
+ int SetCallback(ConsoleUpdateCallback update_callback);
+
+ /**
+ * Removes a callback from the list stopping any future events to this object
+ * @param key Key corresponding to the callback index in the list
+ */
+ void DeleteCallback(int key);
+
+private:
+ /// Creates and stores the touch params
+ void SetTouchParams();
+
+ /**
+ * Updates the motion status of the console
+ * @param callback A CallbackStatus containing gyro and accelerometer data
+ */
+ void SetMotion(const Common::Input::CallbackStatus& callback);
+
+ /**
+ * Updates the touch status of the console
+ * @param callback A CallbackStatus containing the touch position
+ * @param index Finger ID to be updated
+ */
+ void SetTouch(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Triggers a callback that something has changed on the console status
+ * @param type Input type of the event to trigger
+ */
+ void TriggerOnChange(ConsoleTriggerType type);
+
+ bool is_configuring{false};
+ f32 motion_sensitivity{0.01f};
+
+ ConsoleMotionParams motion_params;
+ TouchParams touch_params;
+
+ ConsoleMotionDevices motion_devices;
+ TouchDevices touch_devices;
+
+ mutable std::mutex mutex;
+ std::unordered_map<int, ConsoleUpdateCallback> callback_list;
+ int last_callback_key = 0;
+
+ // Stores the current status of all console input
+ ConsoleStatus console;
+};
+
+} // namespace Core::HID
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
new file mode 100644
index 000000000..93372445b
--- /dev/null
+++ b/src/core/hid/emulated_controller.cpp
@@ -0,0 +1,1139 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "core/hid/emulated_controller.h"
+#include "core/hid/input_converter.h"
+
+namespace Core::HID {
+constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
+constexpr s32 HID_TRIGGER_MAX = 0x7fff;
+
+EmulatedController::EmulatedController(NpadIdType npad_id_type_) : npad_id_type(npad_id_type_) {}
+
+EmulatedController::~EmulatedController() = default;
+
+NpadStyleIndex EmulatedController::MapSettingsTypeToNPad(Settings::ControllerType type) {
+ switch (type) {
+ case Settings::ControllerType::ProController:
+ return NpadStyleIndex::ProController;
+ case Settings::ControllerType::DualJoyconDetached:
+ return NpadStyleIndex::JoyconDual;
+ case Settings::ControllerType::LeftJoycon:
+ return NpadStyleIndex::JoyconLeft;
+ case Settings::ControllerType::RightJoycon:
+ return NpadStyleIndex::JoyconRight;
+ case Settings::ControllerType::Handheld:
+ return NpadStyleIndex::Handheld;
+ case Settings::ControllerType::GameCube:
+ return NpadStyleIndex::GameCube;
+ case Settings::ControllerType::Pokeball:
+ return NpadStyleIndex::Pokeball;
+ case Settings::ControllerType::NES:
+ return NpadStyleIndex::NES;
+ case Settings::ControllerType::SNES:
+ return NpadStyleIndex::SNES;
+ case Settings::ControllerType::N64:
+ return NpadStyleIndex::N64;
+ case Settings::ControllerType::SegaGenesis:
+ return NpadStyleIndex::SegaGenesis;
+ default:
+ return NpadStyleIndex::ProController;
+ }
+}
+
+Settings::ControllerType EmulatedController::MapNPadToSettingsType(NpadStyleIndex type) {
+ switch (type) {
+ case NpadStyleIndex::ProController:
+ return Settings::ControllerType::ProController;
+ case NpadStyleIndex::JoyconDual:
+ return Settings::ControllerType::DualJoyconDetached;
+ case NpadStyleIndex::JoyconLeft:
+ return Settings::ControllerType::LeftJoycon;
+ case NpadStyleIndex::JoyconRight:
+ return Settings::ControllerType::RightJoycon;
+ case NpadStyleIndex::Handheld:
+ return Settings::ControllerType::Handheld;
+ case NpadStyleIndex::GameCube:
+ return Settings::ControllerType::GameCube;
+ case NpadStyleIndex::Pokeball:
+ return Settings::ControllerType::Pokeball;
+ case NpadStyleIndex::NES:
+ return Settings::ControllerType::NES;
+ case NpadStyleIndex::SNES:
+ return Settings::ControllerType::SNES;
+ case NpadStyleIndex::N64:
+ return Settings::ControllerType::N64;
+ case NpadStyleIndex::SegaGenesis:
+ return Settings::ControllerType::SegaGenesis;
+ default:
+ return Settings::ControllerType::ProController;
+ }
+}
+
+void EmulatedController::ReloadFromSettings() {
+ const auto player_index = NpadIdTypeToIndex(npad_id_type);
+ const auto& player = Settings::values.players.GetValue()[player_index];
+
+ for (std::size_t index = 0; index < player.buttons.size(); ++index) {
+ button_params[index] = Common::ParamPackage(player.buttons[index]);
+ }
+ for (std::size_t index = 0; index < player.analogs.size(); ++index) {
+ stick_params[index] = Common::ParamPackage(player.analogs[index]);
+ }
+ for (std::size_t index = 0; index < player.motions.size(); ++index) {
+ motion_params[index] = Common::ParamPackage(player.motions[index]);
+ }
+
+ controller.colors_state.left = {
+ .body = player.body_color_left,
+ .button = player.button_color_left,
+ };
+
+ controller.colors_state.right = {
+ .body = player.body_color_right,
+ .button = player.button_color_right,
+ };
+
+ controller.colors_state.fullkey = controller.colors_state.left;
+
+ // Other or debug controller should always be a pro controller
+ if (npad_id_type != NpadIdType::Other) {
+ SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type));
+ } else {
+ SetNpadStyleIndex(NpadStyleIndex::ProController);
+ }
+
+ if (player.connected) {
+ Connect();
+ } else {
+ Disconnect();
+ }
+
+ ReloadInput();
+}
+
+void EmulatedController::LoadDevices() {
+ // TODO(german77): Use more buttons to detect the correct device
+ const auto left_joycon = button_params[Settings::NativeButton::DRight];
+ const auto right_joycon = button_params[Settings::NativeButton::A];
+
+ // Triggers for GC controllers
+ trigger_params[LeftIndex] = button_params[Settings::NativeButton::ZL];
+ trigger_params[RightIndex] = button_params[Settings::NativeButton::ZR];
+
+ battery_params[LeftIndex] = left_joycon;
+ battery_params[RightIndex] = right_joycon;
+ battery_params[LeftIndex].Set("battery", true);
+ battery_params[RightIndex].Set("battery", true);
+
+ output_params[LeftIndex] = left_joycon;
+ output_params[RightIndex] = right_joycon;
+ output_params[LeftIndex].Set("output", true);
+ output_params[RightIndex].Set("output", true);
+
+ LoadTASParams();
+
+ std::transform(button_params.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
+ button_params.begin() + Settings::NativeButton::BUTTON_NS_END,
+ button_devices.begin(), Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(stick_params.begin() + Settings::NativeAnalog::STICK_HID_BEGIN,
+ stick_params.begin() + Settings::NativeAnalog::STICK_HID_END,
+ stick_devices.begin(), Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(motion_params.begin() + Settings::NativeMotion::MOTION_HID_BEGIN,
+ motion_params.begin() + Settings::NativeMotion::MOTION_HID_END,
+ motion_devices.begin(), Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(trigger_params.begin(), trigger_params.end(), trigger_devices.begin(),
+ Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(battery_params.begin(), battery_params.begin(), battery_devices.end(),
+ Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(output_params.begin(), output_params.end(), output_devices.begin(),
+ Common::Input::CreateDevice<Common::Input::OutputDevice>);
+
+ // Initialize TAS devices
+ std::transform(tas_button_params.begin(), tas_button_params.end(), tas_button_devices.begin(),
+ Common::Input::CreateDevice<Common::Input::InputDevice>);
+ std::transform(tas_stick_params.begin(), tas_stick_params.end(), tas_stick_devices.begin(),
+ Common::Input::CreateDevice<Common::Input::InputDevice>);
+}
+
+void EmulatedController::LoadTASParams() {
+ const auto player_index = NpadIdTypeToIndex(npad_id_type);
+ Common::ParamPackage common_params{};
+ common_params.Set("engine", "tas");
+ common_params.Set("port", static_cast<int>(player_index));
+ for (auto& param : tas_button_params) {
+ param = common_params;
+ }
+ for (auto& param : tas_stick_params) {
+ param = common_params;
+ }
+
+ // TODO(german77): Replace this with an input profile or something better
+ tas_button_params[Settings::NativeButton::A].Set("button", 0);
+ tas_button_params[Settings::NativeButton::B].Set("button", 1);
+ tas_button_params[Settings::NativeButton::X].Set("button", 2);
+ tas_button_params[Settings::NativeButton::Y].Set("button", 3);
+ tas_button_params[Settings::NativeButton::LStick].Set("button", 4);
+ tas_button_params[Settings::NativeButton::RStick].Set("button", 5);
+ tas_button_params[Settings::NativeButton::L].Set("button", 6);
+ tas_button_params[Settings::NativeButton::R].Set("button", 7);
+ tas_button_params[Settings::NativeButton::ZL].Set("button", 8);
+ tas_button_params[Settings::NativeButton::ZR].Set("button", 9);
+ tas_button_params[Settings::NativeButton::Plus].Set("button", 10);
+ tas_button_params[Settings::NativeButton::Minus].Set("button", 11);
+ tas_button_params[Settings::NativeButton::DLeft].Set("button", 12);
+ tas_button_params[Settings::NativeButton::DUp].Set("button", 13);
+ tas_button_params[Settings::NativeButton::DRight].Set("button", 14);
+ tas_button_params[Settings::NativeButton::DDown].Set("button", 15);
+ tas_button_params[Settings::NativeButton::SL].Set("button", 16);
+ tas_button_params[Settings::NativeButton::SR].Set("button", 17);
+ tas_button_params[Settings::NativeButton::Home].Set("button", 18);
+ tas_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
+
+ tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
+ tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
+ tas_stick_params[Settings::NativeAnalog::RStick].Set("axis_x", 2);
+ tas_stick_params[Settings::NativeAnalog::RStick].Set("axis_y", 3);
+}
+
+void EmulatedController::ReloadInput() {
+ // If you load any device here add the equivalent to the UnloadInput() function
+ LoadDevices();
+ for (std::size_t index = 0; index < button_devices.size(); ++index) {
+ if (!button_devices[index]) {
+ continue;
+ }
+ const auto uuid = Common::UUID{button_params[index].Get("guid", "")};
+ button_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetButton(callback, index, uuid);
+ },
+ });
+ button_devices[index]->ForceUpdate();
+ }
+
+ for (std::size_t index = 0; index < stick_devices.size(); ++index) {
+ if (!stick_devices[index]) {
+ continue;
+ }
+ const auto uuid = Common::UUID{stick_params[index].Get("guid", "")};
+ stick_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetStick(callback, index, uuid);
+ },
+ });
+ stick_devices[index]->ForceUpdate();
+ }
+
+ for (std::size_t index = 0; index < trigger_devices.size(); ++index) {
+ if (!trigger_devices[index]) {
+ continue;
+ }
+ const auto uuid = Common::UUID{trigger_params[index].Get("guid", "")};
+ trigger_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetTrigger(callback, index, uuid);
+ },
+ });
+ trigger_devices[index]->ForceUpdate();
+ }
+
+ for (std::size_t index = 0; index < battery_devices.size(); ++index) {
+ if (!battery_devices[index]) {
+ continue;
+ }
+ battery_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetBattery(callback, index);
+ },
+ });
+ battery_devices[index]->ForceUpdate();
+ }
+
+ for (std::size_t index = 0; index < motion_devices.size(); ++index) {
+ if (!motion_devices[index]) {
+ continue;
+ }
+ motion_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMotion(callback, index);
+ },
+ });
+ motion_devices[index]->ForceUpdate();
+ }
+
+ // Use a common UUID for TAS
+ const auto tas_uuid = Common::UUID{0x0, 0x7A5};
+
+ // Register TAS devices. No need to force update
+ for (std::size_t index = 0; index < tas_button_devices.size(); ++index) {
+ if (!tas_button_devices[index]) {
+ continue;
+ }
+ tas_button_devices[index]->SetCallback({
+ .on_change =
+ [this, index, tas_uuid](const Common::Input::CallbackStatus& callback) {
+ SetButton(callback, index, tas_uuid);
+ },
+ });
+ }
+
+ for (std::size_t index = 0; index < tas_stick_devices.size(); ++index) {
+ if (!tas_stick_devices[index]) {
+ continue;
+ }
+ tas_stick_devices[index]->SetCallback({
+ .on_change =
+ [this, index, tas_uuid](const Common::Input::CallbackStatus& callback) {
+ SetStick(callback, index, tas_uuid);
+ },
+ });
+ }
+}
+
+void EmulatedController::UnloadInput() {
+ for (auto& button : button_devices) {
+ button.reset();
+ }
+ for (auto& stick : stick_devices) {
+ stick.reset();
+ }
+ for (auto& motion : motion_devices) {
+ motion.reset();
+ }
+ for (auto& trigger : trigger_devices) {
+ trigger.reset();
+ }
+ for (auto& battery : battery_devices) {
+ battery.reset();
+ }
+ for (auto& output : output_devices) {
+ output.reset();
+ }
+ for (auto& button : tas_button_devices) {
+ button.reset();
+ }
+ for (auto& stick : tas_stick_devices) {
+ stick.reset();
+ }
+}
+
+void EmulatedController::EnableConfiguration() {
+ is_configuring = true;
+ tmp_is_connected = is_connected;
+ tmp_npad_type = npad_type;
+}
+
+void EmulatedController::DisableConfiguration() {
+ is_configuring = false;
+
+ // Apply temporary npad type to the real controller
+ if (tmp_npad_type != npad_type) {
+ if (is_connected) {
+ Disconnect();
+ }
+ SetNpadStyleIndex(tmp_npad_type);
+ }
+
+ // Apply temporary connected status to the real controller
+ if (tmp_is_connected != is_connected) {
+ if (tmp_is_connected) {
+ Connect();
+ return;
+ }
+ Disconnect();
+ }
+}
+
+bool EmulatedController::IsConfiguring() const {
+ return is_configuring;
+}
+
+void EmulatedController::SaveCurrentConfig() {
+ const auto player_index = NpadIdTypeToIndex(npad_id_type);
+ auto& player = Settings::values.players.GetValue()[player_index];
+ player.connected = is_connected;
+ player.controller_type = MapNPadToSettingsType(npad_type);
+ for (std::size_t index = 0; index < player.buttons.size(); ++index) {
+ player.buttons[index] = button_params[index].Serialize();
+ }
+ for (std::size_t index = 0; index < player.analogs.size(); ++index) {
+ player.analogs[index] = stick_params[index].Serialize();
+ }
+ for (std::size_t index = 0; index < player.motions.size(); ++index) {
+ player.motions[index] = motion_params[index].Serialize();
+ }
+}
+
+void EmulatedController::RestoreConfig() {
+ if (!is_configuring) {
+ return;
+ }
+ ReloadFromSettings();
+}
+
+std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices(
+ EmulatedDeviceIndex device_index) const {
+ std::vector<Common::ParamPackage> devices;
+ for (const auto& param : button_params) {
+ if (!param.Has("engine")) {
+ continue;
+ }
+ const auto devices_it = std::find_if(
+ devices.begin(), devices.end(), [param](const Common::ParamPackage param_) {
+ return param.Get("engine", "") == param_.Get("engine", "") &&
+ param.Get("guid", "") == param_.Get("guid", "") &&
+ param.Get("port", 0) == param_.Get("port", 0);
+ });
+ if (devices_it != devices.end()) {
+ continue;
+ }
+ Common::ParamPackage device{};
+ device.Set("engine", param.Get("engine", ""));
+ device.Set("guid", param.Get("guid", ""));
+ device.Set("port", param.Get("port", 0));
+ devices.push_back(device);
+ }
+
+ for (const auto& param : stick_params) {
+ if (!param.Has("engine")) {
+ continue;
+ }
+ if (param.Get("engine", "") == "analog_from_button") {
+ continue;
+ }
+ const auto devices_it = std::find_if(
+ devices.begin(), devices.end(), [param](const Common::ParamPackage param_) {
+ return param.Get("engine", "") == param_.Get("engine", "") &&
+ param.Get("guid", "") == param_.Get("guid", "") &&
+ param.Get("port", 0) == param_.Get("port", 0);
+ });
+ if (devices_it != devices.end()) {
+ continue;
+ }
+ Common::ParamPackage device{};
+ device.Set("engine", param.Get("engine", ""));
+ device.Set("guid", param.Get("guid", ""));
+ device.Set("port", param.Get("port", 0));
+ devices.push_back(device);
+ }
+ return devices;
+}
+
+Common::ParamPackage EmulatedController::GetButtonParam(std::size_t index) const {
+ if (index >= button_params.size()) {
+ return {};
+ }
+ return button_params[index];
+}
+
+Common::ParamPackage EmulatedController::GetStickParam(std::size_t index) const {
+ if (index >= stick_params.size()) {
+ return {};
+ }
+ return stick_params[index];
+}
+
+Common::ParamPackage EmulatedController::GetMotionParam(std::size_t index) const {
+ if (index >= motion_params.size()) {
+ return {};
+ }
+ return motion_params[index];
+}
+
+void EmulatedController::SetButtonParam(std::size_t index, Common::ParamPackage param) {
+ if (index >= button_params.size()) {
+ return;
+ }
+ button_params[index] = std::move(param);
+ ReloadInput();
+}
+
+void EmulatedController::SetStickParam(std::size_t index, Common::ParamPackage param) {
+ if (index >= stick_params.size()) {
+ return;
+ }
+ stick_params[index] = std::move(param);
+ ReloadInput();
+}
+
+void EmulatedController::SetMotionParam(std::size_t index, Common::ParamPackage param) {
+ if (index >= motion_params.size()) {
+ return;
+ }
+ motion_params[index] = std::move(param);
+ ReloadInput();
+}
+
+void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid) {
+ if (index >= controller.button_values.size()) {
+ return;
+ }
+ {
+ std::lock_guard lock{mutex};
+ bool value_changed = false;
+ const auto new_status = TransformToButton(callback);
+ auto& current_status = controller.button_values[index];
+
+ // Only read button values that have the same uuid or are pressed once
+ if (current_status.uuid != uuid) {
+ if (!new_status.value) {
+ return;
+ }
+ }
+
+ current_status.toggle = new_status.toggle;
+ current_status.uuid = uuid;
+
+ // Update button status with current
+ if (!current_status.toggle) {
+ current_status.locked = false;
+ if (current_status.value != new_status.value) {
+ current_status.value = new_status.value;
+ value_changed = true;
+ }
+ } else {
+ // Toggle button and lock status
+ if (new_status.value && !current_status.locked) {
+ current_status.locked = true;
+ current_status.value = !current_status.value;
+ value_changed = true;
+ }
+
+ // Unlock button ready for next press
+ if (!new_status.value && current_status.locked) {
+ current_status.locked = false;
+ }
+ }
+
+ if (!value_changed) {
+ return;
+ }
+
+ if (is_configuring) {
+ controller.npad_button_state.raw = NpadButton::None;
+ controller.debug_pad_button_state.raw = 0;
+ TriggerOnChange(ControllerTriggerType::Button, false);
+ return;
+ }
+
+ switch (index) {
+ case Settings::NativeButton::A:
+ controller.npad_button_state.a.Assign(current_status.value);
+ controller.debug_pad_button_state.a.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::B:
+ controller.npad_button_state.b.Assign(current_status.value);
+ controller.debug_pad_button_state.b.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::X:
+ controller.npad_button_state.x.Assign(current_status.value);
+ controller.debug_pad_button_state.x.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::Y:
+ controller.npad_button_state.y.Assign(current_status.value);
+ controller.debug_pad_button_state.y.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::LStick:
+ controller.npad_button_state.stick_l.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::RStick:
+ controller.npad_button_state.stick_r.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::L:
+ controller.npad_button_state.l.Assign(current_status.value);
+ controller.debug_pad_button_state.l.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::R:
+ controller.npad_button_state.r.Assign(current_status.value);
+ controller.debug_pad_button_state.r.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::ZL:
+ controller.npad_button_state.zl.Assign(current_status.value);
+ controller.debug_pad_button_state.zl.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::ZR:
+ controller.npad_button_state.zr.Assign(current_status.value);
+ controller.debug_pad_button_state.zr.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::Plus:
+ controller.npad_button_state.plus.Assign(current_status.value);
+ controller.debug_pad_button_state.plus.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::Minus:
+ controller.npad_button_state.minus.Assign(current_status.value);
+ controller.debug_pad_button_state.minus.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::DLeft:
+ controller.npad_button_state.left.Assign(current_status.value);
+ controller.debug_pad_button_state.d_left.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::DUp:
+ controller.npad_button_state.up.Assign(current_status.value);
+ controller.debug_pad_button_state.d_up.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::DRight:
+ controller.npad_button_state.right.Assign(current_status.value);
+ controller.debug_pad_button_state.d_right.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::DDown:
+ controller.npad_button_state.down.Assign(current_status.value);
+ controller.debug_pad_button_state.d_down.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::SL:
+ controller.npad_button_state.left_sl.Assign(current_status.value);
+ controller.npad_button_state.right_sl.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::SR:
+ controller.npad_button_state.left_sr.Assign(current_status.value);
+ controller.npad_button_state.right_sr.Assign(current_status.value);
+ break;
+ case Settings::NativeButton::Home:
+ case Settings::NativeButton::Screenshot:
+ break;
+ }
+ }
+ if (!is_connected) {
+ if (npad_id_type == NpadIdType::Player1 && npad_type != NpadStyleIndex::Handheld) {
+ Connect();
+ }
+ if (npad_id_type == NpadIdType::Handheld && npad_type == NpadStyleIndex::Handheld) {
+ Connect();
+ }
+ }
+ TriggerOnChange(ControllerTriggerType::Button, true);
+}
+
+void EmulatedController::SetStick(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid) {
+ if (index >= controller.stick_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ const auto stick_value = TransformToStick(callback);
+
+ // Only read stick values that have the same uuid or are over the threshold to avoid flapping
+ if (controller.stick_values[index].uuid != uuid) {
+ if (!stick_value.down && !stick_value.up && !stick_value.left && !stick_value.right) {
+ return;
+ }
+ }
+
+ controller.stick_values[index] = stick_value;
+ controller.stick_values[index].uuid = uuid;
+
+ if (is_configuring) {
+ controller.analog_stick_state.left = {};
+ controller.analog_stick_state.right = {};
+ TriggerOnChange(ControllerTriggerType::Stick, false);
+ return;
+ }
+
+ const AnalogStickState stick{
+ .x = static_cast<s32>(controller.stick_values[index].x.value * HID_JOYSTICK_MAX),
+ .y = static_cast<s32>(controller.stick_values[index].y.value * HID_JOYSTICK_MAX),
+ };
+
+ switch (index) {
+ case Settings::NativeAnalog::LStick:
+ controller.analog_stick_state.left = stick;
+ controller.npad_button_state.stick_l_left.Assign(controller.stick_values[index].left);
+ controller.npad_button_state.stick_l_up.Assign(controller.stick_values[index].up);
+ controller.npad_button_state.stick_l_right.Assign(controller.stick_values[index].right);
+ controller.npad_button_state.stick_l_down.Assign(controller.stick_values[index].down);
+ break;
+ case Settings::NativeAnalog::RStick:
+ controller.analog_stick_state.right = stick;
+ controller.npad_button_state.stick_r_left.Assign(controller.stick_values[index].left);
+ controller.npad_button_state.stick_r_up.Assign(controller.stick_values[index].up);
+ controller.npad_button_state.stick_r_right.Assign(controller.stick_values[index].right);
+ controller.npad_button_state.stick_r_down.Assign(controller.stick_values[index].down);
+ break;
+ }
+
+ TriggerOnChange(ControllerTriggerType::Stick, true);
+}
+
+void EmulatedController::SetTrigger(const Common::Input::CallbackStatus& callback,
+ std::size_t index, Common::UUID uuid) {
+ if (index >= controller.trigger_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ const auto trigger_value = TransformToTrigger(callback);
+
+ // Only read trigger values that have the same uuid or are pressed once
+ if (controller.trigger_values[index].uuid != uuid) {
+ if (!trigger_value.pressed.value) {
+ return;
+ }
+ }
+
+ controller.trigger_values[index] = trigger_value;
+ controller.trigger_values[index].uuid = uuid;
+
+ if (is_configuring) {
+ controller.gc_trigger_state.left = 0;
+ controller.gc_trigger_state.right = 0;
+ TriggerOnChange(ControllerTriggerType::Trigger, false);
+ return;
+ }
+
+ const auto& trigger = controller.trigger_values[index];
+
+ switch (index) {
+ case Settings::NativeTrigger::LTrigger:
+ controller.gc_trigger_state.left = static_cast<s32>(trigger.analog.value * HID_TRIGGER_MAX);
+ controller.npad_button_state.zl.Assign(trigger.pressed.value);
+ break;
+ case Settings::NativeTrigger::RTrigger:
+ controller.gc_trigger_state.right =
+ static_cast<s32>(trigger.analog.value * HID_TRIGGER_MAX);
+ controller.npad_button_state.zr.Assign(trigger.pressed.value);
+ break;
+ }
+
+ TriggerOnChange(ControllerTriggerType::Trigger, true);
+}
+
+void EmulatedController::SetMotion(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= controller.motion_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ auto& raw_status = controller.motion_values[index].raw_status;
+ auto& emulated = controller.motion_values[index].emulated;
+
+ raw_status = TransformToMotion(callback);
+ emulated.SetAcceleration(Common::Vec3f{
+ raw_status.accel.x.value,
+ raw_status.accel.y.value,
+ raw_status.accel.z.value,
+ });
+ emulated.SetGyroscope(Common::Vec3f{
+ raw_status.gyro.x.value,
+ raw_status.gyro.y.value,
+ raw_status.gyro.z.value,
+ });
+ emulated.UpdateRotation(raw_status.delta_timestamp);
+ emulated.UpdateOrientation(raw_status.delta_timestamp);
+ force_update_motion = raw_status.force_update;
+
+ if (is_configuring) {
+ TriggerOnChange(ControllerTriggerType::Motion, false);
+ return;
+ }
+
+ auto& motion = controller.motion_state[index];
+ motion.accel = emulated.GetAcceleration();
+ motion.gyro = emulated.GetGyroscope();
+ motion.rotation = emulated.GetRotations();
+ motion.orientation = emulated.GetOrientation();
+ motion.is_at_rest = !emulated.IsMoving(motion_sensitivity);
+
+ TriggerOnChange(ControllerTriggerType::Motion, true);
+}
+
+void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= controller.battery_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ controller.battery_values[index] = TransformToBattery(callback);
+
+ if (is_configuring) {
+ TriggerOnChange(ControllerTriggerType::Battery, false);
+ return;
+ }
+
+ bool is_charging = false;
+ bool is_powered = false;
+ NpadBatteryLevel battery_level = 0;
+ switch (controller.battery_values[index]) {
+ case Common::Input::BatteryLevel::Charging:
+ is_charging = true;
+ is_powered = true;
+ battery_level = 6;
+ break;
+ case Common::Input::BatteryLevel::Medium:
+ battery_level = 6;
+ break;
+ case Common::Input::BatteryLevel::Low:
+ battery_level = 4;
+ break;
+ case Common::Input::BatteryLevel::Critical:
+ battery_level = 2;
+ break;
+ case Common::Input::BatteryLevel::Empty:
+ battery_level = 0;
+ break;
+ case Common::Input::BatteryLevel::None:
+ case Common::Input::BatteryLevel::Full:
+ default:
+ is_powered = true;
+ battery_level = 8;
+ break;
+ }
+
+ switch (index) {
+ case LeftIndex:
+ controller.battery_state.left = {
+ .is_powered = is_powered,
+ .is_charging = is_charging,
+ .battery_level = battery_level,
+ };
+ break;
+ case RightIndex:
+ controller.battery_state.right = {
+ .is_powered = is_powered,
+ .is_charging = is_charging,
+ .battery_level = battery_level,
+ };
+ break;
+ case DualIndex:
+ controller.battery_state.dual = {
+ .is_powered = is_powered,
+ .is_charging = is_charging,
+ .battery_level = battery_level,
+ };
+ break;
+ }
+ TriggerOnChange(ControllerTriggerType::Battery, true);
+}
+
+bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) {
+ if (device_index >= output_devices.size()) {
+ return false;
+ }
+ if (!output_devices[device_index]) {
+ return false;
+ }
+ const auto player_index = NpadIdTypeToIndex(npad_id_type);
+ const auto& player = Settings::values.players.GetValue()[player_index];
+ const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f;
+
+ if (!player.vibration_enabled) {
+ return false;
+ }
+
+ // Exponential amplification is too strong at low amplitudes. Switch to a linear
+ // amplification if strength is set below 0.7f
+ const Common::Input::VibrationAmplificationType type =
+ strength > 0.7f ? Common::Input::VibrationAmplificationType::Exponential
+ : Common::Input::VibrationAmplificationType::Linear;
+
+ const Common::Input::VibrationStatus status = {
+ .low_amplitude = std::min(vibration.low_amplitude * strength, 1.0f),
+ .low_frequency = vibration.low_frequency,
+ .high_amplitude = std::min(vibration.high_amplitude * strength, 1.0f),
+ .high_frequency = vibration.high_frequency,
+ .type = type,
+ };
+ return output_devices[device_index]->SetVibration(status) ==
+ Common::Input::VibrationError::None;
+}
+
+bool EmulatedController::TestVibration(std::size_t device_index) {
+ if (device_index >= output_devices.size()) {
+ return false;
+ }
+ if (!output_devices[device_index]) {
+ return false;
+ }
+
+ // Send a slight vibration to test for rumble support
+ constexpr Common::Input::VibrationStatus status = {
+ .low_amplitude = 0.001f,
+ .low_frequency = 160.0f,
+ .high_amplitude = 0.001f,
+ .high_frequency = 320.0f,
+ .type = Common::Input::VibrationAmplificationType::Linear,
+ };
+ return output_devices[device_index]->SetVibration(status) ==
+ Common::Input::VibrationError::None;
+}
+
+void EmulatedController::SetLedPattern() {
+ for (auto& device : output_devices) {
+ if (!device) {
+ continue;
+ }
+
+ const LedPattern pattern = GetLedPattern();
+ const Common::Input::LedStatus status = {
+ .led_1 = pattern.position1 != 0,
+ .led_2 = pattern.position2 != 0,
+ .led_3 = pattern.position3 != 0,
+ .led_4 = pattern.position4 != 0,
+ };
+ device->SetLED(status);
+ }
+}
+
+void EmulatedController::SetSupportedNpadStyleTag(NpadStyleTag supported_styles) {
+ supported_style_tag = supported_styles;
+ if (!is_connected) {
+ return;
+ }
+ if (!IsControllerSupported()) {
+ LOG_ERROR(Service_HID, "Controller type {} is not supported. Disconnecting controller",
+ npad_type);
+ Disconnect();
+ }
+}
+
+bool EmulatedController::IsControllerSupported() const {
+ switch (npad_type) {
+ case NpadStyleIndex::ProController:
+ return supported_style_tag.fullkey;
+ case NpadStyleIndex::Handheld:
+ return supported_style_tag.handheld;
+ case NpadStyleIndex::JoyconDual:
+ return supported_style_tag.joycon_dual;
+ case NpadStyleIndex::JoyconLeft:
+ return supported_style_tag.joycon_left;
+ case NpadStyleIndex::JoyconRight:
+ return supported_style_tag.joycon_right;
+ case NpadStyleIndex::GameCube:
+ return supported_style_tag.gamecube;
+ case NpadStyleIndex::Pokeball:
+ return supported_style_tag.palma;
+ case NpadStyleIndex::NES:
+ return supported_style_tag.lark;
+ case NpadStyleIndex::SNES:
+ return supported_style_tag.lucia;
+ case NpadStyleIndex::N64:
+ return supported_style_tag.lagoon;
+ case NpadStyleIndex::SegaGenesis:
+ return supported_style_tag.lager;
+ default:
+ return false;
+ }
+}
+
+void EmulatedController::Connect() {
+ if (!IsControllerSupported()) {
+ LOG_ERROR(Service_HID, "Controller type {} is not supported", npad_type);
+ return;
+ }
+ {
+ std::lock_guard lock{mutex};
+ if (is_configuring) {
+ tmp_is_connected = true;
+ TriggerOnChange(ControllerTriggerType::Connected, false);
+ return;
+ }
+
+ if (is_connected) {
+ return;
+ }
+ is_connected = true;
+ }
+ TriggerOnChange(ControllerTriggerType::Connected, true);
+}
+
+void EmulatedController::Disconnect() {
+ {
+ std::lock_guard lock{mutex};
+ if (is_configuring) {
+ tmp_is_connected = false;
+ TriggerOnChange(ControllerTriggerType::Disconnected, false);
+ return;
+ }
+
+ if (!is_connected) {
+ return;
+ }
+ is_connected = false;
+ }
+ TriggerOnChange(ControllerTriggerType::Disconnected, true);
+}
+
+bool EmulatedController::IsConnected(bool get_temporary_value) const {
+ if (get_temporary_value && is_configuring) {
+ return tmp_is_connected;
+ }
+ return is_connected;
+}
+
+bool EmulatedController::IsVibrationEnabled() const {
+ const auto player_index = NpadIdTypeToIndex(npad_id_type);
+ const auto& player = Settings::values.players.GetValue()[player_index];
+ return player.vibration_enabled;
+}
+
+NpadIdType EmulatedController::GetNpadIdType() const {
+ return npad_id_type;
+}
+
+NpadStyleIndex EmulatedController::GetNpadStyleIndex(bool get_temporary_value) const {
+ if (get_temporary_value && is_configuring) {
+ return tmp_npad_type;
+ }
+ return npad_type;
+}
+
+void EmulatedController::SetNpadStyleIndex(NpadStyleIndex npad_type_) {
+ {
+ std::lock_guard lock{mutex};
+
+ if (is_configuring) {
+ if (tmp_npad_type == npad_type_) {
+ return;
+ }
+ tmp_npad_type = npad_type_;
+ TriggerOnChange(ControllerTriggerType::Type, false);
+ return;
+ }
+
+ if (npad_type == npad_type_) {
+ return;
+ }
+ if (is_connected) {
+ LOG_WARNING(Service_HID, "Controller {} type changed while it's connected",
+ NpadIdTypeToIndex(npad_id_type));
+ }
+ npad_type = npad_type_;
+ }
+ TriggerOnChange(ControllerTriggerType::Type, true);
+}
+
+LedPattern EmulatedController::GetLedPattern() const {
+ switch (npad_id_type) {
+ case NpadIdType::Player1:
+ return LedPattern{1, 0, 0, 0};
+ case NpadIdType::Player2:
+ return LedPattern{1, 1, 0, 0};
+ case NpadIdType::Player3:
+ return LedPattern{1, 1, 1, 0};
+ case NpadIdType::Player4:
+ return LedPattern{1, 1, 1, 1};
+ case NpadIdType::Player5:
+ return LedPattern{1, 0, 0, 1};
+ case NpadIdType::Player6:
+ return LedPattern{1, 0, 1, 0};
+ case NpadIdType::Player7:
+ return LedPattern{1, 0, 1, 1};
+ case NpadIdType::Player8:
+ return LedPattern{0, 1, 1, 0};
+ default:
+ return LedPattern{0, 0, 0, 0};
+ }
+}
+
+ButtonValues EmulatedController::GetButtonsValues() const {
+ return controller.button_values;
+}
+
+SticksValues EmulatedController::GetSticksValues() const {
+ return controller.stick_values;
+}
+
+TriggerValues EmulatedController::GetTriggersValues() const {
+ return controller.trigger_values;
+}
+
+ControllerMotionValues EmulatedController::GetMotionValues() const {
+ return controller.motion_values;
+}
+
+ColorValues EmulatedController::GetColorsValues() const {
+ return controller.color_values;
+}
+
+BatteryValues EmulatedController::GetBatteryValues() const {
+ return controller.battery_values;
+}
+
+NpadButtonState EmulatedController::GetNpadButtons() const {
+ if (is_configuring) {
+ return {};
+ }
+ return controller.npad_button_state;
+}
+
+DebugPadButton EmulatedController::GetDebugPadButtons() const {
+ if (is_configuring) {
+ return {};
+ }
+ return controller.debug_pad_button_state;
+}
+
+AnalogSticks EmulatedController::GetSticks() const {
+ if (is_configuring) {
+ return {};
+ }
+ // Some drivers like stick from buttons need constant refreshing
+ for (auto& device : stick_devices) {
+ if (!device) {
+ continue;
+ }
+ device->SoftUpdate();
+ }
+ return controller.analog_stick_state;
+}
+
+NpadGcTriggerState EmulatedController::GetTriggers() const {
+ if (is_configuring) {
+ return {};
+ }
+ return controller.gc_trigger_state;
+}
+
+MotionState EmulatedController::GetMotions() const {
+ if (force_update_motion) {
+ for (auto& device : motion_devices) {
+ if (!device) {
+ continue;
+ }
+ device->ForceUpdate();
+ }
+ }
+ return controller.motion_state;
+}
+
+ControllerColors EmulatedController::GetColors() const {
+ return controller.colors_state;
+}
+
+BatteryLevelState EmulatedController::GetBattery() const {
+ return controller.battery_state;
+}
+
+void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) {
+ for (const auto& poller_pair : callback_list) {
+ const ControllerUpdateCallback& poller = poller_pair.second;
+ if (!is_npad_service_update && poller.is_npad_service) {
+ continue;
+ }
+ if (poller.on_change) {
+ poller.on_change(type);
+ }
+ }
+}
+
+int EmulatedController::SetCallback(ControllerUpdateCallback update_callback) {
+ std::lock_guard lock{mutex};
+ callback_list.insert_or_assign(last_callback_key, std::move(update_callback));
+ return last_callback_key++;
+}
+
+void EmulatedController::DeleteCallback(int key) {
+ std::lock_guard lock{mutex};
+ const auto& iterator = callback_list.find(key);
+ if (iterator == callback_list.end()) {
+ LOG_ERROR(Input, "Tried to delete non-existent callback {}", key);
+ return;
+ }
+ callback_list.erase(iterator);
+}
+} // namespace Core::HID
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
new file mode 100644
index 000000000..e42aafebc
--- /dev/null
+++ b/src/core/hid/emulated_controller.h
@@ -0,0 +1,411 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include <functional>
+#include <memory>
+#include <mutex>
+#include <unordered_map>
+
+#include "common/common_types.h"
+#include "common/input.h"
+#include "common/param_package.h"
+#include "common/point.h"
+#include "common/quaternion.h"
+#include "common/settings.h"
+#include "common/vector_math.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/motion_input.h"
+
+namespace Core::HID {
+const std::size_t max_emulated_controllers = 2;
+struct ControllerMotionInfo {
+ Common::Input::MotionStatus raw_status{};
+ MotionInput emulated{};
+};
+
+using ButtonDevices =
+ std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeButton::NumButtons>;
+using StickDevices =
+ std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeAnalog::NumAnalogs>;
+using ControllerMotionDevices =
+ std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeMotion::NumMotions>;
+using TriggerDevices =
+ std::array<std::unique_ptr<Common::Input::InputDevice>, Settings::NativeTrigger::NumTriggers>;
+using BatteryDevices =
+ std::array<std::unique_ptr<Common::Input::InputDevice>, max_emulated_controllers>;
+using OutputDevices =
+ std::array<std::unique_ptr<Common::Input::OutputDevice>, max_emulated_controllers>;
+
+using ButtonParams = std::array<Common::ParamPackage, Settings::NativeButton::NumButtons>;
+using StickParams = std::array<Common::ParamPackage, Settings::NativeAnalog::NumAnalogs>;
+using ControllerMotionParams = std::array<Common::ParamPackage, Settings::NativeMotion::NumMotions>;
+using TriggerParams = std::array<Common::ParamPackage, Settings::NativeTrigger::NumTriggers>;
+using BatteryParams = std::array<Common::ParamPackage, max_emulated_controllers>;
+using OutputParams = std::array<Common::ParamPackage, max_emulated_controllers>;
+
+using ButtonValues = std::array<Common::Input::ButtonStatus, Settings::NativeButton::NumButtons>;
+using SticksValues = std::array<Common::Input::StickStatus, Settings::NativeAnalog::NumAnalogs>;
+using TriggerValues =
+ std::array<Common::Input::TriggerStatus, Settings::NativeTrigger::NumTriggers>;
+using ControllerMotionValues = std::array<ControllerMotionInfo, Settings::NativeMotion::NumMotions>;
+using ColorValues = std::array<Common::Input::BodyColorStatus, max_emulated_controllers>;
+using BatteryValues = std::array<Common::Input::BatteryStatus, max_emulated_controllers>;
+using VibrationValues = std::array<Common::Input::VibrationStatus, max_emulated_controllers>;
+
+struct AnalogSticks {
+ AnalogStickState left{};
+ AnalogStickState right{};
+};
+
+struct ControllerColors {
+ NpadControllerColor fullkey{};
+ NpadControllerColor left{};
+ NpadControllerColor right{};
+};
+
+struct BatteryLevelState {
+ NpadPowerInfo dual{};
+ NpadPowerInfo left{};
+ NpadPowerInfo right{};
+};
+
+struct ControllerMotion {
+ Common::Vec3f accel{};
+ Common::Vec3f gyro{};
+ Common::Vec3f rotation{};
+ std::array<Common::Vec3f, 3> orientation{};
+ bool is_at_rest{};
+};
+
+enum EmulatedDeviceIndex : u8 {
+ LeftIndex,
+ RightIndex,
+ DualIndex,
+ AllDevices,
+};
+
+using MotionState = std::array<ControllerMotion, 2>;
+
+struct ControllerStatus {
+ // Data from input_common
+ ButtonValues button_values{};
+ SticksValues stick_values{};
+ ControllerMotionValues motion_values{};
+ TriggerValues trigger_values{};
+ ColorValues color_values{};
+ BatteryValues battery_values{};
+ VibrationValues vibration_values{};
+
+ // Data for HID serices
+ NpadButtonState npad_button_state{};
+ DebugPadButton debug_pad_button_state{};
+ AnalogSticks analog_stick_state{};
+ MotionState motion_state{};
+ NpadGcTriggerState gc_trigger_state{};
+ ControllerColors colors_state{};
+ BatteryLevelState battery_state{};
+};
+
+enum class ControllerTriggerType {
+ Button,
+ Stick,
+ Trigger,
+ Motion,
+ Color,
+ Battery,
+ Vibration,
+ Connected,
+ Disconnected,
+ Type,
+ All,
+};
+
+struct ControllerUpdateCallback {
+ std::function<void(ControllerTriggerType)> on_change;
+ bool is_npad_service;
+};
+
+class EmulatedController {
+public:
+ /**
+ * Contains all input data (buttons, joysticks, vibration, and motion) within this controller.
+ * @param npad_id_type npad id type for this specific controller
+ */
+ explicit EmulatedController(NpadIdType npad_id_type_);
+ ~EmulatedController();
+
+ YUZU_NON_COPYABLE(EmulatedController);
+ YUZU_NON_MOVEABLE(EmulatedController);
+
+ /// Converts the controller type from settings to npad type
+ static NpadStyleIndex MapSettingsTypeToNPad(Settings::ControllerType type);
+
+ /// Converts npad type to the equivalent of controller type from settings
+ static Settings::ControllerType MapNPadToSettingsType(NpadStyleIndex type);
+
+ /// Gets the NpadIdType for this controller
+ NpadIdType GetNpadIdType() const;
+
+ /// Sets the NpadStyleIndex for this controller
+ void SetNpadStyleIndex(NpadStyleIndex npad_type_);
+
+ /**
+ * Gets the NpadStyleIndex for this controller
+ * @param get_temporary_value If true tmp_npad_type will be returned
+ * @return NpadStyleIndex set on the controller
+ */
+ NpadStyleIndex GetNpadStyleIndex(bool get_temporary_value = false) const;
+
+ /**
+ * Sets the supported controller types. Disconnects the controller if current type is not
+ * supported
+ * @param supported_styles bitflag with supported types
+ */
+ void SetSupportedNpadStyleTag(NpadStyleTag supported_styles);
+
+ /// Sets the connected status to true
+ void Connect();
+
+ /// Sets the connected status to false
+ void Disconnect();
+
+ /**
+ * Is the emulated connected
+ * @param get_temporary_value If true tmp_is_connected will be returned
+ * @return true if the controller has the connected status
+ */
+ bool IsConnected(bool get_temporary_value = false) const;
+
+ /// Returns true if vibration is enabled
+ bool IsVibrationEnabled() const;
+
+ /// Removes all callbacks created from input devices
+ void UnloadInput();
+
+ /**
+ * Sets the emulated controller into configuring mode
+ * This prevents the modification of the HID state of the emulated controller by input commands
+ */
+ void EnableConfiguration();
+
+ /// Returns the emulated controller into normal mode, allowing the modification of the HID state
+ void DisableConfiguration();
+
+ /// Returns true if the emulated controller is in configuring mode
+ bool IsConfiguring() const;
+
+ /// Reload all input devices
+ void ReloadInput();
+
+ /// Overrides current mapped devices with the stored configuration and reloads all input devices
+ void ReloadFromSettings();
+
+ /// Saves the current mapped configuration
+ void SaveCurrentConfig();
+
+ /// Reverts any mapped changes made that weren't saved
+ void RestoreConfig();
+
+ /// Returns a vector of mapped devices from the mapped button and stick parameters
+ std::vector<Common::ParamPackage> GetMappedDevices(EmulatedDeviceIndex device_index) const;
+
+ // Returns the current mapped button device
+ Common::ParamPackage GetButtonParam(std::size_t index) const;
+
+ // Returns the current mapped stick device
+ Common::ParamPackage GetStickParam(std::size_t index) const;
+
+ // Returns the current mapped motion device
+ Common::ParamPackage GetMotionParam(std::size_t index) const;
+
+ /**
+ * Updates the current mapped button device
+ * @param param ParamPackage with controller data to be mapped
+ */
+ void SetButtonParam(std::size_t index, Common::ParamPackage param);
+
+ /**
+ * Updates the current mapped stick device
+ * @param param ParamPackage with controller data to be mapped
+ */
+ void SetStickParam(std::size_t index, Common::ParamPackage param);
+
+ /**
+ * Updates the current mapped motion device
+ * @param param ParamPackage with controller data to be mapped
+ */
+ void SetMotionParam(std::size_t index, Common::ParamPackage param);
+
+ /// Returns the latest button status from the controller with parameters
+ ButtonValues GetButtonsValues() const;
+
+ /// Returns the latest analog stick status from the controller with parameters
+ SticksValues GetSticksValues() const;
+
+ /// Returns the latest trigger status from the controller with parameters
+ TriggerValues GetTriggersValues() const;
+
+ /// Returns the latest motion status from the controller with parameters
+ ControllerMotionValues GetMotionValues() const;
+
+ /// Returns the latest color status from the controller with parameters
+ ColorValues GetColorsValues() const;
+
+ /// Returns the latest battery status from the controller with parameters
+ BatteryValues GetBatteryValues() const;
+
+ /// Returns the latest status of button input for the npad service
+ NpadButtonState GetNpadButtons() const;
+
+ /// Returns the latest status of button input for the debug pad service
+ DebugPadButton GetDebugPadButtons() const;
+
+ /// Returns the latest status of stick input from the mouse
+ AnalogSticks GetSticks() const;
+
+ /// Returns the latest status of trigger input from the mouse
+ NpadGcTriggerState GetTriggers() const;
+
+ /// Returns the latest status of motion input from the mouse
+ MotionState GetMotions() const;
+
+ /// Returns the latest color value from the controller
+ ControllerColors GetColors() const;
+
+ /// Returns the latest battery status from the controller
+ BatteryLevelState GetBattery() const;
+
+ /**
+ * Sends a specific vibration to the output device
+ * @return returns true if vibration had no errors
+ */
+ bool SetVibration(std::size_t device_index, VibrationValue vibration);
+
+ /**
+ * Sends a small vibration to the output device
+ * @return returns true if SetVibration was successfull
+ */
+ bool TestVibration(std::size_t device_index);
+
+ /// Returns the led pattern corresponding to this emulated controller
+ LedPattern GetLedPattern() const;
+
+ /// Asks the output device to change the player led pattern
+ void SetLedPattern();
+
+ /**
+ * Adds a callback to the list of events
+ * @param update_callback A ConsoleUpdateCallback that will be triggered
+ * @return an unique key corresponding to the callback index in the list
+ */
+ int SetCallback(ControllerUpdateCallback update_callback);
+
+ /**
+ * Removes a callback from the list stopping any future events to this object
+ * @param key Key corresponding to the callback index in the list
+ */
+ void DeleteCallback(int key);
+
+private:
+ /// creates input devices from params
+ void LoadDevices();
+
+ /// Set the params for TAS devices
+ void LoadTASParams();
+
+ /**
+ * Checks the current controller type against the supported_style_tag
+ * @return true if the controller is supported
+ */
+ bool IsControllerSupported() const;
+
+ /**
+ * Updates the button status of the controller
+ * @param callback A CallbackStatus containing the button status
+ * @param index Button ID of the to be updated
+ */
+ void SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
+
+ /**
+ * Updates the analog stick status of the controller
+ * @param callback A CallbackStatus containing the analog stick status
+ * @param index stick ID of the to be updated
+ */
+ void SetStick(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
+
+ /**
+ * Updates the trigger status of the controller
+ * @param callback A CallbackStatus containing the trigger status
+ * @param index trigger ID of the to be updated
+ */
+ void SetTrigger(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
+
+ /**
+ * Updates the motion status of the controller
+ * @param callback A CallbackStatus containing gyro and accelerometer data
+ * @param index motion ID of the to be updated
+ */
+ void SetMotion(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Updates the battery status of the controller
+ * @param callback A CallbackStatus containing the battery status
+ * @param index Button ID of the to be updated
+ */
+ void SetBattery(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Triggers a callback that something has changed on the controller status
+ * @param type Input type of the event to trigger
+ * @param is_service_update indicates if this event should only be sent to HID services
+ */
+ void TriggerOnChange(ControllerTriggerType type, bool is_service_update);
+
+ NpadIdType npad_id_type;
+ NpadStyleIndex npad_type{NpadStyleIndex::None};
+ NpadStyleTag supported_style_tag{NpadStyleSet::All};
+ bool is_connected{false};
+ bool is_configuring{false};
+ f32 motion_sensitivity{0.01f};
+ bool force_update_motion{false};
+
+ // Temporary values to avoid doing changes while the controller is in configuring mode
+ NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};
+ bool tmp_is_connected{false};
+
+ ButtonParams button_params;
+ StickParams stick_params;
+ ControllerMotionParams motion_params;
+ TriggerParams trigger_params;
+ BatteryParams battery_params;
+ OutputParams output_params;
+
+ ButtonDevices button_devices;
+ StickDevices stick_devices;
+ ControllerMotionDevices motion_devices;
+ TriggerDevices trigger_devices;
+ BatteryDevices battery_devices;
+ OutputDevices output_devices;
+
+ // TAS related variables
+ ButtonParams tas_button_params;
+ StickParams tas_stick_params;
+ ButtonDevices tas_button_devices;
+ StickDevices tas_stick_devices;
+
+ mutable std::mutex mutex;
+ std::unordered_map<int, ControllerUpdateCallback> callback_list;
+ int last_callback_key = 0;
+
+ // Stores the current status of all controller input
+ ControllerStatus controller;
+};
+
+} // namespace Core::HID
diff --git a/src/core/hid/emulated_devices.cpp b/src/core/hid/emulated_devices.cpp
new file mode 100644
index 000000000..708480f2d
--- /dev/null
+++ b/src/core/hid/emulated_devices.cpp
@@ -0,0 +1,459 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include <algorithm>
+#include <fmt/format.h>
+
+#include "core/hid/emulated_devices.h"
+#include "core/hid/input_converter.h"
+
+namespace Core::HID {
+
+EmulatedDevices::EmulatedDevices() = default;
+
+EmulatedDevices::~EmulatedDevices() = default;
+
+void EmulatedDevices::ReloadFromSettings() {
+ ReloadInput();
+}
+
+void EmulatedDevices::ReloadInput() {
+ // If you load any device here add the equivalent to the UnloadInput() function
+ std::size_t key_index = 0;
+ for (auto& mouse_device : mouse_button_devices) {
+ Common::ParamPackage mouse_params;
+ mouse_params.Set("engine", "mouse");
+ mouse_params.Set("button", static_cast<int>(key_index));
+ mouse_device = Common::Input::CreateDevice<Common::Input::InputDevice>(mouse_params);
+ key_index++;
+ }
+
+ mouse_stick_device = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ "engine:mouse,axis_x:0,axis_y:1");
+
+ // First two axis are reserved for mouse position
+ key_index = 2;
+ for (auto& mouse_device : mouse_analog_devices) {
+ Common::ParamPackage mouse_params;
+ mouse_params.Set("engine", "mouse");
+ mouse_params.Set("axis", static_cast<int>(key_index));
+ mouse_device = Common::Input::CreateDevice<Common::Input::InputDevice>(mouse_params);
+ key_index++;
+ }
+
+ key_index = 0;
+ for (auto& keyboard_device : keyboard_devices) {
+ // Keyboard keys are only mapped on port 1, pad 0
+ Common::ParamPackage keyboard_params;
+ keyboard_params.Set("engine", "keyboard");
+ keyboard_params.Set("button", static_cast<int>(key_index));
+ keyboard_params.Set("port", 1);
+ keyboard_params.Set("pad", 0);
+ keyboard_device = Common::Input::CreateDevice<Common::Input::InputDevice>(keyboard_params);
+ key_index++;
+ }
+
+ key_index = 0;
+ for (auto& keyboard_device : keyboard_modifier_devices) {
+ // Keyboard moddifiers are only mapped on port 1, pad 1
+ Common::ParamPackage keyboard_params;
+ keyboard_params.Set("engine", "keyboard");
+ keyboard_params.Set("button", static_cast<int>(key_index));
+ keyboard_params.Set("port", 1);
+ keyboard_params.Set("pad", 1);
+ keyboard_device = Common::Input::CreateDevice<Common::Input::InputDevice>(keyboard_params);
+ key_index++;
+ }
+
+ for (std::size_t index = 0; index < mouse_button_devices.size(); ++index) {
+ if (!mouse_button_devices[index]) {
+ continue;
+ }
+ mouse_button_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMouseButton(callback, index);
+ },
+ });
+ }
+
+ for (std::size_t index = 0; index < mouse_analog_devices.size(); ++index) {
+ if (!mouse_analog_devices[index]) {
+ continue;
+ }
+ mouse_analog_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMouseAnalog(callback, index);
+ },
+ });
+ }
+
+ if (mouse_stick_device) {
+ mouse_stick_device->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback) { SetMouseStick(callback); },
+ });
+ }
+
+ for (std::size_t index = 0; index < keyboard_devices.size(); ++index) {
+ if (!keyboard_devices[index]) {
+ continue;
+ }
+ keyboard_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetKeyboardButton(callback, index);
+ },
+ });
+ }
+
+ for (std::size_t index = 0; index < keyboard_modifier_devices.size(); ++index) {
+ if (!keyboard_modifier_devices[index]) {
+ continue;
+ }
+ keyboard_modifier_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetKeyboardModifier(callback, index);
+ },
+ });
+ }
+}
+
+void EmulatedDevices::UnloadInput() {
+ for (auto& button : mouse_button_devices) {
+ button.reset();
+ }
+ for (auto& analog : mouse_analog_devices) {
+ analog.reset();
+ }
+ mouse_stick_device.reset();
+ for (auto& button : keyboard_devices) {
+ button.reset();
+ }
+ for (auto& button : keyboard_modifier_devices) {
+ button.reset();
+ }
+}
+
+void EmulatedDevices::EnableConfiguration() {
+ is_configuring = true;
+ SaveCurrentConfig();
+}
+
+void EmulatedDevices::DisableConfiguration() {
+ is_configuring = false;
+}
+
+bool EmulatedDevices::IsConfiguring() const {
+ return is_configuring;
+}
+
+void EmulatedDevices::SaveCurrentConfig() {
+ if (!is_configuring) {
+ return;
+ }
+}
+
+void EmulatedDevices::RestoreConfig() {
+ if (!is_configuring) {
+ return;
+ }
+ ReloadFromSettings();
+}
+
+void EmulatedDevices::SetKeyboardButton(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= device_status.keyboard_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ bool value_changed = false;
+ const auto new_status = TransformToButton(callback);
+ auto& current_status = device_status.keyboard_values[index];
+ current_status.toggle = new_status.toggle;
+
+ // Update button status with current status
+ if (!current_status.toggle) {
+ current_status.locked = false;
+ if (current_status.value != new_status.value) {
+ current_status.value = new_status.value;
+ value_changed = true;
+ }
+ } else {
+ // Toggle button and lock status
+ if (new_status.value && !current_status.locked) {
+ current_status.locked = true;
+ current_status.value = !current_status.value;
+ value_changed = true;
+ }
+
+ // Unlock button, ready for next press
+ if (!new_status.value && current_status.locked) {
+ current_status.locked = false;
+ }
+ }
+
+ if (!value_changed) {
+ return;
+ }
+
+ if (is_configuring) {
+ TriggerOnChange(DeviceTriggerType::Keyboard);
+ return;
+ }
+
+ // Index should be converted from NativeKeyboard to KeyboardKeyIndex
+ UpdateKey(index, current_status.value);
+
+ TriggerOnChange(DeviceTriggerType::Keyboard);
+}
+
+void EmulatedDevices::UpdateKey(std::size_t key_index, bool status) {
+ constexpr std::size_t KEYS_PER_BYTE = 8;
+ auto& entry = device_status.keyboard_state.key[key_index / KEYS_PER_BYTE];
+ const u8 mask = static_cast<u8>(1 << (key_index % KEYS_PER_BYTE));
+ if (status) {
+ entry = entry | mask;
+ } else {
+ entry = static_cast<u8>(entry & ~mask);
+ }
+}
+
+void EmulatedDevices::SetKeyboardModifier(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= device_status.keyboard_moddifier_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ bool value_changed = false;
+ const auto new_status = TransformToButton(callback);
+ auto& current_status = device_status.keyboard_moddifier_values[index];
+ current_status.toggle = new_status.toggle;
+
+ // Update button status with current
+ if (!current_status.toggle) {
+ current_status.locked = false;
+ if (current_status.value != new_status.value) {
+ current_status.value = new_status.value;
+ value_changed = true;
+ }
+ } else {
+ // Toggle button and lock status
+ if (new_status.value && !current_status.locked) {
+ current_status.locked = true;
+ current_status.value = !current_status.value;
+ value_changed = true;
+ }
+
+ // Unlock button ready for next press
+ if (!new_status.value && current_status.locked) {
+ current_status.locked = false;
+ }
+ }
+
+ if (!value_changed) {
+ return;
+ }
+
+ if (is_configuring) {
+ TriggerOnChange(DeviceTriggerType::KeyboardModdifier);
+ return;
+ }
+
+ switch (index) {
+ case Settings::NativeKeyboard::LeftControl:
+ case Settings::NativeKeyboard::RightControl:
+ device_status.keyboard_moddifier_state.control.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::LeftShift:
+ case Settings::NativeKeyboard::RightShift:
+ device_status.keyboard_moddifier_state.shift.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::LeftAlt:
+ device_status.keyboard_moddifier_state.left_alt.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::RightAlt:
+ device_status.keyboard_moddifier_state.right_alt.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::CapsLock:
+ device_status.keyboard_moddifier_state.caps_lock.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::ScrollLock:
+ device_status.keyboard_moddifier_state.scroll_lock.Assign(current_status.value);
+ break;
+ case Settings::NativeKeyboard::NumLock:
+ device_status.keyboard_moddifier_state.num_lock.Assign(current_status.value);
+ break;
+ }
+
+ TriggerOnChange(DeviceTriggerType::KeyboardModdifier);
+}
+
+void EmulatedDevices::SetMouseButton(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= device_status.mouse_button_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ bool value_changed = false;
+ const auto new_status = TransformToButton(callback);
+ auto& current_status = device_status.mouse_button_values[index];
+ current_status.toggle = new_status.toggle;
+
+ // Update button status with current
+ if (!current_status.toggle) {
+ current_status.locked = false;
+ if (current_status.value != new_status.value) {
+ current_status.value = new_status.value;
+ value_changed = true;
+ }
+ } else {
+ // Toggle button and lock status
+ if (new_status.value && !current_status.locked) {
+ current_status.locked = true;
+ current_status.value = !current_status.value;
+ value_changed = true;
+ }
+
+ // Unlock button ready for next press
+ if (!new_status.value && current_status.locked) {
+ current_status.locked = false;
+ }
+ }
+
+ if (!value_changed) {
+ return;
+ }
+
+ if (is_configuring) {
+ TriggerOnChange(DeviceTriggerType::Mouse);
+ return;
+ }
+
+ switch (index) {
+ case Settings::NativeMouseButton::Left:
+ device_status.mouse_button_state.left.Assign(current_status.value);
+ break;
+ case Settings::NativeMouseButton::Right:
+ device_status.mouse_button_state.right.Assign(current_status.value);
+ break;
+ case Settings::NativeMouseButton::Middle:
+ device_status.mouse_button_state.middle.Assign(current_status.value);
+ break;
+ case Settings::NativeMouseButton::Forward:
+ device_status.mouse_button_state.forward.Assign(current_status.value);
+ break;
+ case Settings::NativeMouseButton::Back:
+ device_status.mouse_button_state.back.Assign(current_status.value);
+ break;
+ }
+
+ TriggerOnChange(DeviceTriggerType::Mouse);
+}
+
+void EmulatedDevices::SetMouseAnalog(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
+ if (index >= device_status.mouse_analog_values.size()) {
+ return;
+ }
+ std::lock_guard lock{mutex};
+ const auto analog_value = TransformToAnalog(callback);
+
+ device_status.mouse_analog_values[index] = analog_value;
+
+ if (is_configuring) {
+ device_status.mouse_position_state = {};
+ TriggerOnChange(DeviceTriggerType::Mouse);
+ return;
+ }
+
+ switch (index) {
+ case Settings::NativeMouseWheel::X:
+ device_status.mouse_wheel_state.x = static_cast<s32>(analog_value.value);
+ break;
+ case Settings::NativeMouseWheel::Y:
+ device_status.mouse_wheel_state.y = static_cast<s32>(analog_value.value);
+ break;
+ }
+
+ TriggerOnChange(DeviceTriggerType::Mouse);
+}
+
+void EmulatedDevices::SetMouseStick(const Common::Input::CallbackStatus& callback) {
+ std::lock_guard lock{mutex};
+ const auto touch_value = TransformToTouch(callback);
+
+ device_status.mouse_stick_value = touch_value;
+
+ if (is_configuring) {
+ device_status.mouse_position_state = {};
+ TriggerOnChange(DeviceTriggerType::Mouse);
+ return;
+ }
+
+ device_status.mouse_position_state.x = touch_value.x.value;
+ device_status.mouse_position_state.y = touch_value.y.value;
+
+ TriggerOnChange(DeviceTriggerType::Mouse);
+}
+
+KeyboardValues EmulatedDevices::GetKeyboardValues() const {
+ return device_status.keyboard_values;
+}
+
+KeyboardModifierValues EmulatedDevices::GetKeyboardModdifierValues() const {
+ return device_status.keyboard_moddifier_values;
+}
+
+MouseButtonValues EmulatedDevices::GetMouseButtonsValues() const {
+ return device_status.mouse_button_values;
+}
+
+KeyboardKey EmulatedDevices::GetKeyboard() const {
+ return device_status.keyboard_state;
+}
+
+KeyboardModifier EmulatedDevices::GetKeyboardModifier() const {
+ return device_status.keyboard_moddifier_state;
+}
+
+MouseButton EmulatedDevices::GetMouseButtons() const {
+ return device_status.mouse_button_state;
+}
+
+MousePosition EmulatedDevices::GetMousePosition() const {
+ return device_status.mouse_position_state;
+}
+
+AnalogStickState EmulatedDevices::GetMouseWheel() const {
+ return device_status.mouse_wheel_state;
+}
+
+void EmulatedDevices::TriggerOnChange(DeviceTriggerType type) {
+ for (const auto& poller_pair : callback_list) {
+ const InterfaceUpdateCallback& poller = poller_pair.second;
+ if (poller.on_change) {
+ poller.on_change(type);
+ }
+ }
+}
+
+int EmulatedDevices::SetCallback(InterfaceUpdateCallback update_callback) {
+ std::lock_guard lock{mutex};
+ callback_list.insert_or_assign(last_callback_key, std::move(update_callback));
+ return last_callback_key++;
+}
+
+void EmulatedDevices::DeleteCallback(int key) {
+ std::lock_guard lock{mutex};
+ const auto& iterator = callback_list.find(key);
+ if (iterator == callback_list.end()) {
+ LOG_ERROR(Input, "Tried to delete non-existent callback {}", key);
+ return;
+ }
+ callback_list.erase(iterator);
+}
+} // namespace Core::HID
diff --git a/src/core/hid/emulated_devices.h b/src/core/hid/emulated_devices.h
new file mode 100644
index 000000000..790d3b411
--- /dev/null
+++ b/src/core/hid/emulated_devices.h
@@ -0,0 +1,210 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include <functional>
+#include <memory>
+#include <mutex>
+#include <unordered_map>
+
+#include "common/common_types.h"
+#include "common/input.h"
+#include "common/param_package.h"
+#include "common/settings.h"
+#include "core/hid/hid_types.h"
+
+namespace Core::HID {
+using KeyboardDevices = std::array<std::unique_ptr<Common::Input::InputDevice>,
+ Settings::NativeKeyboard::NumKeyboardKeys>;
+using KeyboardModifierDevices = std::array<std::unique_ptr<Common::Input::InputDevice>,
+ Settings::NativeKeyboard::NumKeyboardMods>;
+using MouseButtonDevices = std::array<std::unique_ptr<Common::Input::InputDevice>,
+ Settings::NativeMouseButton::NumMouseButtons>;
+using MouseAnalogDevices = std::array<std::unique_ptr<Common::Input::InputDevice>,
+ Settings::NativeMouseWheel::NumMouseWheels>;
+using MouseStickDevice = std::unique_ptr<Common::Input::InputDevice>;
+
+using MouseButtonParams =
+ std::array<Common::ParamPackage, Settings::NativeMouseButton::NumMouseButtons>;
+
+using KeyboardValues =
+ std::array<Common::Input::ButtonStatus, Settings::NativeKeyboard::NumKeyboardKeys>;
+using KeyboardModifierValues =
+ std::array<Common::Input::ButtonStatus, Settings::NativeKeyboard::NumKeyboardMods>;
+using MouseButtonValues =
+ std::array<Common::Input::ButtonStatus, Settings::NativeMouseButton::NumMouseButtons>;
+using MouseAnalogValues =
+ std::array<Common::Input::AnalogStatus, Settings::NativeMouseWheel::NumMouseWheels>;
+using MouseStickValue = Common::Input::TouchStatus;
+
+struct MousePosition {
+ f32 x;
+ f32 y;
+};
+
+struct DeviceStatus {
+ // Data from input_common
+ KeyboardValues keyboard_values{};
+ KeyboardModifierValues keyboard_moddifier_values{};
+ MouseButtonValues mouse_button_values{};
+ MouseAnalogValues mouse_analog_values{};
+ MouseStickValue mouse_stick_value{};
+
+ // Data for HID serices
+ KeyboardKey keyboard_state{};
+ KeyboardModifier keyboard_moddifier_state{};
+ MouseButton mouse_button_state{};
+ MousePosition mouse_position_state{};
+ AnalogStickState mouse_wheel_state{};
+};
+
+enum class DeviceTriggerType {
+ Keyboard,
+ KeyboardModdifier,
+ Mouse,
+};
+
+struct InterfaceUpdateCallback {
+ std::function<void(DeviceTriggerType)> on_change;
+};
+
+class EmulatedDevices {
+public:
+ /**
+ * Contains all input data related to external devices that aren't necesarily a controller
+ * This includes devices such as the keyboard or mouse
+ */
+ explicit EmulatedDevices();
+ ~EmulatedDevices();
+
+ YUZU_NON_COPYABLE(EmulatedDevices);
+ YUZU_NON_MOVEABLE(EmulatedDevices);
+
+ /// Removes all callbacks created from input devices
+ void UnloadInput();
+
+ /**
+ * Sets the emulated devices into configuring mode
+ * This prevents the modification of the HID state of the emulated devices by input commands
+ */
+ void EnableConfiguration();
+
+ /// Returns the emulated devices into normal mode, allowing the modification of the HID state
+ void DisableConfiguration();
+
+ /// Returns true if the emulated device is in configuring mode
+ bool IsConfiguring() const;
+
+ /// Reload all input devices
+ void ReloadInput();
+
+ /// Overrides current mapped devices with the stored configuration and reloads all input devices
+ void ReloadFromSettings();
+
+ /// Saves the current mapped configuration
+ void SaveCurrentConfig();
+
+ /// Reverts any mapped changes made that weren't saved
+ void RestoreConfig();
+
+ /// Returns the latest status of button input from the keyboard with parameters
+ KeyboardValues GetKeyboardValues() const;
+
+ /// Returns the latest status of button input from the keyboard modifiers with parameters
+ KeyboardModifierValues GetKeyboardModdifierValues() const;
+
+ /// Returns the latest status of button input from the mouse with parameters
+ MouseButtonValues GetMouseButtonsValues() const;
+
+ /// Returns the latest status of button input from the keyboard
+ KeyboardKey GetKeyboard() const;
+
+ /// Returns the latest status of button input from the keyboard modifiers
+ KeyboardModifier GetKeyboardModifier() const;
+
+ /// Returns the latest status of button input from the mouse
+ MouseButton GetMouseButtons() const;
+
+ /// Returns the latest mouse coordinates
+ MousePosition GetMousePosition() const;
+
+ /// Returns the latest mouse wheel change
+ AnalogStickState GetMouseWheel() const;
+
+ /**
+ * Adds a callback to the list of events
+ * @param update_callback InterfaceUpdateCallback that will be triggered
+ * @return an unique key corresponding to the callback index in the list
+ */
+ int SetCallback(InterfaceUpdateCallback update_callback);
+
+ /**
+ * Removes a callback from the list stopping any future events to this object
+ * @param key Key corresponding to the callback index in the list
+ */
+ void DeleteCallback(int key);
+
+private:
+ /// Helps assigning a value to keyboard_state
+ void UpdateKey(std::size_t key_index, bool status);
+
+ /**
+ * Updates the touch status of the keyboard device
+ * @param callback A CallbackStatus containing the key status
+ * @param index key ID to be updated
+ */
+ void SetKeyboardButton(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Updates the keyboard status of the keyboard device
+ * @param callback A CallbackStatus containing the modifier key status
+ * @param index modifier key ID to be updated
+ */
+ void SetKeyboardModifier(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Updates the mouse button status of the mouse device
+ * @param callback A CallbackStatus containing the button status
+ * @param index Button ID to be updated
+ */
+ void SetMouseButton(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Updates the mouse wheel status of the mouse device
+ * @param callback A CallbackStatus containing the wheel status
+ * @param index wheel ID to be updated
+ */
+ void SetMouseAnalog(const Common::Input::CallbackStatus& callback, std::size_t index);
+
+ /**
+ * Updates the mouse position status of the mouse device
+ * @param callback A CallbackStatus containing the position status
+ */
+ void SetMouseStick(const Common::Input::CallbackStatus& callback);
+
+ /**
+ * Triggers a callback that something has changed on the device status
+ * @param type Input type of the event to trigger
+ */
+ void TriggerOnChange(DeviceTriggerType type);
+
+ bool is_configuring{false};
+
+ KeyboardDevices keyboard_devices;
+ KeyboardModifierDevices keyboard_modifier_devices;
+ MouseButtonDevices mouse_button_devices;
+ MouseAnalogDevices mouse_analog_devices;
+ MouseStickDevice mouse_stick_device;
+
+ mutable std::mutex mutex;
+ std::unordered_map<int, InterfaceUpdateCallback> callback_list;
+ int last_callback_key = 0;
+
+ // Stores the current status of all external device input
+ DeviceStatus device_status;
+};
+
+} // namespace Core::HID
diff --git a/src/core/hid/hid_core.cpp b/src/core/hid/hid_core.cpp
new file mode 100644
index 000000000..a1c3bbb57
--- /dev/null
+++ b/src/core/hid/hid_core.cpp
@@ -0,0 +1,214 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/assert.h"
+#include "core/hid/emulated_console.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/emulated_devices.h"
+#include "core/hid/hid_core.h"
+
+namespace Core::HID {
+
+HIDCore::HIDCore()
+ : player_1{std::make_unique<EmulatedController>(NpadIdType::Player1)},
+ player_2{std::make_unique<EmulatedController>(NpadIdType::Player2)},
+ player_3{std::make_unique<EmulatedController>(NpadIdType::Player3)},
+ player_4{std::make_unique<EmulatedController>(NpadIdType::Player4)},
+ player_5{std::make_unique<EmulatedController>(NpadIdType::Player5)},
+ player_6{std::make_unique<EmulatedController>(NpadIdType::Player6)},
+ player_7{std::make_unique<EmulatedController>(NpadIdType::Player7)},
+ player_8{std::make_unique<EmulatedController>(NpadIdType::Player8)},
+ other{std::make_unique<EmulatedController>(NpadIdType::Other)},
+ handheld{std::make_unique<EmulatedController>(NpadIdType::Handheld)},
+ console{std::make_unique<EmulatedConsole>()}, devices{std::make_unique<EmulatedDevices>()} {}
+
+HIDCore::~HIDCore() = default;
+
+EmulatedController* HIDCore::GetEmulatedController(NpadIdType npad_id_type) {
+ switch (npad_id_type) {
+ case NpadIdType::Player1:
+ return player_1.get();
+ case NpadIdType::Player2:
+ return player_2.get();
+ case NpadIdType::Player3:
+ return player_3.get();
+ case NpadIdType::Player4:
+ return player_4.get();
+ case NpadIdType::Player5:
+ return player_5.get();
+ case NpadIdType::Player6:
+ return player_6.get();
+ case NpadIdType::Player7:
+ return player_7.get();
+ case NpadIdType::Player8:
+ return player_8.get();
+ case NpadIdType::Other:
+ return other.get();
+ case NpadIdType::Handheld:
+ return handheld.get();
+ case NpadIdType::Invalid:
+ default:
+ UNREACHABLE_MSG("Invalid NpadIdType={}", npad_id_type);
+ return nullptr;
+ }
+}
+
+const EmulatedController* HIDCore::GetEmulatedController(NpadIdType npad_id_type) const {
+ switch (npad_id_type) {
+ case NpadIdType::Player1:
+ return player_1.get();
+ case NpadIdType::Player2:
+ return player_2.get();
+ case NpadIdType::Player3:
+ return player_3.get();
+ case NpadIdType::Player4:
+ return player_4.get();
+ case NpadIdType::Player5:
+ return player_5.get();
+ case NpadIdType::Player6:
+ return player_6.get();
+ case NpadIdType::Player7:
+ return player_7.get();
+ case NpadIdType::Player8:
+ return player_8.get();
+ case NpadIdType::Other:
+ return other.get();
+ case NpadIdType::Handheld:
+ return handheld.get();
+ case NpadIdType::Invalid:
+ default:
+ UNREACHABLE_MSG("Invalid NpadIdType={}", npad_id_type);
+ return nullptr;
+ }
+}
+EmulatedConsole* HIDCore::GetEmulatedConsole() {
+ return console.get();
+}
+
+const EmulatedConsole* HIDCore::GetEmulatedConsole() const {
+ return console.get();
+}
+
+EmulatedDevices* HIDCore::GetEmulatedDevices() {
+ return devices.get();
+}
+
+const EmulatedDevices* HIDCore::GetEmulatedDevices() const {
+ return devices.get();
+}
+
+EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) {
+ return GetEmulatedController(IndexToNpadIdType(index));
+}
+
+const EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) const {
+ return GetEmulatedController(IndexToNpadIdType(index));
+}
+
+void HIDCore::SetSupportedStyleTag(NpadStyleTag style_tag) {
+ supported_style_tag.raw = style_tag.raw;
+ player_1->SetSupportedNpadStyleTag(supported_style_tag);
+ player_2->SetSupportedNpadStyleTag(supported_style_tag);
+ player_3->SetSupportedNpadStyleTag(supported_style_tag);
+ player_4->SetSupportedNpadStyleTag(supported_style_tag);
+ player_5->SetSupportedNpadStyleTag(supported_style_tag);
+ player_6->SetSupportedNpadStyleTag(supported_style_tag);
+ player_7->SetSupportedNpadStyleTag(supported_style_tag);
+ player_8->SetSupportedNpadStyleTag(supported_style_tag);
+ other->SetSupportedNpadStyleTag(supported_style_tag);
+ handheld->SetSupportedNpadStyleTag(supported_style_tag);
+}
+
+NpadStyleTag HIDCore::GetSupportedStyleTag() const {
+ return supported_style_tag;
+}
+
+s8 HIDCore::GetPlayerCount() const {
+ s8 active_players = 0;
+ for (std::size_t player_index = 0; player_index < available_controllers - 2; ++player_index) {
+ const auto* const controller = GetEmulatedControllerByIndex(player_index);
+ if (controller->IsConnected()) {
+ active_players++;
+ }
+ }
+ return active_players;
+}
+
+NpadIdType HIDCore::GetFirstNpadId() const {
+ for (std::size_t player_index = 0; player_index < available_controllers; ++player_index) {
+ const auto* const controller = GetEmulatedControllerByIndex(player_index);
+ if (controller->IsConnected()) {
+ return controller->GetNpadIdType();
+ }
+ }
+ return NpadIdType::Player1;
+}
+
+NpadIdType HIDCore::GetFirstDisconnectedNpadId() const {
+ for (std::size_t player_index = 0; player_index < available_controllers; ++player_index) {
+ const auto* const controller = GetEmulatedControllerByIndex(player_index);
+ if (!controller->IsConnected()) {
+ return controller->GetNpadIdType();
+ }
+ }
+ return NpadIdType::Player1;
+}
+
+void HIDCore::EnableAllControllerConfiguration() {
+ player_1->EnableConfiguration();
+ player_2->EnableConfiguration();
+ player_3->EnableConfiguration();
+ player_4->EnableConfiguration();
+ player_5->EnableConfiguration();
+ player_6->EnableConfiguration();
+ player_7->EnableConfiguration();
+ player_8->EnableConfiguration();
+ other->EnableConfiguration();
+ handheld->EnableConfiguration();
+}
+
+void HIDCore::DisableAllControllerConfiguration() {
+ player_1->DisableConfiguration();
+ player_2->DisableConfiguration();
+ player_3->DisableConfiguration();
+ player_4->DisableConfiguration();
+ player_5->DisableConfiguration();
+ player_6->DisableConfiguration();
+ player_7->DisableConfiguration();
+ player_8->DisableConfiguration();
+ other->DisableConfiguration();
+ handheld->DisableConfiguration();
+}
+
+void HIDCore::ReloadInputDevices() {
+ player_1->ReloadFromSettings();
+ player_2->ReloadFromSettings();
+ player_3->ReloadFromSettings();
+ player_4->ReloadFromSettings();
+ player_5->ReloadFromSettings();
+ player_6->ReloadFromSettings();
+ player_7->ReloadFromSettings();
+ player_8->ReloadFromSettings();
+ other->ReloadFromSettings();
+ handheld->ReloadFromSettings();
+ console->ReloadFromSettings();
+ devices->ReloadFromSettings();
+}
+
+void HIDCore::UnloadInputDevices() {
+ player_1->UnloadInput();
+ player_2->UnloadInput();
+ player_3->UnloadInput();
+ player_4->UnloadInput();
+ player_5->UnloadInput();
+ player_6->UnloadInput();
+ player_7->UnloadInput();
+ player_8->UnloadInput();
+ other->UnloadInput();
+ handheld->UnloadInput();
+ console->UnloadInput();
+ devices->UnloadInput();
+}
+
+} // namespace Core::HID
diff --git a/src/core/hid/hid_core.h b/src/core/hid/hid_core.h
new file mode 100644
index 000000000..837f7de49
--- /dev/null
+++ b/src/core/hid/hid_core.h
@@ -0,0 +1,82 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+
+#include "core/hid/hid_types.h"
+
+namespace Core::HID {
+class EmulatedConsole;
+class EmulatedController;
+class EmulatedDevices;
+} // namespace Core::HID
+
+namespace Core::HID {
+
+class HIDCore {
+public:
+ explicit HIDCore();
+ ~HIDCore();
+
+ YUZU_NON_COPYABLE(HIDCore);
+ YUZU_NON_MOVEABLE(HIDCore);
+
+ EmulatedController* GetEmulatedController(NpadIdType npad_id_type);
+ const EmulatedController* GetEmulatedController(NpadIdType npad_id_type) const;
+
+ EmulatedController* GetEmulatedControllerByIndex(std::size_t index);
+ const EmulatedController* GetEmulatedControllerByIndex(std::size_t index) const;
+
+ EmulatedConsole* GetEmulatedConsole();
+ const EmulatedConsole* GetEmulatedConsole() const;
+
+ EmulatedDevices* GetEmulatedDevices();
+ const EmulatedDevices* GetEmulatedDevices() const;
+
+ void SetSupportedStyleTag(NpadStyleTag style_tag);
+ NpadStyleTag GetSupportedStyleTag() const;
+
+ /// Counts the connected players from P1-P8
+ s8 GetPlayerCount() const;
+
+ /// Returns the first connected npad id
+ NpadIdType GetFirstNpadId() const;
+
+ /// Returns the first disconnected npad id
+ NpadIdType GetFirstDisconnectedNpadId() const;
+
+ /// Sets all emulated controllers into configuring mode.
+ void EnableAllControllerConfiguration();
+
+ /// Sets all emulated controllers into normal mode.
+ void DisableAllControllerConfiguration();
+
+ /// Reloads all input devices from settings
+ void ReloadInputDevices();
+
+ /// Removes all callbacks from input common
+ void UnloadInputDevices();
+
+ /// Number of emulated controllers
+ static constexpr std::size_t available_controllers{10};
+
+private:
+ std::unique_ptr<EmulatedController> player_1;
+ std::unique_ptr<EmulatedController> player_2;
+ std::unique_ptr<EmulatedController> player_3;
+ std::unique_ptr<EmulatedController> player_4;
+ std::unique_ptr<EmulatedController> player_5;
+ std::unique_ptr<EmulatedController> player_6;
+ std::unique_ptr<EmulatedController> player_7;
+ std::unique_ptr<EmulatedController> player_8;
+ std::unique_ptr<EmulatedController> other;
+ std::unique_ptr<EmulatedController> handheld;
+ std::unique_ptr<EmulatedConsole> console;
+ std::unique_ptr<EmulatedDevices> devices;
+ NpadStyleTag supported_style_tag{NpadStyleSet::All};
+};
+
+} // namespace Core::HID
diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h
new file mode 100644
index 000000000..7c12f01fc
--- /dev/null
+++ b/src/core/hid/hid_types.h
@@ -0,0 +1,635 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "common/bit_field.h"
+#include "common/common_funcs.h"
+#include "common/common_types.h"
+#include "common/point.h"
+#include "common/uuid.h"
+
+namespace Core::HID {
+
+enum class DeviceIndex : u8 {
+ Left = 0,
+ Right = 1,
+ None = 2,
+ MaxDeviceIndex = 3,
+};
+
+// This is nn::hid::NpadButton
+enum class NpadButton : u64 {
+ None = 0,
+ A = 1U << 0,
+ B = 1U << 1,
+ X = 1U << 2,
+ Y = 1U << 3,
+ StickL = 1U << 4,
+ StickR = 1U << 5,
+ L = 1U << 6,
+ R = 1U << 7,
+ ZL = 1U << 8,
+ ZR = 1U << 9,
+ Plus = 1U << 10,
+ Minus = 1U << 11,
+
+ Left = 1U << 12,
+ Up = 1U << 13,
+ Right = 1U << 14,
+ Down = 1U << 15,
+
+ StickLLeft = 1U << 16,
+ StickLUp = 1U << 17,
+ StickLRight = 1U << 18,
+ StickLDown = 1U << 19,
+
+ StickRLeft = 1U << 20,
+ StickRUp = 1U << 21,
+ StickRRight = 1U << 22,
+ StickRDown = 1U << 23,
+
+ LeftSL = 1U << 24,
+ LeftSR = 1U << 25,
+
+ RightSL = 1U << 26,
+ RightSR = 1U << 27,
+
+ Palma = 1U << 28,
+ Verification = 1U << 29,
+ HandheldLeftB = 1U << 30,
+ LagonCLeft = 1U << 31,
+ LagonCUp = 1ULL << 32,
+ LagonCRight = 1ULL << 33,
+ LagonCDown = 1ULL << 34,
+
+ All = 0xFFFFFFFFFFFFFFFFULL,
+};
+DECLARE_ENUM_FLAG_OPERATORS(NpadButton);
+
+enum class KeyboardKeyIndex : u32 {
+ A = 4,
+ B = 5,
+ C = 6,
+ D = 7,
+ E = 8,
+ F = 9,
+ G = 10,
+ H = 11,
+ I = 12,
+ J = 13,
+ K = 14,
+ L = 15,
+ M = 16,
+ N = 17,
+ O = 18,
+ P = 19,
+ Q = 20,
+ R = 21,
+ S = 22,
+ T = 23,
+ U = 24,
+ V = 25,
+ W = 26,
+ X = 27,
+ Y = 28,
+ Z = 29,
+ D1 = 30,
+ D2 = 31,
+ D3 = 32,
+ D4 = 33,
+ D5 = 34,
+ D6 = 35,
+ D7 = 36,
+ D8 = 37,
+ D9 = 38,
+ D0 = 39,
+ Return = 40,
+ Escape = 41,
+ Backspace = 42,
+ Tab = 43,
+ Space = 44,
+ Minus = 45,
+ Plus = 46,
+ OpenBracket = 47,
+ CloseBracket = 48,
+ Pipe = 49,
+ Tilde = 50,
+ Semicolon = 51,
+ Quote = 52,
+ Backquote = 53,
+ Comma = 54,
+ Period = 55,
+ Slash = 56,
+ CapsLock = 57,
+ F1 = 58,
+ F2 = 59,
+ F3 = 60,
+ F4 = 61,
+ F5 = 62,
+ F6 = 63,
+ F7 = 64,
+ F8 = 65,
+ F9 = 66,
+ F10 = 67,
+ F11 = 68,
+ F12 = 69,
+ PrintScreen = 70,
+ ScrollLock = 71,
+ Pause = 72,
+ Insert = 73,
+ Home = 74,
+ PageUp = 75,
+ Delete = 76,
+ End = 77,
+ PageDown = 78,
+ RightArrow = 79,
+ LeftArrow = 80,
+ DownArrow = 81,
+ UpArrow = 82,
+ NumLock = 83,
+ NumPadDivide = 84,
+ NumPadMultiply = 85,
+ NumPadSubtract = 86,
+ NumPadAdd = 87,
+ NumPadEnter = 88,
+ NumPad1 = 89,
+ NumPad2 = 90,
+ NumPad3 = 91,
+ NumPad4 = 92,
+ NumPad5 = 93,
+ NumPad6 = 94,
+ NumPad7 = 95,
+ NumPad8 = 96,
+ NumPad9 = 97,
+ NumPad0 = 98,
+ NumPadDot = 99,
+ Backslash = 100,
+ Application = 101,
+ Power = 102,
+ NumPadEquals = 103,
+ F13 = 104,
+ F14 = 105,
+ F15 = 106,
+ F16 = 107,
+ F17 = 108,
+ F18 = 109,
+ F19 = 110,
+ F20 = 111,
+ F21 = 112,
+ F22 = 113,
+ F23 = 114,
+ F24 = 115,
+ NumPadComma = 133,
+ Ro = 135,
+ KatakanaHiragana = 136,
+ Yen = 137,
+ Henkan = 138,
+ Muhenkan = 139,
+ NumPadCommaPc98 = 140,
+ HangulEnglish = 144,
+ Hanja = 145,
+ Katakana = 146,
+ Hiragana = 147,
+ ZenkakuHankaku = 148,
+ LeftControl = 224,
+ LeftShift = 225,
+ LeftAlt = 226,
+ LeftGui = 227,
+ RightControl = 228,
+ RightShift = 229,
+ RightAlt = 230,
+ RightGui = 231,
+};
+
+// This is nn::hid::NpadIdType
+enum class NpadIdType : u32 {
+ Player1 = 0x0,
+ Player2 = 0x1,
+ Player3 = 0x2,
+ Player4 = 0x3,
+ Player5 = 0x4,
+ Player6 = 0x5,
+ Player7 = 0x6,
+ Player8 = 0x7,
+ Other = 0x10,
+ Handheld = 0x20,
+
+ Invalid = 0xFFFFFFFF,
+};
+
+// This is nn::hid::NpadStyleIndex
+enum class NpadStyleIndex : u8 {
+ None = 0,
+ ProController = 3,
+ Handheld = 4,
+ HandheldNES = 4,
+ JoyconDual = 5,
+ JoyconLeft = 6,
+ JoyconRight = 7,
+ GameCube = 8,
+ Pokeball = 9,
+ NES = 10,
+ SNES = 12,
+ N64 = 13,
+ SegaGenesis = 14,
+ SystemExt = 32,
+ System = 33,
+ MaxNpadType = 34,
+};
+
+// This is nn::hid::NpadStyleSet
+enum class NpadStyleSet : u32 {
+ None = 0,
+ Fullkey = 1U << 0,
+ Handheld = 1U << 1,
+ JoyDual = 1U << 2,
+ JoyLeft = 1U << 3,
+ JoyRight = 1U << 4,
+ Gc = 1U << 5,
+ Palma = 1U << 6,
+ Lark = 1U << 7,
+ HandheldLark = 1U << 8,
+ Lucia = 1U << 9,
+ Lagoon = 1U << 10,
+ Lager = 1U << 11,
+ SystemExt = 1U << 29,
+ System = 1U << 30,
+
+ All = 0xFFFFFFFFU,
+};
+static_assert(sizeof(NpadStyleSet) == 4, "NpadStyleSet is an invalid size");
+
+// This is nn::hid::VibrationDevicePosition
+enum class VibrationDevicePosition : u32 {
+ None = 0,
+ Left = 1,
+ Right = 2,
+};
+
+// This is nn::hid::VibrationDeviceType
+enum class VibrationDeviceType : u32 {
+ Unknown = 0,
+ LinearResonantActuator = 1,
+ GcErm = 2,
+};
+
+// This is nn::hid::VibrationGcErmCommand
+enum class VibrationGcErmCommand : u64 {
+ Stop = 0,
+ Start = 1,
+ StopHard = 2,
+};
+
+// This is nn::hid::NpadStyleTag
+struct NpadStyleTag {
+ union {
+ NpadStyleSet raw{};
+
+ BitField<0, 1, u32> fullkey;
+ BitField<1, 1, u32> handheld;
+ BitField<2, 1, u32> joycon_dual;
+ BitField<3, 1, u32> joycon_left;
+ BitField<4, 1, u32> joycon_right;
+ BitField<5, 1, u32> gamecube;
+ BitField<6, 1, u32> palma;
+ BitField<7, 1, u32> lark;
+ BitField<8, 1, u32> handheld_lark;
+ BitField<9, 1, u32> lucia;
+ BitField<10, 1, u32> lagoon;
+ BitField<11, 1, u32> lager;
+ BitField<29, 1, u32> system_ext;
+ BitField<30, 1, u32> system;
+ };
+};
+static_assert(sizeof(NpadStyleTag) == 4, "NpadStyleTag is an invalid size");
+
+// This is nn::hid::TouchAttribute
+struct TouchAttribute {
+ union {
+ u32 raw{};
+ BitField<0, 1, u32> start_touch;
+ BitField<1, 1, u32> end_touch;
+ };
+};
+static_assert(sizeof(TouchAttribute) == 0x4, "TouchAttribute is an invalid size");
+
+// This is nn::hid::TouchState
+struct TouchState {
+ u64 delta_time;
+ TouchAttribute attribute;
+ u32 finger;
+ Common::Point<u32> position;
+ u32 diameter_x;
+ u32 diameter_y;
+ u32 rotation_angle;
+};
+static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
+
+// This is nn::hid::NpadControllerColor
+struct NpadControllerColor {
+ u32 body;
+ u32 button;
+};
+static_assert(sizeof(NpadControllerColor) == 8, "NpadControllerColor is an invalid size");
+
+// This is nn::hid::AnalogStickState
+struct AnalogStickState {
+ s32 x;
+ s32 y;
+};
+static_assert(sizeof(AnalogStickState) == 8, "AnalogStickState is an invalid size");
+
+// This is nn::hid::server::NpadGcTriggerState
+struct NpadGcTriggerState {
+ s64 sampling_number{};
+ s32 left{};
+ s32 right{};
+};
+static_assert(sizeof(NpadGcTriggerState) == 0x10, "NpadGcTriggerState is an invalid size");
+
+// This is nn::hid::system::NpadBatteryLevel
+using NpadBatteryLevel = u32;
+static_assert(sizeof(NpadBatteryLevel) == 0x4, "NpadBatteryLevel is an invalid size");
+
+// This is nn::hid::system::NpadPowerInfo
+struct NpadPowerInfo {
+ bool is_powered;
+ bool is_charging;
+ INSERT_PADDING_BYTES(0x6);
+ NpadBatteryLevel battery_level;
+};
+static_assert(sizeof(NpadPowerInfo) == 0xC, "NpadPowerInfo is an invalid size");
+
+struct LedPattern {
+ explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) {
+ position1.Assign(light1);
+ position2.Assign(light2);
+ position3.Assign(light3);
+ position4.Assign(light4);
+ }
+ union {
+ u64 raw{};
+ BitField<0, 1, u64> position1;
+ BitField<1, 1, u64> position2;
+ BitField<2, 1, u64> position3;
+ BitField<3, 1, u64> position4;
+ };
+};
+
+struct NpadButtonState {
+ union {
+ NpadButton raw{};
+
+ // Buttons
+ BitField<0, 1, u64> a;
+ BitField<1, 1, u64> b;
+ BitField<2, 1, u64> x;
+ BitField<3, 1, u64> y;
+ BitField<4, 1, u64> stick_l;
+ BitField<5, 1, u64> stick_r;
+ BitField<6, 1, u64> l;
+ BitField<7, 1, u64> r;
+ BitField<8, 1, u64> zl;
+ BitField<9, 1, u64> zr;
+ BitField<10, 1, u64> plus;
+ BitField<11, 1, u64> minus;
+
+ // D-Pad
+ BitField<12, 1, u64> left;
+ BitField<13, 1, u64> up;
+ BitField<14, 1, u64> right;
+ BitField<15, 1, u64> down;
+
+ // Left JoyStick
+ BitField<16, 1, u64> stick_l_left;
+ BitField<17, 1, u64> stick_l_up;
+ BitField<18, 1, u64> stick_l_right;
+ BitField<19, 1, u64> stick_l_down;
+
+ // Right JoyStick
+ BitField<20, 1, u64> stick_r_left;
+ BitField<21, 1, u64> stick_r_up;
+ BitField<22, 1, u64> stick_r_right;
+ BitField<23, 1, u64> stick_r_down;
+
+ BitField<24, 1, u64> left_sl;
+ BitField<25, 1, u64> left_sr;
+
+ BitField<26, 1, u64> right_sl;
+ BitField<27, 1, u64> right_sr;
+
+ BitField<28, 1, u64> palma;
+ BitField<29, 1, u64> verification;
+ BitField<30, 1, u64> handheld_left_b;
+ BitField<31, 1, u64> lagon_c_left;
+ BitField<32, 1, u64> lagon_c_up;
+ BitField<33, 1, u64> lagon_c_right;
+ BitField<34, 1, u64> lagon_c_down;
+ };
+};
+static_assert(sizeof(NpadButtonState) == 0x8, "NpadButtonState has incorrect size.");
+
+// This is nn::hid::DebugPadButton
+struct DebugPadButton {
+ union {
+ u32 raw{};
+ BitField<0, 1, u32> a;
+ BitField<1, 1, u32> b;
+ BitField<2, 1, u32> x;
+ BitField<3, 1, u32> y;
+ BitField<4, 1, u32> l;
+ BitField<5, 1, u32> r;
+ BitField<6, 1, u32> zl;
+ BitField<7, 1, u32> zr;
+ BitField<8, 1, u32> plus;
+ BitField<9, 1, u32> minus;
+ BitField<10, 1, u32> d_left;
+ BitField<11, 1, u32> d_up;
+ BitField<12, 1, u32> d_right;
+ BitField<13, 1, u32> d_down;
+ };
+};
+static_assert(sizeof(DebugPadButton) == 0x4, "DebugPadButton is an invalid size");
+
+// This is nn::hid::ConsoleSixAxisSensorHandle
+struct ConsoleSixAxisSensorHandle {
+ u8 unknown_1;
+ u8 unknown_2;
+ INSERT_PADDING_BYTES_NOINIT(2);
+};
+static_assert(sizeof(ConsoleSixAxisSensorHandle) == 4,
+ "ConsoleSixAxisSensorHandle is an invalid size");
+
+// This is nn::hid::SixAxisSensorHandle
+struct SixAxisSensorHandle {
+ NpadStyleIndex npad_type;
+ u8 npad_id;
+ DeviceIndex device_index;
+ INSERT_PADDING_BYTES_NOINIT(1);
+};
+static_assert(sizeof(SixAxisSensorHandle) == 4, "SixAxisSensorHandle is an invalid size");
+
+struct SixAxisSensorFusionParameters {
+ f32 parameter1;
+ f32 parameter2;
+};
+static_assert(sizeof(SixAxisSensorFusionParameters) == 8,
+ "SixAxisSensorFusionParameters is an invalid size");
+
+// This is nn::hid::VibrationDeviceHandle
+struct VibrationDeviceHandle {
+ NpadStyleIndex npad_type;
+ u8 npad_id;
+ DeviceIndex device_index;
+ INSERT_PADDING_BYTES_NOINIT(1);
+};
+static_assert(sizeof(VibrationDeviceHandle) == 4, "SixAxisSensorHandle is an invalid size");
+
+// This is nn::hid::VibrationValue
+struct VibrationValue {
+ f32 low_amplitude;
+ f32 low_frequency;
+ f32 high_amplitude;
+ f32 high_frequency;
+};
+static_assert(sizeof(VibrationValue) == 0x10, "VibrationValue has incorrect size.");
+
+// This is nn::hid::VibrationDeviceInfo
+struct VibrationDeviceInfo {
+ VibrationDeviceType type{};
+ VibrationDevicePosition position{};
+};
+static_assert(sizeof(VibrationDeviceInfo) == 0x8, "VibrationDeviceInfo has incorrect size.");
+
+// This is nn::hid::KeyboardModifier
+struct KeyboardModifier {
+ union {
+ u32 raw{};
+ BitField<0, 1, u32> control;
+ BitField<1, 1, u32> shift;
+ BitField<2, 1, u32> left_alt;
+ BitField<3, 1, u32> right_alt;
+ BitField<4, 1, u32> gui;
+ BitField<8, 1, u32> caps_lock;
+ BitField<9, 1, u32> scroll_lock;
+ BitField<10, 1, u32> num_lock;
+ BitField<11, 1, u32> katakana;
+ BitField<12, 1, u32> hiragana;
+ };
+};
+
+static_assert(sizeof(KeyboardModifier) == 0x4, "KeyboardModifier is an invalid size");
+
+// This is nn::hid::KeyboardAttribute
+struct KeyboardAttribute {
+ union {
+ u32 raw{};
+ BitField<0, 1, u32> is_connected;
+ };
+};
+static_assert(sizeof(KeyboardAttribute) == 0x4, "KeyboardAttribute is an invalid size");
+
+// This is nn::hid::KeyboardKey
+struct KeyboardKey {
+ // This should be a 256 bit flag
+ std::array<u8, 32> key;
+};
+static_assert(sizeof(KeyboardKey) == 0x20, "KeyboardKey is an invalid size");
+
+// This is nn::hid::MouseButton
+struct MouseButton {
+ union {
+ u32_le raw{};
+ BitField<0, 1, u32> left;
+ BitField<1, 1, u32> right;
+ BitField<2, 1, u32> middle;
+ BitField<3, 1, u32> forward;
+ BitField<4, 1, u32> back;
+ };
+};
+static_assert(sizeof(MouseButton) == 0x4, "MouseButton is an invalid size");
+
+// This is nn::hid::MouseAttribute
+struct MouseAttribute {
+ union {
+ u32 raw{};
+ BitField<0, 1, u32> transferable;
+ BitField<1, 1, u32> is_connected;
+ };
+};
+static_assert(sizeof(MouseAttribute) == 0x4, "MouseAttribute is an invalid size");
+
+// This is nn::hid::detail::MouseState
+struct MouseState {
+ s64 sampling_number;
+ s32 x;
+ s32 y;
+ s32 delta_x;
+ s32 delta_y;
+ // Axis Order in HW is switched for the wheel
+ s32 delta_wheel_y;
+ s32 delta_wheel_x;
+ MouseButton button;
+ MouseAttribute attribute;
+};
+static_assert(sizeof(MouseState) == 0x28, "MouseState is an invalid size");
+
+/// Converts a NpadIdType to an array index.
+constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
+ switch (npad_id_type) {
+ case NpadIdType::Player1:
+ return 0;
+ case NpadIdType::Player2:
+ return 1;
+ case NpadIdType::Player3:
+ return 2;
+ case NpadIdType::Player4:
+ return 3;
+ case NpadIdType::Player5:
+ return 4;
+ case NpadIdType::Player6:
+ return 5;
+ case NpadIdType::Player7:
+ return 6;
+ case NpadIdType::Player8:
+ return 7;
+ case NpadIdType::Handheld:
+ return 8;
+ case NpadIdType::Other:
+ return 9;
+ default:
+ return 0;
+ }
+}
+
+/// Converts an array index to a NpadIdType
+constexpr NpadIdType IndexToNpadIdType(size_t index) {
+ switch (index) {
+ case 0:
+ return NpadIdType::Player1;
+ case 1:
+ return NpadIdType::Player2;
+ case 2:
+ return NpadIdType::Player3;
+ case 3:
+ return NpadIdType::Player4;
+ case 4:
+ return NpadIdType::Player5;
+ case 5:
+ return NpadIdType::Player6;
+ case 6:
+ return NpadIdType::Player7;
+ case 7:
+ return NpadIdType::Player8;
+ case 8:
+ return NpadIdType::Handheld;
+ case 9:
+ return NpadIdType::Other;
+ default:
+ return NpadIdType::Invalid;
+ }
+}
+
+} // namespace Core::HID
diff --git a/src/core/hid/input_converter.cpp b/src/core/hid/input_converter.cpp
new file mode 100644
index 000000000..f5acff6e0
--- /dev/null
+++ b/src/core/hid/input_converter.cpp
@@ -0,0 +1,383 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include <random>
+
+#include "common/input.h"
+#include "core/hid/input_converter.h"
+
+namespace Core::HID {
+
+Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackStatus& callback) {
+ Common::Input::BatteryStatus battery{Common::Input::BatteryStatus::None};
+ switch (callback.type) {
+ case Common::Input::InputType::Analog:
+ case Common::Input::InputType::Trigger: {
+ const auto value = TransformToTrigger(callback).analog.value;
+ battery = Common::Input::BatteryLevel::Empty;
+ if (value > 0.2f) {
+ battery = Common::Input::BatteryLevel::Critical;
+ }
+ if (value > 0.4f) {
+ battery = Common::Input::BatteryLevel::Low;
+ }
+ if (value > 0.6f) {
+ battery = Common::Input::BatteryLevel::Medium;
+ }
+ if (value > 0.8f) {
+ battery = Common::Input::BatteryLevel::Full;
+ }
+ if (value >= 1.0f) {
+ battery = Common::Input::BatteryLevel::Charging;
+ }
+ break;
+ }
+ case Common::Input::InputType::Button:
+ battery = callback.button_status.value ? Common::Input::BatteryLevel::Charging
+ : Common::Input::BatteryLevel::Critical;
+ break;
+ case Common::Input::InputType::Battery:
+ battery = callback.battery_status;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to battery not implemented", callback.type);
+ break;
+ }
+
+ return battery;
+}
+
+Common::Input::ButtonStatus TransformToButton(const Common::Input::CallbackStatus& callback) {
+ Common::Input::ButtonStatus status{};
+ switch (callback.type) {
+ case Common::Input::InputType::Analog:
+ case Common::Input::InputType::Trigger:
+ status.value = TransformToTrigger(callback).pressed.value;
+ break;
+ case Common::Input::InputType::Button:
+ status = callback.button_status;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to button not implemented", callback.type);
+ break;
+ }
+
+ if (status.inverted) {
+ status.value = !status.value;
+ }
+
+ return status;
+}
+
+Common::Input::MotionStatus TransformToMotion(const Common::Input::CallbackStatus& callback) {
+ Common::Input::MotionStatus status{};
+ switch (callback.type) {
+ case Common::Input::InputType::Button: {
+ Common::Input::AnalogProperties properties{
+ .deadzone = 0.0f,
+ .range = 1.0f,
+ .offset = 0.0f,
+ };
+ status.delta_timestamp = 5000;
+ status.force_update = true;
+ status.accel.x = {
+ .value = 0.0f,
+ .raw_value = 0.0f,
+ .properties = properties,
+ };
+ status.accel.y = {
+ .value = 0.0f,
+ .raw_value = 0.0f,
+ .properties = properties,
+ };
+ status.accel.z = {
+ .value = 0.0f,
+ .raw_value = -1.0f,
+ .properties = properties,
+ };
+ status.gyro.x = {
+ .value = 0.0f,
+ .raw_value = 0.0f,
+ .properties = properties,
+ };
+ status.gyro.y = {
+ .value = 0.0f,
+ .raw_value = 0.0f,
+ .properties = properties,
+ };
+ status.gyro.z = {
+ .value = 0.0f,
+ .raw_value = 0.0f,
+ .properties = properties,
+ };
+ if (TransformToButton(callback).value) {
+ std::random_device device;
+ std::mt19937 gen(device());
+ std::uniform_int_distribution<s16> distribution(-1000, 1000);
+ status.accel.x.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ status.accel.y.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ status.accel.z.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ status.gyro.x.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ status.gyro.y.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ status.gyro.z.raw_value = static_cast<f32>(distribution(gen)) * 0.001f;
+ }
+ break;
+ }
+ case Common::Input::InputType::Motion:
+ status = callback.motion_status;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to motion not implemented", callback.type);
+ break;
+ }
+ SanitizeAnalog(status.accel.x, false);
+ SanitizeAnalog(status.accel.y, false);
+ SanitizeAnalog(status.accel.z, false);
+ SanitizeAnalog(status.gyro.x, false);
+ SanitizeAnalog(status.gyro.y, false);
+ SanitizeAnalog(status.gyro.z, false);
+
+ return status;
+}
+
+Common::Input::StickStatus TransformToStick(const Common::Input::CallbackStatus& callback) {
+ Common::Input::StickStatus status{};
+
+ switch (callback.type) {
+ case Common::Input::InputType::Stick:
+ status = callback.stick_status;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to stick not implemented", callback.type);
+ break;
+ }
+
+ SanitizeStick(status.x, status.y, true);
+ const auto& properties_x = status.x.properties;
+ const auto& properties_y = status.y.properties;
+ const float x = status.x.value;
+ const float y = status.y.value;
+
+ // Set directional buttons
+ status.right = x > properties_x.threshold;
+ status.left = x < -properties_x.threshold;
+ status.up = y > properties_y.threshold;
+ status.down = y < -properties_y.threshold;
+
+ return status;
+}
+
+Common::Input::TouchStatus TransformToTouch(const Common::Input::CallbackStatus& callback) {
+ Common::Input::TouchStatus status{};
+
+ switch (callback.type) {
+ case Common::Input::InputType::Touch:
+ status = callback.touch_status;
+ break;
+ case Common::Input::InputType::Stick:
+ status.x = callback.stick_status.x;
+ status.y = callback.stick_status.y;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to touch not implemented", callback.type);
+ break;
+ }
+
+ SanitizeAnalog(status.x, true);
+ SanitizeAnalog(status.y, true);
+ float& x = status.x.value;
+ float& y = status.y.value;
+
+ // Adjust if value is inverted
+ x = status.x.properties.inverted ? 1.0f + x : x;
+ y = status.y.properties.inverted ? 1.0f + y : y;
+
+ // clamp value
+ x = std::clamp(x, 0.0f, 1.0f);
+ y = std::clamp(y, 0.0f, 1.0f);
+
+ if (status.pressed.inverted) {
+ status.pressed.value = !status.pressed.value;
+ }
+
+ return status;
+}
+
+Common::Input::TriggerStatus TransformToTrigger(const Common::Input::CallbackStatus& callback) {
+ Common::Input::TriggerStatus status{};
+ float& raw_value = status.analog.raw_value;
+ bool calculate_button_value = true;
+
+ switch (callback.type) {
+ case Common::Input::InputType::Analog:
+ status.analog.properties = callback.analog_status.properties;
+ raw_value = callback.analog_status.raw_value;
+ break;
+ case Common::Input::InputType::Button:
+ status.analog.properties.range = 1.0f;
+ status.analog.properties.inverted = callback.button_status.inverted;
+ raw_value = callback.button_status.value ? 1.0f : 0.0f;
+ break;
+ case Common::Input::InputType::Trigger:
+ status = callback.trigger_status;
+ calculate_button_value = false;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to trigger not implemented", callback.type);
+ break;
+ }
+
+ SanitizeAnalog(status.analog, true);
+ const auto& properties = status.analog.properties;
+ float& value = status.analog.value;
+
+ // Set button status
+ if (calculate_button_value) {
+ status.pressed.value = value > properties.threshold;
+ }
+
+ // Adjust if value is inverted
+ value = properties.inverted ? 1.0f + value : value;
+
+ // clamp value
+ value = std::clamp(value, 0.0f, 1.0f);
+
+ return status;
+}
+
+Common::Input::AnalogStatus TransformToAnalog(const Common::Input::CallbackStatus& callback) {
+ Common::Input::AnalogStatus status{};
+
+ switch (callback.type) {
+ case Common::Input::InputType::Analog:
+ status.properties = callback.analog_status.properties;
+ status.raw_value = callback.analog_status.raw_value;
+ break;
+ default:
+ LOG_ERROR(Input, "Conversion from type {} to analog not implemented", callback.type);
+ break;
+ }
+
+ SanitizeAnalog(status, false);
+
+ // Adjust if value is inverted
+ status.value = status.properties.inverted ? -status.value : status.value;
+
+ return status;
+}
+
+void SanitizeAnalog(Common::Input::AnalogStatus& analog, bool clamp_value) {
+ const auto& properties = analog.properties;
+ float& raw_value = analog.raw_value;
+ float& value = analog.value;
+
+ if (!std::isnormal(raw_value)) {
+ raw_value = 0;
+ }
+
+ // Apply center offset
+ raw_value -= properties.offset;
+
+ // Set initial values to be formated
+ value = raw_value;
+
+ // Calculate vector size
+ const float r = std::abs(value);
+
+ // Return zero if value is smaller than the deadzone
+ if (r <= properties.deadzone || properties.deadzone == 1.0f) {
+ analog.value = 0;
+ return;
+ }
+
+ // Adjust range of value
+ const float deadzone_factor =
+ 1.0f / r * (r - properties.deadzone) / (1.0f - properties.deadzone);
+ value = value * deadzone_factor / properties.range;
+
+ // Invert direction if needed
+ if (properties.inverted) {
+ value = -value;
+ }
+
+ // Clamp value
+ if (clamp_value) {
+ value = std::clamp(value, -1.0f, 1.0f);
+ }
+}
+
+void SanitizeStick(Common::Input::AnalogStatus& analog_x, Common::Input::AnalogStatus& analog_y,
+ bool clamp_value) {
+ const auto& properties_x = analog_x.properties;
+ const auto& properties_y = analog_y.properties;
+ float& raw_x = analog_x.raw_value;
+ float& raw_y = analog_y.raw_value;
+ float& x = analog_x.value;
+ float& y = analog_y.value;
+
+ if (!std::isnormal(raw_x)) {
+ raw_x = 0;
+ }
+ if (!std::isnormal(raw_y)) {
+ raw_y = 0;
+ }
+
+ // Apply center offset
+ raw_x += properties_x.offset;
+ raw_y += properties_y.offset;
+
+ // Apply X scale correction from offset
+ if (std::abs(properties_x.offset) < 0.5f) {
+ if (raw_x > 0) {
+ raw_x /= 1 + properties_x.offset;
+ } else {
+ raw_x /= 1 - properties_x.offset;
+ }
+ }
+
+ // Apply Y scale correction from offset
+ if (std::abs(properties_y.offset) < 0.5f) {
+ if (raw_y > 0) {
+ raw_y /= 1 + properties_y.offset;
+ } else {
+ raw_y /= 1 - properties_y.offset;
+ }
+ }
+
+ // Invert direction if needed
+ raw_x = properties_x.inverted ? -raw_x : raw_x;
+ raw_y = properties_y.inverted ? -raw_y : raw_y;
+
+ // Set initial values to be formated
+ x = raw_x;
+ y = raw_y;
+
+ // Calculate vector size
+ float r = x * x + y * y;
+ r = std::sqrt(r);
+
+ // TODO(German77): Use deadzone and range of both axis
+
+ // Return zero if values are smaller than the deadzone
+ if (r <= properties_x.deadzone || properties_x.deadzone >= 1.0f) {
+ x = 0;
+ y = 0;
+ return;
+ }
+
+ // Adjust range of joystick
+ const float deadzone_factor =
+ 1.0f / r * (r - properties_x.deadzone) / (1.0f - properties_x.deadzone);
+ x = x * deadzone_factor / properties_x.range;
+ y = y * deadzone_factor / properties_x.range;
+ r = r * deadzone_factor / properties_x.range;
+
+ // Normalize joystick
+ if (clamp_value && r > 1.0f) {
+ x /= r;
+ y /= r;
+ }
+}
+
+} // namespace Core::HID
diff --git a/src/core/hid/input_converter.h b/src/core/hid/input_converter.h
new file mode 100644
index 000000000..d24582226
--- /dev/null
+++ b/src/core/hid/input_converter.h
@@ -0,0 +1,96 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+namespace Common::Input {
+struct CallbackStatus;
+enum class BatteryLevel : u32;
+using BatteryStatus = BatteryLevel;
+struct AnalogStatus;
+struct ButtonStatus;
+struct MotionStatus;
+struct StickStatus;
+struct TouchStatus;
+struct TriggerStatus;
+}; // namespace Common::Input
+
+namespace Core::HID {
+
+/**
+ * Converts raw input data into a valid battery status.
+ *
+ * @param callback Supported callbacks: Analog, Battery, Trigger.
+ * @return A valid BatteryStatus object.
+ */
+Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid button status. Applies invert properties to the output.
+ *
+ * @param callback Supported callbacks: Analog, Button, Trigger.
+ * @return A valid TouchStatus object.
+ */
+Common::Input::ButtonStatus TransformToButton(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid motion status.
+ *
+ * @param callback Supported callbacks: Motion.
+ * @return A valid TouchStatus object.
+ */
+Common::Input::MotionStatus TransformToMotion(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid stick status. Applies offset, deadzone, range and invert
+ * properties to the output.
+ *
+ * @param callback Supported callbacks: Stick.
+ * @return A valid StickStatus object.
+ */
+Common::Input::StickStatus TransformToStick(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid touch status.
+ *
+ * @param callback Supported callbacks: Touch.
+ * @return A valid TouchStatus object.
+ */
+Common::Input::TouchStatus TransformToTouch(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid trigger status. Applies offset, deadzone, range and
+ * invert properties to the output. Button status uses the threshold property if necessary.
+ *
+ * @param callback Supported callbacks: Analog, Button, Trigger.
+ * @return A valid TriggerStatus object.
+ */
+Common::Input::TriggerStatus TransformToTrigger(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw input data into a valid analog status. Applies offset, deadzone, range and
+ * invert properties to the output.
+ *
+ * @param callback Supported callbacks: Analog.
+ * @return A valid AnalogStatus object.
+ */
+Common::Input::AnalogStatus TransformToAnalog(const Common::Input::CallbackStatus& callback);
+
+/**
+ * Converts raw analog data into a valid analog value
+ * @param analog An analog object containing raw data and properties
+ * @param clamp_value determines if the value needs to be clamped between -1.0f and 1.0f.
+ */
+void SanitizeAnalog(Common::Input::AnalogStatus& analog, bool clamp_value);
+
+/**
+ * Converts raw stick data into a valid stick value
+ * @param analog_x raw analog data and properties for the x-axis
+ * @param analog_y raw analog data and properties for the y-axis
+ * @param clamp_value bool that determines if the value needs to be clamped into the unit circle.
+ */
+void SanitizeStick(Common::Input::AnalogStatus& analog_x, Common::Input::AnalogStatus& analog_y,
+ bool clamp_value);
+
+} // namespace Core::HID
diff --git a/src/core/frontend/input_interpreter.cpp b/src/core/hid/input_interpreter.cpp
index 9f6a90e8f..2dbda8814 100644
--- a/src/core/frontend/input_interpreter.cpp
+++ b/src/core/hid/input_interpreter.cpp
@@ -3,7 +3,8 @@
// Refer to the license.txt file included.
#include "core/core.h"
-#include "core/frontend/input_interpreter.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/input_interpreter.h"
#include "core/hle/service/hid/controllers/npad.h"
#include "core/hle/service/hid/hid.h"
#include "core/hle/service/sm/sm.h"
@@ -19,7 +20,7 @@ InputInterpreter::InputInterpreter(Core::System& system)
InputInterpreter::~InputInterpreter() = default;
void InputInterpreter::PollInput() {
- const u32 button_state = npad.GetAndResetPressState();
+ const auto button_state = npad.GetAndResetPressState();
previous_index = current_index;
current_index = (current_index + 1) % button_states.size();
@@ -31,32 +32,30 @@ void InputInterpreter::ResetButtonStates() {
previous_index = 0;
current_index = 0;
- button_states[0] = 0xFFFFFFFF;
+ button_states[0] = Core::HID::NpadButton::All;
for (std::size_t i = 1; i < button_states.size(); ++i) {
- button_states[i] = 0;
+ button_states[i] = Core::HID::NpadButton::None;
}
}
-bool InputInterpreter::IsButtonPressed(HIDButton button) const {
- return (button_states[current_index] & (1U << static_cast<u8>(button))) != 0;
+bool InputInterpreter::IsButtonPressed(Core::HID::NpadButton button) const {
+ return True(button_states[current_index] & button);
}
-bool InputInterpreter::IsButtonPressedOnce(HIDButton button) const {
- const bool current_press =
- (button_states[current_index] & (1U << static_cast<u8>(button))) != 0;
- const bool previous_press =
- (button_states[previous_index] & (1U << static_cast<u8>(button))) != 0;
+bool InputInterpreter::IsButtonPressedOnce(Core::HID::NpadButton button) const {
+ const bool current_press = True(button_states[current_index] & button);
+ const bool previous_press = True(button_states[previous_index] & button);
return current_press && !previous_press;
}
-bool InputInterpreter::IsButtonHeld(HIDButton button) const {
- u32 held_buttons{button_states[0]};
+bool InputInterpreter::IsButtonHeld(Core::HID::NpadButton button) const {
+ Core::HID::NpadButton held_buttons{button_states[0]};
for (std::size_t i = 1; i < button_states.size(); ++i) {
held_buttons &= button_states[i];
}
- return (held_buttons & (1U << static_cast<u8>(button))) != 0;
+ return True(held_buttons & button);
}
diff --git a/src/core/frontend/input_interpreter.h b/src/core/hid/input_interpreter.h
index 9495e3daf..70c34d474 100644
--- a/src/core/frontend/input_interpreter.h
+++ b/src/core/hid/input_interpreter.h
@@ -12,46 +12,14 @@ namespace Core {
class System;
}
+namespace Core::HID {
+enum class NpadButton : u64;
+}
+
namespace Service::HID {
class Controller_NPad;
}
-enum class HIDButton : u8 {
- A,
- B,
- X,
- Y,
- LStick,
- RStick,
- L,
- R,
- ZL,
- ZR,
- Plus,
- Minus,
-
- DLeft,
- DUp,
- DRight,
- DDown,
-
- LStickLeft,
- LStickUp,
- LStickRight,
- LStickDown,
-
- RStickLeft,
- RStickUp,
- RStickRight,
- RStickDown,
-
- LeftSL,
- LeftSR,
-
- RightSL,
- RightSR,
-};
-
/**
* The InputInterpreter class interfaces with HID to retrieve button press states.
* Input is intended to be polled every 50ms so that a button is considered to be
@@ -76,7 +44,7 @@ public:
*
* @returns True when the button is pressed.
*/
- [[nodiscard]] bool IsButtonPressed(HIDButton button) const;
+ [[nodiscard]] bool IsButtonPressed(Core::HID::NpadButton button) const;
/**
* Checks whether any of the buttons in the parameter list is pressed.
@@ -85,7 +53,7 @@ public:
*
* @returns True when at least one of the buttons is pressed.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
[[nodiscard]] bool IsAnyButtonPressed() {
return (IsButtonPressed(T) || ...);
}
@@ -98,7 +66,7 @@ public:
*
* @returns True when the button is pressed once.
*/
- [[nodiscard]] bool IsButtonPressedOnce(HIDButton button) const;
+ [[nodiscard]] bool IsButtonPressedOnce(Core::HID::NpadButton button) const;
/**
* Checks whether any of the buttons in the parameter list is pressed once.
@@ -107,7 +75,7 @@ public:
*
* @returns True when at least one of the buttons is pressed once.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
[[nodiscard]] bool IsAnyButtonPressedOnce() const {
return (IsButtonPressedOnce(T) || ...);
}
@@ -119,7 +87,7 @@ public:
*
* @returns True when the button is held down.
*/
- [[nodiscard]] bool IsButtonHeld(HIDButton button) const;
+ [[nodiscard]] bool IsButtonHeld(Core::HID::NpadButton button) const;
/**
* Checks whether any of the buttons in the parameter list is held down.
@@ -128,7 +96,7 @@ public:
*
* @returns True when at least one of the buttons is held down.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
[[nodiscard]] bool IsAnyButtonHeld() const {
return (IsButtonHeld(T) || ...);
}
@@ -137,7 +105,7 @@ private:
Service::HID::Controller_NPad& npad;
/// Stores 9 consecutive button states polled from HID.
- std::array<u32, 9> button_states{};
+ std::array<Core::HID::NpadButton, 9> button_states{};
std::size_t previous_index{};
std::size_t current_index{};
diff --git a/src/input_common/motion_input.cpp b/src/core/hid/motion_input.cpp
index 1c9d561c0..c25fea966 100644
--- a/src/input_common/motion_input.cpp
+++ b/src/core/hid/motion_input.cpp
@@ -2,13 +2,21 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included
-#include <random>
#include "common/math_util.h"
-#include "input_common/motion_input.h"
+#include "core/hid/motion_input.h"
-namespace InputCommon {
+namespace Core::HID {
-MotionInput::MotionInput(f32 new_kp, f32 new_ki, f32 new_kd) : kp(new_kp), ki(new_ki), kd(new_kd) {}
+MotionInput::MotionInput() {
+ // Initialize PID constants with default values
+ SetPID(0.3f, 0.005f, 0.0f);
+}
+
+void MotionInput::SetPID(f32 new_kp, f32 new_ki, f32 new_kd) {
+ kp = new_kp;
+ ki = new_ki;
+ kd = new_kd;
+}
void MotionInput::SetAcceleration(const Common::Vec3f& acceleration) {
accel = acceleration;
@@ -65,6 +73,8 @@ void MotionInput::UpdateRotation(u64 elapsed_time) {
rotations += gyro * sample_period;
}
+// Based on Madgwick's implementation of Mayhony's AHRS algorithm.
+// https://github.com/xioTechnologies/Open-Source-AHRS-With-x-IMU/blob/master/x-IMU%20IMU%20and%20AHRS%20Algorithms/x-IMU%20IMU%20and%20AHRS%20Algorithms/AHRS/MahonyAHRS.cs
void MotionInput::UpdateOrientation(u64 elapsed_time) {
if (!IsCalibrated(0.1f)) {
ResetOrientation();
@@ -190,43 +200,6 @@ Common::Vec3f MotionInput::GetRotations() const {
return rotations;
}
-Input::MotionStatus MotionInput::GetMotion() const {
- const Common::Vec3f gyroscope = GetGyroscope();
- const Common::Vec3f accelerometer = GetAcceleration();
- const Common::Vec3f rotation = GetRotations();
- const std::array<Common::Vec3f, 3> orientation = GetOrientation();
- const Common::Quaternion<f32> quaternion = GetQuaternion();
- return {accelerometer, gyroscope, rotation, orientation, quaternion};
-}
-
-Input::MotionStatus MotionInput::GetRandomMotion(int accel_magnitude, int gyro_magnitude) const {
- std::random_device device;
- std::mt19937 gen(device());
- std::uniform_int_distribution<s16> distribution(-1000, 1000);
- const Common::Vec3f gyroscope{
- static_cast<f32>(distribution(gen)) * 0.001f,
- static_cast<f32>(distribution(gen)) * 0.001f,
- static_cast<f32>(distribution(gen)) * 0.001f,
- };
- const Common::Vec3f accelerometer{
- static_cast<f32>(distribution(gen)) * 0.001f,
- static_cast<f32>(distribution(gen)) * 0.001f,
- static_cast<f32>(distribution(gen)) * 0.001f,
- };
- constexpr Common::Vec3f rotation;
- constexpr std::array orientation{
- Common::Vec3f{1.0f, 0.0f, 0.0f},
- Common::Vec3f{0.0f, 1.0f, 0.0f},
- Common::Vec3f{0.0f, 0.0f, 1.0f},
- };
- constexpr Common::Quaternion<f32> quaternion{
- {0.0f, 0.0f, 0.0f},
- 1.0f,
- };
- return {accelerometer * accel_magnitude, gyroscope * gyro_magnitude, rotation, orientation,
- quaternion};
-}
-
void MotionInput::ResetOrientation() {
if (!reset_enabled || only_accelerometer) {
return;
@@ -304,4 +277,4 @@ void MotionInput::SetOrientationFromAccelerometer() {
quat = quat.Normalized();
}
}
-} // namespace InputCommon
+} // namespace Core::HID
diff --git a/src/input_common/motion_input.h b/src/core/hid/motion_input.h
index efe74cf19..5b5b420bb 100644
--- a/src/input_common/motion_input.h
+++ b/src/core/hid/motion_input.h
@@ -7,13 +7,12 @@
#include "common/common_types.h"
#include "common/quaternion.h"
#include "common/vector_math.h"
-#include "core/frontend/input.h"
-namespace InputCommon {
+namespace Core::HID {
class MotionInput {
public:
- explicit MotionInput(f32 new_kp, f32 new_ki, f32 new_kd);
+ explicit MotionInput();
MotionInput(const MotionInput&) = default;
MotionInput& operator=(const MotionInput&) = default;
@@ -21,6 +20,7 @@ public:
MotionInput(MotionInput&&) = default;
MotionInput& operator=(MotionInput&&) = default;
+ void SetPID(f32 new_kp, f32 new_ki, f32 new_kd);
void SetAcceleration(const Common::Vec3f& acceleration);
void SetGyroscope(const Common::Vec3f& gyroscope);
void SetQuaternion(const Common::Quaternion<f32>& quaternion);
@@ -38,9 +38,6 @@ public:
[[nodiscard]] Common::Vec3f GetGyroscope() const;
[[nodiscard]] Common::Vec3f GetRotations() const;
[[nodiscard]] Common::Quaternion<f32> GetQuaternion() const;
- [[nodiscard]] Input::MotionStatus GetMotion() const;
- [[nodiscard]] Input::MotionStatus GetRandomMotion(int accel_magnitude,
- int gyro_magnitude) const;
[[nodiscard]] bool IsMoving(f32 sensitivity) const;
[[nodiscard]] bool IsCalibrated(f32 sensitivity) const;
@@ -59,16 +56,32 @@ private:
Common::Vec3f integral_error;
Common::Vec3f derivative_error;
+ // Quaternion containing the device orientation
Common::Quaternion<f32> quat{{0.0f, 0.0f, -1.0f}, 0.0f};
+
+ // Number of full rotations in each axis
Common::Vec3f rotations;
+
+ // Acceleration vector measurement in G force
Common::Vec3f accel;
+
+ // Gyroscope vector measurement in radians/s.
Common::Vec3f gyro;
+
+ // Vector to be substracted from gyro measurements
Common::Vec3f gyro_drift;
+ // Minimum gyro amplitude to detect if the device is moving
f32 gyro_threshold = 0.0f;
+
+ // Number of invalid sequential data
u32 reset_counter = 0;
+
+ // If the provided data is invalid the device will be autocalibrated
bool reset_enabled = true;
+
+ // Use accelerometer values to calculate position
bool only_accelerometer = true;
};
-} // namespace InputCommon
+} // namespace Core::HID
diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp
index 8ff0f695d..36fc0944a 100644
--- a/src/core/hle/kernel/init/init_slab_setup.cpp
+++ b/src/core/hle/kernel/init/init_slab_setup.cpp
@@ -9,6 +9,7 @@
#include "core/core.h"
#include "core/hardware_properties.h"
#include "core/hle/kernel/init/init_slab_setup.h"
+#include "core/hle/kernel/k_code_memory.h"
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_memory_layout.h"
#include "core/hle/kernel/k_memory_manager.h"
@@ -32,6 +33,7 @@ namespace Kernel::Init {
HANDLER(KPort, (SLAB_COUNT(KPort)), ##__VA_ARGS__) \
HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__) \
HANDLER(KTransferMemory, (SLAB_COUNT(KTransferMemory)), ##__VA_ARGS__) \
+ HANDLER(KCodeMemory, (SLAB_COUNT(KCodeMemory)), ##__VA_ARGS__) \
HANDLER(KSession, (SLAB_COUNT(KSession)), ##__VA_ARGS__) \
HANDLER(KResourceLimit, (SLAB_COUNT(KResourceLimit)), ##__VA_ARGS__)
diff --git a/src/core/hle/kernel/k_address_arbiter.cpp b/src/core/hle/kernel/k_address_arbiter.cpp
index 1b429bc1e..783c69858 100644
--- a/src/core/hle/kernel/k_address_arbiter.cpp
+++ b/src/core/hle/kernel/k_address_arbiter.cpp
@@ -8,6 +8,7 @@
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/svc_results.h"
#include "core/hle/kernel/time_manager.h"
@@ -28,7 +29,7 @@ bool ReadFromUser(Core::System& system, s32* out, VAddr address) {
bool DecrementIfLessThan(Core::System& system, s32* out, VAddr address, s32 value) {
auto& monitor = system.Monitor();
- const auto current_core = system.CurrentCoreIndex();
+ const auto current_core = system.Kernel().CurrentPhysicalCoreIndex();
// TODO(bunnei): We should disable interrupts here via KScopedInterruptDisable.
// TODO(bunnei): We should call CanAccessAtomic(..) here.
@@ -58,7 +59,7 @@ bool DecrementIfLessThan(Core::System& system, s32* out, VAddr address, s32 valu
bool UpdateIfEqual(Core::System& system, s32* out, VAddr address, s32 value, s32 new_value) {
auto& monitor = system.Monitor();
- const auto current_core = system.CurrentCoreIndex();
+ const auto current_core = system.Kernel().CurrentPhysicalCoreIndex();
// TODO(bunnei): We should disable interrupts here via KScopedInterruptDisable.
// TODO(bunnei): We should call CanAccessAtomic(..) here.
@@ -85,6 +86,27 @@ bool UpdateIfEqual(Core::System& system, s32* out, VAddr address, s32 value, s32
return true;
}
+class ThreadQueueImplForKAddressArbiter final : public KThreadQueue {
+public:
+ explicit ThreadQueueImplForKAddressArbiter(KernelCore& kernel_, KAddressArbiter::ThreadTree* t)
+ : KThreadQueue(kernel_), m_tree(t) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // If the thread is waiting on an address arbiter, remove it from the tree.
+ if (waiting_thread->IsWaitingForAddressArbiter()) {
+ m_tree->erase(m_tree->iterator_to(*waiting_thread));
+ waiting_thread->ClearAddressArbiter();
+ }
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+
+private:
+ KAddressArbiter::ThreadTree* m_tree;
+};
+
} // namespace
ResultCode KAddressArbiter::Signal(VAddr addr, s32 count) {
@@ -96,14 +118,14 @@ ResultCode KAddressArbiter::Signal(VAddr addr, s32 count) {
auto it = thread_tree.nfind_light({addr, -1});
while ((it != thread_tree.end()) && (count <= 0 || num_waiters < count) &&
(it->GetAddressArbiterKey() == addr)) {
+ // End the thread's wait.
KThread* target_thread = std::addressof(*it);
- target_thread->SetSyncedObject(nullptr, ResultSuccess);
+ target_thread->EndWait(ResultSuccess);
ASSERT(target_thread->IsWaitingForAddressArbiter());
- target_thread->Wakeup();
+ target_thread->ClearAddressArbiter();
it = thread_tree.erase(it);
- target_thread->ClearAddressArbiter();
++num_waiters;
}
}
@@ -129,14 +151,14 @@ ResultCode KAddressArbiter::SignalAndIncrementIfEqual(VAddr addr, s32 value, s32
auto it = thread_tree.nfind_light({addr, -1});
while ((it != thread_tree.end()) && (count <= 0 || num_waiters < count) &&
(it->GetAddressArbiterKey() == addr)) {
+ // End the thread's wait.
KThread* target_thread = std::addressof(*it);
- target_thread->SetSyncedObject(nullptr, ResultSuccess);
+ target_thread->EndWait(ResultSuccess);
ASSERT(target_thread->IsWaitingForAddressArbiter());
- target_thread->Wakeup();
+ target_thread->ClearAddressArbiter();
it = thread_tree.erase(it);
- target_thread->ClearAddressArbiter();
++num_waiters;
}
}
@@ -197,14 +219,14 @@ ResultCode KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(VAddr addr, s32
while ((it != thread_tree.end()) && (count <= 0 || num_waiters < count) &&
(it->GetAddressArbiterKey() == addr)) {
+ // End the thread's wait.
KThread* target_thread = std::addressof(*it);
- target_thread->SetSyncedObject(nullptr, ResultSuccess);
+ target_thread->EndWait(ResultSuccess);
ASSERT(target_thread->IsWaitingForAddressArbiter());
- target_thread->Wakeup();
+ target_thread->ClearAddressArbiter();
it = thread_tree.erase(it);
- target_thread->ClearAddressArbiter();
++num_waiters;
}
}
@@ -214,6 +236,7 @@ ResultCode KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(VAddr addr, s32
ResultCode KAddressArbiter::WaitIfLessThan(VAddr addr, s32 value, bool decrement, s64 timeout) {
// Prepare to wait.
KThread* cur_thread = kernel.CurrentScheduler()->GetCurrentThread();
+ ThreadQueueImplForKAddressArbiter wait_queue(kernel, std::addressof(thread_tree));
{
KScopedSchedulerLockAndSleep slp{kernel, cur_thread, timeout};
@@ -224,9 +247,6 @@ ResultCode KAddressArbiter::WaitIfLessThan(VAddr addr, s32 value, bool decrement
return ResultTerminationRequested;
}
- // Set the synced object.
- cur_thread->SetSyncedObject(nullptr, ResultTimedOut);
-
// Read the value from userspace.
s32 user_value{};
bool succeeded{};
@@ -256,31 +276,20 @@ ResultCode KAddressArbiter::WaitIfLessThan(VAddr addr, s32 value, bool decrement
// Set the arbiter.
cur_thread->SetAddressArbiter(&thread_tree, addr);
thread_tree.insert(*cur_thread);
- cur_thread->SetState(ThreadState::Waiting);
- cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Arbitration);
- }
-
- // Cancel the timer wait.
- kernel.TimeManager().UnscheduleTimeEvent(cur_thread);
- // Remove from the address arbiter.
- {
- KScopedSchedulerLock sl(kernel);
-
- if (cur_thread->IsWaitingForAddressArbiter()) {
- thread_tree.erase(thread_tree.iterator_to(*cur_thread));
- cur_thread->ClearAddressArbiter();
- }
+ // Wait for the thread to finish.
+ cur_thread->BeginWait(std::addressof(wait_queue));
+ cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Arbitration);
}
// Get the result.
- KSynchronizationObject* dummy{};
- return cur_thread->GetWaitResult(&dummy);
+ return cur_thread->GetWaitResult();
}
ResultCode KAddressArbiter::WaitIfEqual(VAddr addr, s32 value, s64 timeout) {
// Prepare to wait.
KThread* cur_thread = kernel.CurrentScheduler()->GetCurrentThread();
+ ThreadQueueImplForKAddressArbiter wait_queue(kernel, std::addressof(thread_tree));
{
KScopedSchedulerLockAndSleep slp{kernel, cur_thread, timeout};
@@ -291,9 +300,6 @@ ResultCode KAddressArbiter::WaitIfEqual(VAddr addr, s32 value, s64 timeout) {
return ResultTerminationRequested;
}
- // Set the synced object.
- cur_thread->SetSyncedObject(nullptr, ResultTimedOut);
-
// Read the value from userspace.
s32 user_value{};
if (!ReadFromUser(system, &user_value, addr)) {
@@ -316,26 +322,14 @@ ResultCode KAddressArbiter::WaitIfEqual(VAddr addr, s32 value, s64 timeout) {
// Set the arbiter.
cur_thread->SetAddressArbiter(&thread_tree, addr);
thread_tree.insert(*cur_thread);
- cur_thread->SetState(ThreadState::Waiting);
- cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Arbitration);
- }
-
- // Cancel the timer wait.
- kernel.TimeManager().UnscheduleTimeEvent(cur_thread);
- // Remove from the address arbiter.
- {
- KScopedSchedulerLock sl(kernel);
-
- if (cur_thread->IsWaitingForAddressArbiter()) {
- thread_tree.erase(thread_tree.iterator_to(*cur_thread));
- cur_thread->ClearAddressArbiter();
- }
+ // Wait for the thread to finish.
+ cur_thread->BeginWait(std::addressof(wait_queue));
+ cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Arbitration);
}
// Get the result.
- KSynchronizationObject* dummy{};
- return cur_thread->GetWaitResult(&dummy);
+ return cur_thread->GetWaitResult();
}
} // namespace Kernel
diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h
index e4fcdbc67..165b76747 100644
--- a/src/core/hle/kernel/k_auto_object.h
+++ b/src/core/hle/kernel/k_auto_object.h
@@ -170,6 +170,10 @@ public:
}
}
+ const std::string& GetName() const {
+ return name;
+ }
+
private:
void RegisterWithKernel();
void UnregisterWithKernel();
diff --git a/src/core/hle/kernel/k_class_token.cpp b/src/core/hle/kernel/k_class_token.cpp
index 0be0027be..21e2fe494 100644
--- a/src/core/hle/kernel/k_class_token.cpp
+++ b/src/core/hle/kernel/k_class_token.cpp
@@ -6,6 +6,7 @@
#include "core/hle/kernel/k_class_token.h"
#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_client_session.h"
+#include "core/hle/kernel/k_code_memory.h"
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_port.h"
#include "core/hle/kernel/k_process.h"
@@ -48,7 +49,7 @@ static_assert(ClassToken<KWritableEvent> == 0b10001001'00000000);
static_assert(ClassToken<KTransferMemory> == 0b10010001'00000000);
// static_assert(ClassToken<KDeviceAddressSpace> == 0b01100001'00000000);
// static_assert(ClassToken<KSessionRequest> == 0b10100001'00000000);
-// static_assert(ClassToken<KCodeMemory> == 0b11000001'00000000);
+static_assert(ClassToken<KCodeMemory> == 0b11000001'00000000);
// Ensure that the token hierarchy is correct.
@@ -79,7 +80,7 @@ static_assert(ClassToken<KWritableEvent> == ((0b10001001 << 8) | ClassToken<KAut
static_assert(ClassToken<KTransferMemory> == ((0b10010001 << 8) | ClassToken<KAutoObject>));
// static_assert(ClassToken<KDeviceAddressSpace> == ((0b01100001 << 8) | ClassToken<KAutoObject>));
// static_assert(ClassToken<KSessionRequest> == ((0b10100001 << 8) | ClassToken<KAutoObject>));
-// static_assert(ClassToken<KCodeMemory> == ((0b11000001 << 8) | ClassToken<KAutoObject>));
+static_assert(ClassToken<KCodeMemory> == ((0b11000001 << 8) | ClassToken<KAutoObject>));
// Ensure that the token hierarchy reflects the class hierarchy.
diff --git a/src/core/hle/kernel/k_code_memory.cpp b/src/core/hle/kernel/k_code_memory.cpp
new file mode 100644
index 000000000..d69f7ffb7
--- /dev/null
+++ b/src/core/hle/kernel/k_code_memory.cpp
@@ -0,0 +1,146 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/common_types.h"
+#include "core/device_memory.h"
+#include "core/hle/kernel/k_auto_object.h"
+#include "core/hle/kernel/k_code_memory.h"
+#include "core/hle/kernel/k_light_lock.h"
+#include "core/hle/kernel/k_memory_block.h"
+#include "core/hle/kernel/k_page_linked_list.h"
+#include "core/hle/kernel/k_page_table.h"
+#include "core/hle/kernel/k_process.h"
+#include "core/hle/kernel/slab_helpers.h"
+#include "core/hle/kernel/svc_types.h"
+#include "core/hle/result.h"
+
+namespace Kernel {
+
+KCodeMemory::KCodeMemory(KernelCore& kernel_)
+ : KAutoObjectWithSlabHeapAndContainer{kernel_}, m_lock(kernel_) {}
+
+ResultCode KCodeMemory::Initialize(Core::DeviceMemory& device_memory, VAddr addr, size_t size) {
+ // Set members.
+ m_owner = kernel.CurrentProcess();
+
+ // Get the owner page table.
+ auto& page_table = m_owner->PageTable();
+
+ // Construct the page group.
+ KMemoryInfo kBlockInfo = page_table.QueryInfo(addr);
+ m_page_group = KPageLinkedList(kBlockInfo.GetAddress(), kBlockInfo.GetNumPages());
+
+ // Lock the memory.
+ R_TRY(page_table.LockForCodeMemory(addr, size))
+
+ // Clear the memory.
+ for (const auto& block : m_page_group.Nodes()) {
+ std::memset(device_memory.GetPointer(block.GetAddress()), 0xFF, block.GetSize());
+ }
+
+ // Set remaining tracking members.
+ m_address = addr;
+ m_is_initialized = true;
+ m_is_owner_mapped = false;
+ m_is_mapped = false;
+
+ // We succeeded.
+ return ResultSuccess;
+}
+
+void KCodeMemory::Finalize() {
+ // Unlock.
+ if (!m_is_mapped && !m_is_owner_mapped) {
+ const size_t size = m_page_group.GetNumPages() * PageSize;
+ m_owner->PageTable().UnlockForCodeMemory(m_address, size);
+ }
+}
+
+ResultCode KCodeMemory::Map(VAddr address, size_t size) {
+ // Validate the size.
+ R_UNLESS(m_page_group.GetNumPages() == Common::DivideUp(size, PageSize), ResultInvalidSize);
+
+ // Lock ourselves.
+ KScopedLightLock lk(m_lock);
+
+ // Ensure we're not already mapped.
+ R_UNLESS(!m_is_mapped, ResultInvalidState);
+
+ // Map the memory.
+ R_TRY(kernel.CurrentProcess()->PageTable().MapPages(
+ address, m_page_group, KMemoryState::CodeOut, KMemoryPermission::UserReadWrite));
+
+ // Mark ourselves as mapped.
+ m_is_mapped = true;
+
+ return ResultSuccess;
+}
+
+ResultCode KCodeMemory::Unmap(VAddr address, size_t size) {
+ // Validate the size.
+ R_UNLESS(m_page_group.GetNumPages() == Common::DivideUp(size, PageSize), ResultInvalidSize);
+
+ // Lock ourselves.
+ KScopedLightLock lk(m_lock);
+
+ // Unmap the memory.
+ R_TRY(kernel.CurrentProcess()->PageTable().UnmapPages(address, m_page_group,
+ KMemoryState::CodeOut));
+
+ // Mark ourselves as unmapped.
+ m_is_mapped = false;
+
+ return ResultSuccess;
+}
+
+ResultCode KCodeMemory::MapToOwner(VAddr address, size_t size, Svc::MemoryPermission perm) {
+ // Validate the size.
+ R_UNLESS(m_page_group.GetNumPages() == Common::DivideUp(size, PageSize), ResultInvalidSize);
+
+ // Lock ourselves.
+ KScopedLightLock lk(m_lock);
+
+ // Ensure we're not already mapped.
+ R_UNLESS(!m_is_owner_mapped, ResultInvalidState);
+
+ // Convert the memory permission.
+ KMemoryPermission k_perm{};
+ switch (perm) {
+ case Svc::MemoryPermission::Read:
+ k_perm = KMemoryPermission::UserRead;
+ break;
+ case Svc::MemoryPermission::ReadExecute:
+ k_perm = KMemoryPermission::UserReadExecute;
+ break;
+ default:
+ break;
+ }
+
+ // Map the memory.
+ R_TRY(
+ m_owner->PageTable().MapPages(address, m_page_group, KMemoryState::GeneratedCode, k_perm));
+
+ // Mark ourselves as mapped.
+ m_is_owner_mapped = true;
+
+ return ResultSuccess;
+}
+
+ResultCode KCodeMemory::UnmapFromOwner(VAddr address, size_t size) {
+ // Validate the size.
+ R_UNLESS(m_page_group.GetNumPages() == Common::DivideUp(size, PageSize), ResultInvalidSize);
+
+ // Lock ourselves.
+ KScopedLightLock lk(m_lock);
+
+ // Unmap the memory.
+ R_TRY(m_owner->PageTable().UnmapPages(address, m_page_group, KMemoryState::GeneratedCode));
+
+ // Mark ourselves as unmapped.
+ m_is_owner_mapped = false;
+
+ return ResultSuccess;
+}
+
+} // namespace Kernel \ No newline at end of file
diff --git a/src/core/hle/kernel/k_code_memory.h b/src/core/hle/kernel/k_code_memory.h
new file mode 100644
index 000000000..e0ba19a53
--- /dev/null
+++ b/src/core/hle/kernel/k_code_memory.h
@@ -0,0 +1,66 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "common/common_types.h"
+#include "core/device_memory.h"
+#include "core/hle/kernel/k_auto_object.h"
+#include "core/hle/kernel/k_light_lock.h"
+#include "core/hle/kernel/k_page_linked_list.h"
+#include "core/hle/kernel/k_process.h"
+#include "core/hle/kernel/slab_helpers.h"
+#include "core/hle/kernel/svc_types.h"
+#include "core/hle/result.h"
+
+namespace Kernel {
+
+enum class CodeMemoryOperation : u32 {
+ Map = 0,
+ MapToOwner = 1,
+ Unmap = 2,
+ UnmapFromOwner = 3,
+};
+
+class KCodeMemory final
+ : public KAutoObjectWithSlabHeapAndContainer<KCodeMemory, KAutoObjectWithList> {
+ KERNEL_AUTOOBJECT_TRAITS(KCodeMemory, KAutoObject);
+
+public:
+ explicit KCodeMemory(KernelCore& kernel_);
+
+ ResultCode Initialize(Core::DeviceMemory& device_memory, VAddr address, size_t size);
+ void Finalize();
+
+ ResultCode Map(VAddr address, size_t size);
+ ResultCode Unmap(VAddr address, size_t size);
+ ResultCode MapToOwner(VAddr address, size_t size, Svc::MemoryPermission perm);
+ ResultCode UnmapFromOwner(VAddr address, size_t size);
+
+ bool IsInitialized() const {
+ return m_is_initialized;
+ }
+ static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
+
+ KProcess* GetOwner() const {
+ return m_owner;
+ }
+ VAddr GetSourceAddress() const {
+ return m_address;
+ }
+ size_t GetSize() const {
+ return m_is_initialized ? m_page_group.GetNumPages() * PageSize : 0;
+ }
+
+private:
+ KPageLinkedList m_page_group{};
+ KProcess* m_owner{};
+ VAddr m_address{};
+ KLightLock m_lock;
+ bool m_is_initialized{};
+ bool m_is_owner_mapped{};
+ bool m_is_mapped{};
+};
+
+} // namespace Kernel
diff --git a/src/core/hle/kernel/k_condition_variable.cpp b/src/core/hle/kernel/k_condition_variable.cpp
index 7fa9b8cc3..aadcc297a 100644
--- a/src/core/hle/kernel/k_condition_variable.cpp
+++ b/src/core/hle/kernel/k_condition_variable.cpp
@@ -11,6 +11,7 @@
#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
#include "core/hle/kernel/k_synchronization_object.h"
#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/svc_common.h"
#include "core/hle/kernel/svc_results.h"
@@ -33,7 +34,7 @@ bool WriteToUser(Core::System& system, VAddr address, const u32* p) {
bool UpdateLockAtomic(Core::System& system, u32* out, VAddr address, u32 if_zero,
u32 new_orr_mask) {
auto& monitor = system.Monitor();
- const auto current_core = system.CurrentCoreIndex();
+ const auto current_core = system.Kernel().CurrentPhysicalCoreIndex();
// Load the value from the address.
const auto expected = monitor.ExclusiveRead32(current_core, address);
@@ -57,6 +58,48 @@ bool UpdateLockAtomic(Core::System& system, u32* out, VAddr address, u32 if_zero
return true;
}
+class ThreadQueueImplForKConditionVariableWaitForAddress final : public KThreadQueue {
+public:
+ explicit ThreadQueueImplForKConditionVariableWaitForAddress(KernelCore& kernel_)
+ : KThreadQueue(kernel_) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Remove the thread as a waiter from its owner.
+ waiting_thread->GetLockOwner()->RemoveWaiter(waiting_thread);
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+};
+
+class ThreadQueueImplForKConditionVariableWaitConditionVariable final : public KThreadQueue {
+private:
+ KConditionVariable::ThreadTree* m_tree;
+
+public:
+ explicit ThreadQueueImplForKConditionVariableWaitConditionVariable(
+ KernelCore& kernel_, KConditionVariable::ThreadTree* t)
+ : KThreadQueue(kernel_), m_tree(t) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Remove the thread as a waiter from its owner.
+ if (KThread* owner = waiting_thread->GetLockOwner(); owner != nullptr) {
+ owner->RemoveWaiter(waiting_thread);
+ }
+
+ // If the thread is waiting on a condvar, remove it from the tree.
+ if (waiting_thread->IsWaitingForConditionVariable()) {
+ m_tree->erase(m_tree->iterator_to(*waiting_thread));
+ waiting_thread->ClearConditionVariable();
+ }
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+};
+
} // namespace
KConditionVariable::KConditionVariable(Core::System& system_)
@@ -78,84 +121,77 @@ ResultCode KConditionVariable::SignalToAddress(VAddr addr) {
// Determine the next tag.
u32 next_value{};
- if (next_owner_thread) {
+ if (next_owner_thread != nullptr) {
next_value = next_owner_thread->GetAddressKeyValue();
if (num_waiters > 1) {
next_value |= Svc::HandleWaitMask;
}
- next_owner_thread->SetSyncedObject(nullptr, ResultSuccess);
- next_owner_thread->Wakeup();
- }
-
- // Write the value to userspace.
- if (!WriteToUser(system, addr, std::addressof(next_value))) {
- if (next_owner_thread) {
- next_owner_thread->SetSyncedObject(nullptr, ResultInvalidCurrentMemory);
+ // Write the value to userspace.
+ ResultCode result{ResultSuccess};
+ if (WriteToUser(system, addr, std::addressof(next_value))) [[likely]] {
+ result = ResultSuccess;
+ } else {
+ result = ResultInvalidCurrentMemory;
}
- return ResultInvalidCurrentMemory;
+ // Signal the next owner thread.
+ next_owner_thread->EndWait(result);
+ return result;
+ } else {
+ // Just write the value to userspace.
+ R_UNLESS(WriteToUser(system, addr, std::addressof(next_value)),
+ ResultInvalidCurrentMemory);
+
+ return ResultSuccess;
}
}
-
- return ResultSuccess;
}
ResultCode KConditionVariable::WaitForAddress(Handle handle, VAddr addr, u32 value) {
KThread* cur_thread = kernel.CurrentScheduler()->GetCurrentThread();
+ ThreadQueueImplForKConditionVariableWaitForAddress wait_queue(kernel);
// Wait for the address.
+ KThread* owner_thread{};
{
- KScopedAutoObject<KThread> owner_thread;
- ASSERT(owner_thread.IsNull());
- {
- KScopedSchedulerLock sl(kernel);
- cur_thread->SetSyncedObject(nullptr, ResultSuccess);
+ KScopedSchedulerLock sl(kernel);
- // Check if the thread should terminate.
- R_UNLESS(!cur_thread->IsTerminationRequested(), ResultTerminationRequested);
+ // Check if the thread should terminate.
+ R_UNLESS(!cur_thread->IsTerminationRequested(), ResultTerminationRequested);
- {
- // Read the tag from userspace.
- u32 test_tag{};
- R_UNLESS(ReadFromUser(system, std::addressof(test_tag), addr),
- ResultInvalidCurrentMemory);
-
- // If the tag isn't the handle (with wait mask), we're done.
- R_UNLESS(test_tag == (handle | Svc::HandleWaitMask), ResultSuccess);
-
- // Get the lock owner thread.
- owner_thread =
- kernel.CurrentProcess()->GetHandleTable().GetObjectWithoutPseudoHandle<KThread>(
- handle);
- R_UNLESS(owner_thread.IsNotNull(), ResultInvalidHandle);
-
- // Update the lock.
- cur_thread->SetAddressKey(addr, value);
- owner_thread->AddWaiter(cur_thread);
- cur_thread->SetState(ThreadState::Waiting);
- cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::ConditionVar);
- cur_thread->SetMutexWaitAddressForDebugging(addr);
- }
- }
- ASSERT(owner_thread.IsNotNull());
- }
+ // Read the tag from userspace.
+ u32 test_tag{};
+ R_UNLESS(ReadFromUser(system, std::addressof(test_tag), addr), ResultInvalidCurrentMemory);
- // Remove the thread as a waiter from the lock owner.
- {
- KScopedSchedulerLock sl(kernel);
- KThread* owner_thread = cur_thread->GetLockOwner();
- if (owner_thread != nullptr) {
- owner_thread->RemoveWaiter(cur_thread);
- }
+ // If the tag isn't the handle (with wait mask), we're done.
+ R_SUCCEED_IF(test_tag != (handle | Svc::HandleWaitMask));
+
+ // Get the lock owner thread.
+ owner_thread = kernel.CurrentProcess()
+ ->GetHandleTable()
+ .GetObjectWithoutPseudoHandle<KThread>(handle)
+ .ReleasePointerUnsafe();
+ R_UNLESS(owner_thread != nullptr, ResultInvalidHandle);
+
+ // Update the lock.
+ cur_thread->SetAddressKey(addr, value);
+ owner_thread->AddWaiter(cur_thread);
+
+ // Begin waiting.
+ cur_thread->BeginWait(std::addressof(wait_queue));
+ cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::ConditionVar);
+ cur_thread->SetMutexWaitAddressForDebugging(addr);
}
+ // Close our reference to the owner thread, now that the wait is over.
+ owner_thread->Close();
+
// Get the wait result.
- KSynchronizationObject* dummy{};
- return cur_thread->GetWaitResult(std::addressof(dummy));
+ return cur_thread->GetWaitResult();
}
-KThread* KConditionVariable::SignalImpl(KThread* thread) {
+void KConditionVariable::SignalImpl(KThread* thread) {
// Check pre-conditions.
ASSERT(kernel.GlobalSchedulerContext().IsLocked());
@@ -169,18 +205,16 @@ KThread* KConditionVariable::SignalImpl(KThread* thread) {
// TODO(bunnei): We should disable interrupts here via KScopedInterruptDisable.
// TODO(bunnei): We should call CanAccessAtomic(..) here.
can_access = true;
- if (can_access) {
+ if (can_access) [[likely]] {
UpdateLockAtomic(system, std::addressof(prev_tag), address, own_tag,
Svc::HandleWaitMask);
}
}
- KThread* thread_to_close = nullptr;
- if (can_access) {
+ if (can_access) [[likely]] {
if (prev_tag == Svc::InvalidHandle) {
// If nobody held the lock previously, we're all good.
- thread->SetSyncedObject(nullptr, ResultSuccess);
- thread->Wakeup();
+ thread->EndWait(ResultSuccess);
} else {
// Get the previous owner.
KThread* owner_thread = kernel.CurrentProcess()
@@ -189,33 +223,22 @@ KThread* KConditionVariable::SignalImpl(KThread* thread) {
static_cast<Handle>(prev_tag & ~Svc::HandleWaitMask))
.ReleasePointerUnsafe();
- if (owner_thread) {
+ if (owner_thread) [[likely]] {
// Add the thread as a waiter on the owner.
owner_thread->AddWaiter(thread);
- thread_to_close = owner_thread;
+ owner_thread->Close();
} else {
// The lock was tagged with a thread that doesn't exist.
- thread->SetSyncedObject(nullptr, ResultInvalidState);
- thread->Wakeup();
+ thread->EndWait(ResultInvalidState);
}
}
} else {
// If the address wasn't accessible, note so.
- thread->SetSyncedObject(nullptr, ResultInvalidCurrentMemory);
- thread->Wakeup();
+ thread->EndWait(ResultInvalidCurrentMemory);
}
-
- return thread_to_close;
}
void KConditionVariable::Signal(u64 cv_key, s32 count) {
- // Prepare for signaling.
- constexpr int MaxThreads = 16;
-
- KLinkedList<KThread> thread_list{kernel};
- std::array<KThread*, MaxThreads> thread_array;
- s32 num_to_close{};
-
// Perform signaling.
s32 num_waiters{};
{
@@ -226,14 +249,7 @@ void KConditionVariable::Signal(u64 cv_key, s32 count) {
(it->GetConditionVariableKey() == cv_key)) {
KThread* target_thread = std::addressof(*it);
- if (KThread* thread = SignalImpl(target_thread); thread != nullptr) {
- if (num_to_close < MaxThreads) {
- thread_array[num_to_close++] = thread;
- } else {
- thread_list.push_back(*thread);
- }
- }
-
+ this->SignalImpl(target_thread);
it = thread_tree.erase(it);
target_thread->ClearConditionVariable();
++num_waiters;
@@ -245,27 +261,16 @@ void KConditionVariable::Signal(u64 cv_key, s32 count) {
WriteToUser(system, cv_key, std::addressof(has_waiter_flag));
}
}
-
- // Close threads in the array.
- for (auto i = 0; i < num_to_close; ++i) {
- thread_array[i]->Close();
- }
-
- // Close threads in the list.
- for (auto it = thread_list.begin(); it != thread_list.end(); it = thread_list.erase(it)) {
- (*it).Close();
- }
}
ResultCode KConditionVariable::Wait(VAddr addr, u64 key, u32 value, s64 timeout) {
// Prepare to wait.
- KThread* cur_thread = kernel.CurrentScheduler()->GetCurrentThread();
+ KThread* cur_thread = GetCurrentThreadPointer(kernel);
+ ThreadQueueImplForKConditionVariableWaitConditionVariable wait_queue(
+ kernel, std::addressof(thread_tree));
{
- KScopedSchedulerLockAndSleep slp{kernel, cur_thread, timeout};
-
- // Set the synced object.
- cur_thread->SetSyncedObject(nullptr, ResultTimedOut);
+ KScopedSchedulerLockAndSleep slp(kernel, cur_thread, timeout);
// Check that the thread isn't terminating.
if (cur_thread->IsTerminationRequested()) {
@@ -290,8 +295,7 @@ ResultCode KConditionVariable::Wait(VAddr addr, u64 key, u32 value, s64 timeout)
}
// Wake up the next owner.
- next_owner_thread->SetSyncedObject(nullptr, ResultSuccess);
- next_owner_thread->Wakeup();
+ next_owner_thread->EndWait(ResultSuccess);
}
// Write to the cv key.
@@ -308,40 +312,21 @@ ResultCode KConditionVariable::Wait(VAddr addr, u64 key, u32 value, s64 timeout)
}
}
- // Update condition variable tracking.
- {
- cur_thread->SetConditionVariable(std::addressof(thread_tree), addr, key, value);
- thread_tree.insert(*cur_thread);
- }
+ // If timeout is zero, time out.
+ R_UNLESS(timeout != 0, ResultTimedOut);
- // If the timeout is non-zero, set the thread as waiting.
- if (timeout != 0) {
- cur_thread->SetState(ThreadState::Waiting);
- cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::ConditionVar);
- cur_thread->SetMutexWaitAddressForDebugging(addr);
- }
- }
-
- // Cancel the timer wait.
- kernel.TimeManager().UnscheduleTimeEvent(cur_thread);
-
- // Remove from the condition variable.
- {
- KScopedSchedulerLock sl(kernel);
-
- if (KThread* owner = cur_thread->GetLockOwner(); owner != nullptr) {
- owner->RemoveWaiter(cur_thread);
- }
+ // Update condition variable tracking.
+ cur_thread->SetConditionVariable(std::addressof(thread_tree), addr, key, value);
+ thread_tree.insert(*cur_thread);
- if (cur_thread->IsWaitingForConditionVariable()) {
- thread_tree.erase(thread_tree.iterator_to(*cur_thread));
- cur_thread->ClearConditionVariable();
- }
+ // Begin waiting.
+ cur_thread->BeginWait(std::addressof(wait_queue));
+ cur_thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::ConditionVar);
+ cur_thread->SetMutexWaitAddressForDebugging(addr);
}
- // Get the result.
- KSynchronizationObject* dummy{};
- return cur_thread->GetWaitResult(std::addressof(dummy));
+ // Get the wait result.
+ return cur_thread->GetWaitResult();
}
} // namespace Kernel
diff --git a/src/core/hle/kernel/k_condition_variable.h b/src/core/hle/kernel/k_condition_variable.h
index 861dbd420..5e4815d08 100644
--- a/src/core/hle/kernel/k_condition_variable.h
+++ b/src/core/hle/kernel/k_condition_variable.h
@@ -34,7 +34,7 @@ public:
[[nodiscard]] ResultCode Wait(VAddr addr, u64 key, u32 value, s64 timeout);
private:
- [[nodiscard]] KThread* SignalImpl(KThread* thread);
+ void SignalImpl(KThread* thread);
ThreadTree thread_tree;
diff --git a/src/core/hle/kernel/k_handle_table.cpp b/src/core/hle/kernel/k_handle_table.cpp
index e90fc0628..cf95f0852 100644
--- a/src/core/hle/kernel/k_handle_table.cpp
+++ b/src/core/hle/kernel/k_handle_table.cpp
@@ -13,6 +13,7 @@ ResultCode KHandleTable::Finalize() {
// Get the table and clear our record of it.
u16 saved_table_size = 0;
{
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
std::swap(m_table_size, saved_table_size);
@@ -43,6 +44,7 @@ bool KHandleTable::Remove(Handle handle) {
// Find the object and free the entry.
KAutoObject* obj = nullptr;
{
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
if (this->IsValidHandle(handle)) {
@@ -62,6 +64,7 @@ bool KHandleTable::Remove(Handle handle) {
}
ResultCode KHandleTable::Add(Handle* out_handle, KAutoObject* obj, u16 type) {
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
// Never exceed our capacity.
@@ -84,6 +87,7 @@ ResultCode KHandleTable::Add(Handle* out_handle, KAutoObject* obj, u16 type) {
}
ResultCode KHandleTable::Reserve(Handle* out_handle) {
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
// Never exceed our capacity.
@@ -94,6 +98,7 @@ ResultCode KHandleTable::Reserve(Handle* out_handle) {
}
void KHandleTable::Unreserve(Handle handle) {
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
// Unpack the handle.
@@ -112,6 +117,7 @@ void KHandleTable::Unreserve(Handle handle) {
}
void KHandleTable::Register(Handle handle, KAutoObject* obj, u16 type) {
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
// Unpack the handle.
diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h
index 95ec905ae..4b114ec2f 100644
--- a/src/core/hle/kernel/k_handle_table.h
+++ b/src/core/hle/kernel/k_handle_table.h
@@ -68,6 +68,7 @@ public:
template <typename T = KAutoObject>
KScopedAutoObject<T> GetObjectWithoutPseudoHandle(Handle handle) const {
// Lock and look up in table.
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
if constexpr (std::is_same_v<T, KAutoObject>) {
@@ -122,6 +123,7 @@ public:
size_t num_opened;
{
// Lock the table.
+ KScopedDisableDispatch dd(kernel);
KScopedSpinLock lk(m_lock);
for (num_opened = 0; num_opened < num_handles; num_opened++) {
// Get the current handle.
diff --git a/src/core/hle/kernel/k_light_condition_variable.cpp b/src/core/hle/kernel/k_light_condition_variable.cpp
new file mode 100644
index 000000000..a8001fffc
--- /dev/null
+++ b/src/core/hle/kernel/k_light_condition_variable.cpp
@@ -0,0 +1,80 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/kernel/k_light_condition_variable.h"
+#include "core/hle/kernel/k_scheduler.h"
+#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
+#include "core/hle/kernel/k_thread_queue.h"
+#include "core/hle/kernel/svc_results.h"
+
+namespace Kernel {
+
+namespace {
+
+class ThreadQueueImplForKLightConditionVariable final : public KThreadQueue {
+public:
+ ThreadQueueImplForKLightConditionVariable(KernelCore& kernel_, KThread::WaiterList* wl,
+ bool term)
+ : KThreadQueue(kernel_), m_wait_list(wl), m_allow_terminating_thread(term) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Only process waits if we're allowed to.
+ if (ResultTerminationRequested == wait_result && m_allow_terminating_thread) {
+ return;
+ }
+
+ // Remove the thread from the waiting thread from the light condition variable.
+ m_wait_list->erase(m_wait_list->iterator_to(*waiting_thread));
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+
+private:
+ KThread::WaiterList* m_wait_list;
+ bool m_allow_terminating_thread;
+};
+
+} // namespace
+
+void KLightConditionVariable::Wait(KLightLock* lock, s64 timeout, bool allow_terminating_thread) {
+ // Create thread queue.
+ KThread* owner = GetCurrentThreadPointer(kernel);
+
+ ThreadQueueImplForKLightConditionVariable wait_queue(kernel, std::addressof(wait_list),
+ allow_terminating_thread);
+
+ // Sleep the thread.
+ {
+ KScopedSchedulerLockAndSleep lk(kernel, owner, timeout);
+
+ if (!allow_terminating_thread && owner->IsTerminationRequested()) {
+ lk.CancelSleep();
+ return;
+ }
+
+ lock->Unlock();
+
+ // Add the thread to the queue.
+ wait_list.push_back(*owner);
+
+ // Begin waiting.
+ owner->BeginWait(std::addressof(wait_queue));
+ }
+
+ // Re-acquire the lock.
+ lock->Lock();
+}
+
+void KLightConditionVariable::Broadcast() {
+ KScopedSchedulerLock lk(kernel);
+
+ // Signal all threads.
+ for (auto it = wait_list.begin(); it != wait_list.end(); it = wait_list.erase(it)) {
+ it->EndWait(ResultSuccess);
+ }
+}
+
+} // namespace Kernel
diff --git a/src/core/hle/kernel/k_light_condition_variable.h b/src/core/hle/kernel/k_light_condition_variable.h
index fb0ad783a..5d6d7f128 100644
--- a/src/core/hle/kernel/k_light_condition_variable.h
+++ b/src/core/hle/kernel/k_light_condition_variable.h
@@ -2,72 +2,24 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-// This file references various implementation details from Atmosphere, an open-source firmware for
-// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
-
#pragma once
#include "common/common_types.h"
-#include "core/hle/kernel/k_scheduler.h"
-#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
-#include "core/hle/kernel/time_manager.h"
+#include "core/hle/kernel/k_thread.h"
namespace Kernel {
+
class KernelCore;
+class KLightLock;
class KLightConditionVariable {
public:
explicit KLightConditionVariable(KernelCore& kernel_) : kernel{kernel_} {}
- void Wait(KLightLock* lock, s64 timeout = -1, bool allow_terminating_thread = true) {
- WaitImpl(lock, timeout, allow_terminating_thread);
- }
-
- void Broadcast() {
- KScopedSchedulerLock lk{kernel};
-
- // Signal all threads.
- for (auto& thread : wait_list) {
- thread.SetState(ThreadState::Runnable);
- }
- }
+ void Wait(KLightLock* lock, s64 timeout = -1, bool allow_terminating_thread = true);
+ void Broadcast();
private:
- void WaitImpl(KLightLock* lock, s64 timeout, bool allow_terminating_thread) {
- KThread* owner = GetCurrentThreadPointer(kernel);
-
- // Sleep the thread.
- {
- KScopedSchedulerLockAndSleep lk{kernel, owner, timeout};
-
- if (!allow_terminating_thread && owner->IsTerminationRequested()) {
- lk.CancelSleep();
- return;
- }
-
- lock->Unlock();
-
- // Set the thread as waiting.
- GetCurrentThread(kernel).SetState(ThreadState::Waiting);
-
- // Add the thread to the queue.
- wait_list.push_back(GetCurrentThread(kernel));
- }
-
- // Remove the thread from the wait list.
- {
- KScopedSchedulerLock sl{kernel};
-
- wait_list.erase(wait_list.iterator_to(GetCurrentThread(kernel)));
- }
-
- // Cancel the task that the sleep setup.
- kernel.TimeManager().UnscheduleTimeEvent(owner);
-
- // Re-acquire the lock.
- lock->Lock();
- }
-
KernelCore& kernel;
KThread::WaiterList wait_list{};
};
diff --git a/src/core/hle/kernel/k_light_lock.cpp b/src/core/hle/kernel/k_light_lock.cpp
index 0896e705f..4620342eb 100644
--- a/src/core/hle/kernel/k_light_lock.cpp
+++ b/src/core/hle/kernel/k_light_lock.cpp
@@ -5,44 +5,59 @@
#include "core/hle/kernel/k_light_lock.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/kernel.h"
namespace Kernel {
+namespace {
+
+class ThreadQueueImplForKLightLock final : public KThreadQueue {
+public:
+ explicit ThreadQueueImplForKLightLock(KernelCore& kernel_) : KThreadQueue(kernel_) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Remove the thread as a waiter from its owner.
+ if (KThread* owner = waiting_thread->GetLockOwner(); owner != nullptr) {
+ owner->RemoveWaiter(waiting_thread);
+ }
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+};
+
+} // namespace
+
void KLightLock::Lock() {
const uintptr_t cur_thread = reinterpret_cast<uintptr_t>(GetCurrentThreadPointer(kernel));
- const uintptr_t cur_thread_tag = (cur_thread | 1);
while (true) {
uintptr_t old_tag = tag.load(std::memory_order_relaxed);
- while (!tag.compare_exchange_weak(old_tag, (old_tag == 0) ? cur_thread : old_tag | 1,
+ while (!tag.compare_exchange_weak(old_tag, (old_tag == 0) ? cur_thread : (old_tag | 1),
std::memory_order_acquire)) {
- if ((old_tag | 1) == cur_thread_tag) {
- return;
- }
}
- if ((old_tag == 0) || ((old_tag | 1) == cur_thread_tag)) {
+ if (old_tag == 0 || this->LockSlowPath(old_tag | 1, cur_thread)) {
break;
}
-
- LockSlowPath(old_tag | 1, cur_thread);
}
}
void KLightLock::Unlock() {
const uintptr_t cur_thread = reinterpret_cast<uintptr_t>(GetCurrentThreadPointer(kernel));
+
uintptr_t expected = cur_thread;
- do {
- if (expected != cur_thread) {
- return UnlockSlowPath(cur_thread);
- }
- } while (!tag.compare_exchange_weak(expected, 0, std::memory_order_release));
+ if (!tag.compare_exchange_strong(expected, 0, std::memory_order_release)) {
+ this->UnlockSlowPath(cur_thread);
+ }
}
-void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
+bool KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
KThread* cur_thread = reinterpret_cast<KThread*>(_cur_thread);
+ ThreadQueueImplForKLightLock wait_queue(kernel);
// Pend the current thread waiting on the owner thread.
{
@@ -50,7 +65,7 @@ void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
// Ensure we actually have locking to do.
if (tag.load(std::memory_order_relaxed) != _owner) {
- return;
+ return false;
}
// Add the current thread as a waiter on the owner.
@@ -58,22 +73,15 @@ void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
cur_thread->SetAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag)));
owner_thread->AddWaiter(cur_thread);
- // Set thread states.
- cur_thread->SetState(ThreadState::Waiting);
+ // Begin waiting to hold the lock.
+ cur_thread->BeginWait(std::addressof(wait_queue));
if (owner_thread->IsSuspended()) {
owner_thread->ContinueIfHasKernelWaiters();
}
}
- // We're no longer waiting on the lock owner.
- {
- KScopedSchedulerLock sl{kernel};
-
- if (KThread* owner_thread = cur_thread->GetLockOwner(); owner_thread != nullptr) {
- owner_thread->RemoveWaiter(cur_thread);
- }
- }
+ return true;
}
void KLightLock::UnlockSlowPath(uintptr_t _cur_thread) {
@@ -81,22 +89,20 @@ void KLightLock::UnlockSlowPath(uintptr_t _cur_thread) {
// Unlock.
{
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl(kernel);
// Get the next owner.
- s32 num_waiters = 0;
+ s32 num_waiters;
KThread* next_owner = owner_thread->RemoveWaiterByKey(
std::addressof(num_waiters), reinterpret_cast<uintptr_t>(std::addressof(tag)));
// Pass the lock to the next owner.
uintptr_t next_tag = 0;
if (next_owner != nullptr) {
- next_tag = reinterpret_cast<uintptr_t>(next_owner);
- if (num_waiters > 1) {
- next_tag |= 0x1;
- }
+ next_tag =
+ reinterpret_cast<uintptr_t>(next_owner) | static_cast<uintptr_t>(num_waiters > 1);
- next_owner->SetState(ThreadState::Runnable);
+ next_owner->EndWait(ResultSuccess);
if (next_owner->IsSuspended()) {
next_owner->ContinueIfHasKernelWaiters();
@@ -110,7 +116,7 @@ void KLightLock::UnlockSlowPath(uintptr_t _cur_thread) {
}
// Write the new tag value.
- tag.store(next_tag);
+ tag.store(next_tag, std::memory_order_release);
}
}
diff --git a/src/core/hle/kernel/k_light_lock.h b/src/core/hle/kernel/k_light_lock.h
index ad853661d..4163b8a85 100644
--- a/src/core/hle/kernel/k_light_lock.h
+++ b/src/core/hle/kernel/k_light_lock.h
@@ -20,7 +20,7 @@ public:
void Unlock();
- void LockSlowPath(uintptr_t owner, uintptr_t cur_thread);
+ bool LockSlowPath(uintptr_t owner, uintptr_t cur_thread);
void UnlockSlowPath(uintptr_t cur_thread);
diff --git a/src/core/hle/kernel/k_memory_block.h b/src/core/hle/kernel/k_memory_block.h
index a7fdb5fb8..fd491146f 100644
--- a/src/core/hle/kernel/k_memory_block.h
+++ b/src/core/hle/kernel/k_memory_block.h
@@ -131,6 +131,26 @@ enum class KMemoryPermission : u8 {
UserMask = static_cast<u8>(Svc::MemoryPermission::Read | Svc::MemoryPermission::Write |
Svc::MemoryPermission::Execute),
+
+ KernelShift = 3,
+
+ KernelRead = Read << KernelShift,
+ KernelWrite = Write << KernelShift,
+ KernelExecute = Execute << KernelShift,
+
+ NotMapped = (1 << (2 * KernelShift)),
+
+ KernelReadWrite = KernelRead | KernelWrite,
+ KernelReadExecute = KernelRead | KernelExecute,
+
+ UserRead = Read | KernelRead,
+ UserWrite = Write | KernelWrite,
+ UserExecute = Execute,
+
+ UserReadWrite = UserRead | UserWrite,
+ UserReadExecute = UserRead | UserExecute,
+
+ IpcLockChangeMask = NotMapped | UserReadWrite
};
DECLARE_ENUM_FLAG_OPERATORS(KMemoryPermission);
diff --git a/src/core/hle/kernel/k_page_linked_list.h b/src/core/hle/kernel/k_page_linked_list.h
index 3362fb236..0e2ae582a 100644
--- a/src/core/hle/kernel/k_page_linked_list.h
+++ b/src/core/hle/kernel/k_page_linked_list.h
@@ -27,6 +27,10 @@ public:
return num_pages;
}
+ constexpr std::size_t GetSize() const {
+ return GetNumPages() * PageSize;
+ }
+
private:
u64 addr{};
std::size_t num_pages{};
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp
index 526b87241..99982e5a3 100644
--- a/src/core/hle/kernel/k_page_table.cpp
+++ b/src/core/hle/kernel/k_page_table.cpp
@@ -368,6 +368,33 @@ ResultCode KPageTable::UnmapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, st
return ResultSuccess;
}
+ResultCode KPageTable::UnmapProcessMemory(VAddr dst_addr, std::size_t size,
+ KPageTable& src_page_table, VAddr src_addr) {
+ std::lock_guard lock{page_table_lock};
+
+ const std::size_t num_pages{size / PageSize};
+
+ // Check that the memory is mapped in the destination process.
+ size_t num_allocator_blocks;
+ R_TRY(CheckMemoryState(&num_allocator_blocks, dst_addr, size, KMemoryState::All,
+ KMemoryState::SharedCode, KMemoryPermission::UserReadWrite,
+ KMemoryPermission::UserReadWrite, KMemoryAttribute::All,
+ KMemoryAttribute::None));
+
+ // Check that the memory is mapped in the source process.
+ R_TRY(src_page_table.CheckMemoryState(src_addr, size, KMemoryState::FlagCanMapProcess,
+ KMemoryState::FlagCanMapProcess, KMemoryPermission::None,
+ KMemoryPermission::None, KMemoryAttribute::All,
+ KMemoryAttribute::None));
+
+ CASCADE_CODE(Operate(dst_addr, num_pages, KMemoryPermission::None, OperationType::Unmap));
+
+ // Apply the memory block update.
+ block_manager->Update(dst_addr, num_pages, KMemoryState::Free, KMemoryPermission::None,
+ KMemoryAttribute::None);
+
+ return ResultSuccess;
+}
void KPageTable::MapPhysicalMemory(KPageLinkedList& page_linked_list, VAddr start, VAddr end) {
auto node{page_linked_list.Nodes().begin()};
PAddr map_addr{node->GetAddress()};
@@ -685,8 +712,8 @@ ResultCode KPageTable::UnmapPages(VAddr addr, KPageLinkedList& page_linked_list,
return ResultSuccess;
}
-ResultCode KPageTable::SetCodeMemoryPermission(VAddr addr, std::size_t size,
- KMemoryPermission perm) {
+ResultCode KPageTable::SetProcessMemoryPermission(VAddr addr, std::size_t size,
+ KMemoryPermission perm) {
std::lock_guard lock{page_table_lock};
@@ -942,6 +969,60 @@ ResultCode KPageTable::UnlockForDeviceAddressSpace(VAddr addr, std::size_t size)
return ResultSuccess;
}
+ResultCode KPageTable::LockForCodeMemory(VAddr addr, std::size_t size) {
+ std::lock_guard lock{page_table_lock};
+
+ KMemoryPermission new_perm = KMemoryPermission::NotMapped | KMemoryPermission::KernelReadWrite;
+
+ KMemoryPermission old_perm{};
+
+ if (const ResultCode result{CheckMemoryState(
+ nullptr, &old_perm, nullptr, addr, size, KMemoryState::FlagCanCodeMemory,
+ KMemoryState::FlagCanCodeMemory, KMemoryPermission::Mask,
+ KMemoryPermission::UserReadWrite, KMemoryAttribute::All, KMemoryAttribute::None)};
+ result.IsError()) {
+ return result;
+ }
+
+ new_perm = (new_perm != KMemoryPermission::None) ? new_perm : old_perm;
+
+ block_manager->UpdateLock(
+ addr, size / PageSize,
+ [](KMemoryBlockManager::iterator block, KMemoryPermission permission) {
+ block->ShareToDevice(permission);
+ },
+ new_perm);
+
+ return ResultSuccess;
+}
+
+ResultCode KPageTable::UnlockForCodeMemory(VAddr addr, std::size_t size) {
+ std::lock_guard lock{page_table_lock};
+
+ KMemoryPermission new_perm = KMemoryPermission::UserReadWrite;
+
+ KMemoryPermission old_perm{};
+
+ if (const ResultCode result{CheckMemoryState(
+ nullptr, &old_perm, nullptr, addr, size, KMemoryState::FlagCanCodeMemory,
+ KMemoryState::FlagCanCodeMemory, KMemoryPermission::None, KMemoryPermission::None,
+ KMemoryAttribute::All, KMemoryAttribute::Locked)};
+ result.IsError()) {
+ return result;
+ }
+
+ new_perm = (new_perm != KMemoryPermission::None) ? new_perm : old_perm;
+
+ block_manager->UpdateLock(
+ addr, size / PageSize,
+ [](KMemoryBlockManager::iterator block, KMemoryPermission permission) {
+ block->UnshareToDevice(permission);
+ },
+ new_perm);
+
+ return ResultSuccess;
+}
+
ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) {
block_manager = std::make_unique<KMemoryBlockManager>(start, end);
@@ -1231,4 +1312,42 @@ ResultCode KPageTable::CheckMemoryState(KMemoryState* out_state, KMemoryPermissi
return ResultSuccess;
}
+ResultCode KPageTable::CheckMemoryState(size_t* out_blocks_needed, VAddr addr, size_t size,
+ KMemoryState state_mask, KMemoryState state,
+ KMemoryPermission perm_mask, KMemoryPermission perm,
+ KMemoryAttribute attr_mask, KMemoryAttribute attr) const {
+ // Get information about the first block.
+ const VAddr last_addr = addr + size - 1;
+ KMemoryBlockManager::const_iterator it{block_manager->FindIterator(addr)};
+ KMemoryInfo info = it->GetMemoryInfo();
+
+ // If the start address isn't aligned, we need a block.
+ const size_t blocks_for_start_align =
+ (Common::AlignDown(addr, PageSize) != info.GetAddress()) ? 1 : 0;
+
+ while (true) {
+ // Validate against the provided masks.
+ R_TRY(CheckMemoryState(info, state_mask, state, perm_mask, perm, attr_mask, attr));
+
+ // Break once we're done.
+ if (last_addr <= info.GetLastAddress()) {
+ break;
+ }
+
+ // Advance our iterator.
+ it++;
+ info = it->GetMemoryInfo();
+ }
+
+ // If the end address isn't aligned, we need a block.
+ const size_t blocks_for_end_align =
+ (Common::AlignUp(addr + size, PageSize) != info.GetEndAddress()) ? 1 : 0;
+
+ if (out_blocks_needed != nullptr) {
+ *out_blocks_needed = blocks_for_start_align + blocks_for_end_align;
+ }
+
+ return ResultSuccess;
+}
+
} // namespace Kernel
diff --git a/src/core/hle/kernel/k_page_table.h b/src/core/hle/kernel/k_page_table.h
index 770c4841c..d784aa67e 100644
--- a/src/core/hle/kernel/k_page_table.h
+++ b/src/core/hle/kernel/k_page_table.h
@@ -33,6 +33,8 @@ public:
KMemoryPermission perm);
ResultCode MapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size);
ResultCode UnmapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size);
+ ResultCode UnmapProcessMemory(VAddr dst_addr, std::size_t size, KPageTable& src_page_table,
+ VAddr src_addr);
ResultCode MapPhysicalMemory(VAddr addr, std::size_t size);
ResultCode UnmapPhysicalMemory(VAddr addr, std::size_t size);
ResultCode UnmapMemory(VAddr addr, std::size_t size);
@@ -41,7 +43,7 @@ public:
ResultCode MapPages(VAddr addr, KPageLinkedList& page_linked_list, KMemoryState state,
KMemoryPermission perm);
ResultCode UnmapPages(VAddr addr, KPageLinkedList& page_linked_list, KMemoryState state);
- ResultCode SetCodeMemoryPermission(VAddr addr, std::size_t size, KMemoryPermission perm);
+ ResultCode SetProcessMemoryPermission(VAddr addr, std::size_t size, KMemoryPermission perm);
KMemoryInfo QueryInfo(VAddr addr);
ResultCode ReserveTransferMemory(VAddr addr, std::size_t size, KMemoryPermission perm);
ResultCode ResetTransferMemory(VAddr addr, std::size_t size);
@@ -55,6 +57,8 @@ public:
KMemoryPermission perm, PAddr map_addr = 0);
ResultCode LockForDeviceAddressSpace(VAddr addr, std::size_t size);
ResultCode UnlockForDeviceAddressSpace(VAddr addr, std::size_t size);
+ ResultCode LockForCodeMemory(VAddr addr, std::size_t size);
+ ResultCode UnlockForCodeMemory(VAddr addr, std::size_t size);
Common::PageTable& PageTableImpl() {
return page_table_impl;
@@ -115,6 +119,10 @@ private:
return CheckMemoryState(nullptr, nullptr, nullptr, addr, size, state_mask, state, perm_mask,
perm, attr_mask, attr, ignore_attr);
}
+ ResultCode CheckMemoryState(size_t* out_blocks_needed, VAddr addr, size_t size,
+ KMemoryState state_mask, KMemoryState state,
+ KMemoryPermission perm_mask, KMemoryPermission perm,
+ KMemoryAttribute attr_mask, KMemoryAttribute attr) const;
std::recursive_mutex page_table_lock;
std::unique_ptr<KMemoryBlockManager> block_manager;
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp
index 76fd8c285..90dda40dc 100644
--- a/src/core/hle/kernel/k_process.cpp
+++ b/src/core/hle/kernel/k_process.cpp
@@ -60,6 +60,7 @@ void SetupMainThread(Core::System& system, KProcess& owner_process, u32 priority
thread->GetContext64().cpu_registers[0] = 0;
thread->GetContext32().cpu_registers[1] = thread_handle;
thread->GetContext64().cpu_registers[1] = thread_handle;
+ thread->DisableDispatch();
auto& kernel = system.Kernel();
// Threads by default are dormant, wake up the main thread so it runs when the scheduler fires
@@ -227,12 +228,15 @@ void KProcess::PinCurrentThread() {
const s32 core_id = GetCurrentCoreId(kernel);
KThread* cur_thread = GetCurrentThreadPointer(kernel);
- // Pin it.
- PinThread(core_id, cur_thread);
- cur_thread->Pin();
+ // If the thread isn't terminated, pin it.
+ if (!cur_thread->IsTerminationRequested()) {
+ // Pin it.
+ PinThread(core_id, cur_thread);
+ cur_thread->Pin();
- // An update is needed.
- KScheduler::SetSchedulerUpdateNeeded(kernel);
+ // An update is needed.
+ KScheduler::SetSchedulerUpdateNeeded(kernel);
+ }
}
void KProcess::UnpinCurrentThread() {
@@ -250,6 +254,20 @@ void KProcess::UnpinCurrentThread() {
KScheduler::SetSchedulerUpdateNeeded(kernel);
}
+void KProcess::UnpinThread(KThread* thread) {
+ ASSERT(kernel.GlobalSchedulerContext().IsLocked());
+
+ // Get the thread's core id.
+ const auto core_id = thread->GetActiveCore();
+
+ // Unpin it.
+ UnpinThread(core_id, thread);
+ thread->Unpin();
+
+ // An update is needed.
+ KScheduler::SetSchedulerUpdateNeeded(kernel);
+}
+
ResultCode KProcess::AddSharedMemory(KSharedMemory* shmem, [[maybe_unused]] VAddr address,
[[maybe_unused]] size_t size) {
// Lock ourselves, to prevent concurrent access.
@@ -528,7 +546,7 @@ void KProcess::LoadModule(CodeSet code_set, VAddr base_addr) {
std::lock_guard lock{HLE::g_hle_lock};
const auto ReprotectSegment = [&](const CodeSet::Segment& segment,
KMemoryPermission permission) {
- page_table->SetCodeMemoryPermission(segment.addr + base_addr, segment.size, permission);
+ page_table->SetProcessMemoryPermission(segment.addr + base_addr, segment.size, permission);
};
kernel.System().Memory().WriteBlock(*this, base_addr, code_set.memory.data(),
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h
index 8a8c1fcbb..cb93c7e24 100644
--- a/src/core/hle/kernel/k_process.h
+++ b/src/core/hle/kernel/k_process.h
@@ -347,6 +347,7 @@ public:
void PinCurrentThread();
void UnpinCurrentThread();
+ void UnpinThread(KThread* thread);
KLightLock& GetStateLock() {
return state_lock;
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp
index 6a7d80d03..277201de4 100644
--- a/src/core/hle/kernel/k_scheduler.cpp
+++ b/src/core/hle/kernel/k_scheduler.cpp
@@ -240,8 +240,8 @@ void KScheduler::OnThreadPriorityChanged(KernelCore& kernel, KThread* thread, s3
// If the thread is runnable, we want to change its priority in the queue.
if (thread->GetRawState() == ThreadState::Runnable) {
- GetPriorityQueue(kernel).ChangePriority(
- old_priority, thread == kernel.CurrentScheduler()->GetCurrentThread(), thread);
+ GetPriorityQueue(kernel).ChangePriority(old_priority,
+ thread == kernel.GetCurrentEmuThread(), thread);
IncrementScheduledCount(thread);
SetSchedulerUpdateNeeded(kernel);
}
@@ -360,7 +360,7 @@ void KScheduler::RotateScheduledQueue(s32 cpu_core_id, s32 priority) {
}
bool KScheduler::CanSchedule(KernelCore& kernel) {
- return kernel.CurrentScheduler()->GetCurrentThread()->GetDisableDispatchCount() <= 1;
+ return kernel.GetCurrentEmuThread()->GetDisableDispatchCount() <= 1;
}
bool KScheduler::IsSchedulerUpdateNeeded(const KernelCore& kernel) {
@@ -376,20 +376,30 @@ void KScheduler::ClearSchedulerUpdateNeeded(KernelCore& kernel) {
}
void KScheduler::DisableScheduling(KernelCore& kernel) {
- if (auto* scheduler = kernel.CurrentScheduler(); scheduler) {
- ASSERT(scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 0);
- scheduler->GetCurrentThread()->DisableDispatch();
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
}
+
+ ASSERT(GetCurrentThreadPointer(kernel)->GetDisableDispatchCount() >= 0);
+ GetCurrentThreadPointer(kernel)->DisableDispatch();
}
void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduling) {
- if (auto* scheduler = kernel.CurrentScheduler(); scheduler) {
- ASSERT(scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 1);
- if (scheduler->GetCurrentThread()->GetDisableDispatchCount() >= 1) {
- scheduler->GetCurrentThread()->EnableDispatch();
- }
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
+ }
+
+ auto* current_thread = GetCurrentThreadPointer(kernel);
+
+ ASSERT(current_thread->GetDisableDispatchCount() >= 1);
+
+ if (current_thread->GetDisableDispatchCount() > 1) {
+ current_thread->EnableDispatch();
+ } else {
+ RescheduleCores(kernel, cores_needing_scheduling);
}
- RescheduleCores(kernel, cores_needing_scheduling);
}
u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) {
@@ -617,13 +627,17 @@ KScheduler::KScheduler(Core::System& system_, s32 core_id_) : system{system_}, c
state.highest_priority_thread = nullptr;
}
-KScheduler::~KScheduler() {
+void KScheduler::Finalize() {
if (idle_thread) {
idle_thread->Close();
idle_thread = nullptr;
}
}
+KScheduler::~KScheduler() {
+ ASSERT(!idle_thread);
+}
+
KThread* KScheduler::GetCurrentThread() const {
if (auto result = current_thread.load(); result) {
return result;
@@ -642,10 +656,12 @@ void KScheduler::RescheduleCurrentCore() {
if (phys_core.IsInterrupted()) {
phys_core.ClearInterrupt();
}
+
guard.Lock();
if (state.needs_scheduling.load()) {
Schedule();
} else {
+ GetCurrentThread()->EnableDispatch();
guard.Unlock();
}
}
@@ -655,26 +671,33 @@ void KScheduler::OnThreadStart() {
}
void KScheduler::Unload(KThread* thread) {
+ ASSERT(thread);
+
LOG_TRACE(Kernel, "core {}, unload thread {}", core_id, thread ? thread->GetName() : "nullptr");
- if (thread) {
- if (thread->IsCallingSvc()) {
- thread->ClearIsCallingSvc();
- }
- if (!thread->IsTerminationRequested()) {
- prev_thread = thread;
-
- Core::ARM_Interface& cpu_core = system.ArmInterface(core_id);
- cpu_core.SaveContext(thread->GetContext32());
- cpu_core.SaveContext(thread->GetContext64());
- // Save the TPIDR_EL0 system register in case it was modified.
- thread->SetTPIDR_EL0(cpu_core.GetTPIDR_EL0());
- cpu_core.ClearExclusiveState();
- } else {
- prev_thread = nullptr;
- }
- thread->context_guard.Unlock();
+ if (thread->IsCallingSvc()) {
+ thread->ClearIsCallingSvc();
+ }
+
+ auto& physical_core = system.Kernel().PhysicalCore(core_id);
+ if (!physical_core.IsInitialized()) {
+ return;
+ }
+
+ Core::ARM_Interface& cpu_core = physical_core.ArmInterface();
+ cpu_core.SaveContext(thread->GetContext32());
+ cpu_core.SaveContext(thread->GetContext64());
+ // Save the TPIDR_EL0 system register in case it was modified.
+ thread->SetTPIDR_EL0(cpu_core.GetTPIDR_EL0());
+ cpu_core.ClearExclusiveState();
+
+ if (!thread->IsTerminationRequested() && thread->GetActiveCore() == core_id) {
+ prev_thread = thread;
+ } else {
+ prev_thread = nullptr;
}
+
+ thread->context_guard.Unlock();
}
void KScheduler::Reload(KThread* thread) {
@@ -683,11 +706,6 @@ void KScheduler::Reload(KThread* thread) {
if (thread) {
ASSERT_MSG(thread->GetState() == ThreadState::Runnable, "Thread must be runnable.");
- auto* const thread_owner_process = thread->GetOwnerProcess();
- if (thread_owner_process != nullptr) {
- system.Kernel().MakeCurrentProcess(thread_owner_process);
- }
-
Core::ARM_Interface& cpu_core = system.ArmInterface(core_id);
cpu_core.LoadContext(thread->GetContext32());
cpu_core.LoadContext(thread->GetContext64());
@@ -705,7 +723,7 @@ void KScheduler::SwitchContextStep2() {
}
void KScheduler::ScheduleImpl() {
- KThread* previous_thread = current_thread.load();
+ KThread* previous_thread = GetCurrentThread();
KThread* next_thread = state.highest_priority_thread;
state.needs_scheduling = false;
@@ -717,10 +735,15 @@ void KScheduler::ScheduleImpl() {
// If we're not actually switching thread, there's nothing to do.
if (next_thread == current_thread.load()) {
+ previous_thread->EnableDispatch();
guard.Unlock();
return;
}
+ if (next_thread->GetCurrentCore() != core_id) {
+ next_thread->SetCurrentCore(core_id);
+ }
+
current_thread.store(next_thread);
KProcess* const previous_process = system.Kernel().CurrentProcess();
@@ -731,11 +754,7 @@ void KScheduler::ScheduleImpl() {
Unload(previous_thread);
std::shared_ptr<Common::Fiber>* old_context;
- if (previous_thread != nullptr) {
- old_context = &previous_thread->GetHostContext();
- } else {
- old_context = &idle_thread->GetHostContext();
- }
+ old_context = &previous_thread->GetHostContext();
guard.Unlock();
Common::Fiber::YieldTo(*old_context, *switch_fiber);
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h
index 7df288438..82fcd99e7 100644
--- a/src/core/hle/kernel/k_scheduler.h
+++ b/src/core/hle/kernel/k_scheduler.h
@@ -33,6 +33,8 @@ public:
explicit KScheduler(Core::System& system_, s32 core_id_);
~KScheduler();
+ void Finalize();
+
/// Reschedules to the next available thread (call after current thread is suspended)
void RescheduleCurrentCore();
diff --git a/src/core/hle/kernel/k_scheduler_lock.h b/src/core/hle/kernel/k_scheduler_lock.h
index c571f2992..93c47f1b1 100644
--- a/src/core/hle/kernel/k_scheduler_lock.h
+++ b/src/core/hle/kernel/k_scheduler_lock.h
@@ -23,6 +23,11 @@ public:
}
void Lock() {
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
+ }
+
if (IsLockedByCurrentThread()) {
// If we already own the lock, we can just increment the count.
ASSERT(lock_count > 0);
@@ -43,6 +48,11 @@ public:
}
void Unlock() {
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
+ }
+
ASSERT(IsLockedByCurrentThread());
ASSERT(lock_count > 0);
diff --git a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
index 61dc2858f..2995c492d 100644
--- a/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
+++ b/src/core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h
@@ -8,6 +8,7 @@
#pragma once
#include "common/common_types.h"
+#include "core/hle/kernel/global_scheduler_context.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/time_manager.h"
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp
index 2bd53ccbd..d4e4a6b06 100644
--- a/src/core/hle/kernel/k_server_session.cpp
+++ b/src/core/hle/kernel/k_server_session.cpp
@@ -175,8 +175,7 @@ ResultCode KServerSession::CompleteSyncRequest(HLERequestContext& context) {
{
KScopedSchedulerLock lock(kernel);
if (!context.IsThreadWaiting()) {
- context.GetThread().Wakeup();
- context.GetThread().SetSyncedObject(nullptr, result);
+ context.GetThread().EndWait(result);
}
}
diff --git a/src/core/hle/kernel/k_synchronization_object.cpp b/src/core/hle/kernel/k_synchronization_object.cpp
index f168b4f21..e4c5eb74f 100644
--- a/src/core/hle/kernel/k_synchronization_object.cpp
+++ b/src/core/hle/kernel/k_synchronization_object.cpp
@@ -8,11 +8,66 @@
#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
#include "core/hle/kernel/k_synchronization_object.h"
#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/svc_results.h"
namespace Kernel {
+namespace {
+
+class ThreadQueueImplForKSynchronizationObjectWait final : public KThreadQueueWithoutEndWait {
+public:
+ ThreadQueueImplForKSynchronizationObjectWait(KernelCore& kernel_, KSynchronizationObject** o,
+ KSynchronizationObject::ThreadListNode* n, s32 c)
+ : KThreadQueueWithoutEndWait(kernel_), m_objects(o), m_nodes(n), m_count(c) {}
+
+ void NotifyAvailable(KThread* waiting_thread, KSynchronizationObject* signaled_object,
+ ResultCode wait_result) override {
+ // Determine the sync index, and unlink all nodes.
+ s32 sync_index = -1;
+ for (auto i = 0; i < m_count; ++i) {
+ // Check if this is the signaled object.
+ if (m_objects[i] == signaled_object && sync_index == -1) {
+ sync_index = i;
+ }
+
+ // Unlink the current node from the current object.
+ m_objects[i]->UnlinkNode(std::addressof(m_nodes[i]));
+ }
+
+ // Set the waiting thread's sync index.
+ waiting_thread->SetSyncedIndex(sync_index);
+
+ // Set the waiting thread as not cancellable.
+ waiting_thread->ClearCancellable();
+
+ // Invoke the base end wait handler.
+ KThreadQueue::EndWait(waiting_thread, wait_result);
+ }
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Remove all nodes from our list.
+ for (auto i = 0; i < m_count; ++i) {
+ m_objects[i]->UnlinkNode(std::addressof(m_nodes[i]));
+ }
+
+ // Set the waiting thread as not cancellable.
+ waiting_thread->ClearCancellable();
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+
+private:
+ KSynchronizationObject** m_objects;
+ KSynchronizationObject::ThreadListNode* m_nodes;
+ s32 m_count;
+};
+
+} // namespace
+
void KSynchronizationObject::Finalize() {
this->OnFinalizeSynchronizationObject();
KAutoObject::Finalize();
@@ -25,11 +80,19 @@ ResultCode KSynchronizationObject::Wait(KernelCore& kernel_ctx, s32* out_index,
std::vector<ThreadListNode> thread_nodes(num_objects);
// Prepare for wait.
- KThread* thread = kernel_ctx.CurrentScheduler()->GetCurrentThread();
+ KThread* thread = GetCurrentThreadPointer(kernel_ctx);
+ ThreadQueueImplForKSynchronizationObjectWait wait_queue(kernel_ctx, objects,
+ thread_nodes.data(), num_objects);
{
// Setup the scheduling lock and sleep.
- KScopedSchedulerLockAndSleep slp{kernel_ctx, thread, timeout};
+ KScopedSchedulerLockAndSleep slp(kernel_ctx, thread, timeout);
+
+ // Check if the thread should terminate.
+ if (thread->IsTerminationRequested()) {
+ slp.CancelSleep();
+ return ResultTerminationRequested;
+ }
// Check if any of the objects are already signaled.
for (auto i = 0; i < num_objects; ++i) {
@@ -48,12 +111,6 @@ ResultCode KSynchronizationObject::Wait(KernelCore& kernel_ctx, s32* out_index,
return ResultTimedOut;
}
- // Check if the thread should terminate.
- if (thread->IsTerminationRequested()) {
- slp.CancelSleep();
- return ResultTerminationRequested;
- }
-
// Check if waiting was canceled.
if (thread->IsWaitCancelled()) {
slp.CancelSleep();
@@ -66,73 +123,25 @@ ResultCode KSynchronizationObject::Wait(KernelCore& kernel_ctx, s32* out_index,
thread_nodes[i].thread = thread;
thread_nodes[i].next = nullptr;
- if (objects[i]->thread_list_tail == nullptr) {
- objects[i]->thread_list_head = std::addressof(thread_nodes[i]);
- } else {
- objects[i]->thread_list_tail->next = std::addressof(thread_nodes[i]);
- }
-
- objects[i]->thread_list_tail = std::addressof(thread_nodes[i]);
+ objects[i]->LinkNode(std::addressof(thread_nodes[i]));
}
- // For debugging only
- thread->SetWaitObjectsForDebugging({objects, static_cast<std::size_t>(num_objects)});
-
- // Mark the thread as waiting.
+ // Mark the thread as cancellable.
thread->SetCancellable();
- thread->SetSyncedObject(nullptr, ResultTimedOut);
- thread->SetState(ThreadState::Waiting);
- thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Synchronization);
- }
- // The lock/sleep is done, so we should be able to get our result.
+ // Clear the thread's synced index.
+ thread->SetSyncedIndex(-1);
- // Thread is no longer cancellable.
- thread->ClearCancellable();
-
- // For debugging only
- thread->SetWaitObjectsForDebugging({});
+ // Wait for an object to be signaled.
+ thread->BeginWait(std::addressof(wait_queue));
+ thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Synchronization);
+ }
- // Cancel the timer as needed.
- kernel_ctx.TimeManager().UnscheduleTimeEvent(thread);
+ // Set the output index.
+ *out_index = thread->GetSyncedIndex();
// Get the wait result.
- ResultCode wait_result{ResultSuccess};
- s32 sync_index = -1;
- {
- KScopedSchedulerLock lock(kernel_ctx);
- KSynchronizationObject* synced_obj;
- wait_result = thread->GetWaitResult(std::addressof(synced_obj));
-
- for (auto i = 0; i < num_objects; ++i) {
- // Unlink the object from the list.
- ThreadListNode* prev_ptr =
- reinterpret_cast<ThreadListNode*>(std::addressof(objects[i]->thread_list_head));
- ThreadListNode* prev_val = nullptr;
- ThreadListNode *prev, *tail_prev;
-
- do {
- prev = prev_ptr;
- prev_ptr = prev_ptr->next;
- tail_prev = prev_val;
- prev_val = prev_ptr;
- } while (prev_ptr != std::addressof(thread_nodes[i]));
-
- if (objects[i]->thread_list_tail == std::addressof(thread_nodes[i])) {
- objects[i]->thread_list_tail = tail_prev;
- }
-
- prev->next = thread_nodes[i].next;
-
- if (objects[i] == synced_obj) {
- sync_index = i;
- }
- }
- }
-
- // Set output.
- *out_index = sync_index;
- return wait_result;
+ return thread->GetWaitResult();
}
KSynchronizationObject::KSynchronizationObject(KernelCore& kernel_)
@@ -141,7 +150,7 @@ KSynchronizationObject::KSynchronizationObject(KernelCore& kernel_)
KSynchronizationObject::~KSynchronizationObject() = default;
void KSynchronizationObject::NotifyAvailable(ResultCode result) {
- KScopedSchedulerLock lock(kernel);
+ KScopedSchedulerLock sl(kernel);
// If we're not signaled, we've nothing to notify.
if (!this->IsSignaled()) {
@@ -150,11 +159,7 @@ void KSynchronizationObject::NotifyAvailable(ResultCode result) {
// Iterate over each thread.
for (auto* cur_node = thread_list_head; cur_node != nullptr; cur_node = cur_node->next) {
- KThread* thread = cur_node->thread;
- if (thread->GetState() == ThreadState::Waiting) {
- thread->SetSyncedObject(this, result);
- thread->SetState(ThreadState::Runnable);
- }
+ cur_node->thread->NotifyAvailable(this, result);
}
}
diff --git a/src/core/hle/kernel/k_synchronization_object.h b/src/core/hle/kernel/k_synchronization_object.h
index 898e58e16..ec235437b 100644
--- a/src/core/hle/kernel/k_synchronization_object.h
+++ b/src/core/hle/kernel/k_synchronization_object.h
@@ -35,6 +35,38 @@ public:
[[nodiscard]] std::vector<KThread*> GetWaitingThreadsForDebugging() const;
+ void LinkNode(ThreadListNode* node_) {
+ // Link the node to the list.
+ if (thread_list_tail == nullptr) {
+ thread_list_head = node_;
+ } else {
+ thread_list_tail->next = node_;
+ }
+
+ thread_list_tail = node_;
+ }
+
+ void UnlinkNode(ThreadListNode* node_) {
+ // Unlink the node from the list.
+ ThreadListNode* prev_ptr =
+ reinterpret_cast<ThreadListNode*>(std::addressof(thread_list_head));
+ ThreadListNode* prev_val = nullptr;
+ ThreadListNode *prev, *tail_prev;
+
+ do {
+ prev = prev_ptr;
+ prev_ptr = prev_ptr->next;
+ tail_prev = prev_val;
+ prev_val = prev_ptr;
+ } while (prev_ptr != node_);
+
+ if (thread_list_tail == node_) {
+ thread_list_tail = tail_prev;
+ }
+
+ prev->next = node_->next;
+ }
+
protected:
explicit KSynchronizationObject(KernelCore& kernel);
~KSynchronizationObject() override;
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index db65ce79a..752592e2e 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -13,6 +13,9 @@
#include "common/common_types.h"
#include "common/fiber.h"
#include "common/logging/log.h"
+#include "common/scope_exit.h"
+#include "common/settings.h"
+#include "common/thread_queue_list.h"
#include "core/core.h"
#include "core/cpu_manager.h"
#include "core/hardware_properties.h"
@@ -56,6 +59,34 @@ static void ResetThreadContext64(Core::ARM_Interface::ThreadContext64& context,
namespace Kernel {
+namespace {
+
+class ThreadQueueImplForKThreadSleep final : public KThreadQueueWithoutEndWait {
+public:
+ explicit ThreadQueueImplForKThreadSleep(KernelCore& kernel_)
+ : KThreadQueueWithoutEndWait(kernel_) {}
+};
+
+class ThreadQueueImplForKThreadSetProperty final : public KThreadQueue {
+public:
+ explicit ThreadQueueImplForKThreadSetProperty(KernelCore& kernel_, KThread::WaiterList* wl)
+ : KThreadQueue(kernel_), m_wait_list(wl) {}
+
+ void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) override {
+ // Remove the thread from the wait list.
+ m_wait_list->erase(m_wait_list->iterator_to(*waiting_thread));
+
+ // Invoke the base cancel wait handler.
+ KThreadQueue::CancelWait(waiting_thread, wait_result, cancel_timer_task);
+ }
+
+private:
+ KThread::WaiterList* m_wait_list;
+};
+
+} // namespace
+
KThread::KThread(KernelCore& kernel_)
: KAutoObjectWithSlabHeapAndContainer{kernel_}, activity_pause_lock{kernel_} {}
KThread::~KThread() = default;
@@ -82,6 +113,8 @@ ResultCode KThread::Initialize(KThreadFunction func, uintptr_t arg, VAddr user_s
[[fallthrough]];
case ThreadType::HighPriority:
[[fallthrough]];
+ case ThreadType::Dummy:
+ [[fallthrough]];
case ThreadType::User:
ASSERT(((owner == nullptr) ||
(owner->GetCoreMask() | (1ULL << virt_core)) == owner->GetCoreMask()));
@@ -127,11 +160,8 @@ ResultCode KThread::Initialize(KThreadFunction func, uintptr_t arg, VAddr user_s
priority = prio;
base_priority = prio;
- // Set sync object and waiting lock to null.
- synced_object = nullptr;
-
// Initialize sleeping queue.
- sleeping_queue = nullptr;
+ wait_queue = nullptr;
// Set suspend flags.
suspend_request_flags = 0;
@@ -184,7 +214,7 @@ ResultCode KThread::Initialize(KThreadFunction func, uintptr_t arg, VAddr user_s
// Setup the stack parameters.
StackParameters& sp = GetStackParameters();
sp.cur_thread = this;
- sp.disable_count = 1;
+ sp.disable_count = 0;
SetInExceptionHandler();
// Set thread ID.
@@ -211,15 +241,16 @@ ResultCode KThread::InitializeThread(KThread* thread, KThreadFunction func, uint
// Initialize the thread.
R_TRY(thread->Initialize(func, arg, user_stack_top, prio, core, owner, type));
- // Initialize host context.
+ // Initialize emulation parameters.
thread->host_context =
std::make_shared<Common::Fiber>(std::move(init_func), init_func_parameter);
+ thread->is_single_core = !Settings::values.use_multi_core.GetValue();
return ResultSuccess;
}
ResultCode KThread::InitializeDummyThread(KThread* thread) {
- return thread->Initialize({}, {}, {}, DefaultThreadPriority, 3, {}, ThreadType::Main);
+ return thread->Initialize({}, {}, {}, DefaultThreadPriority, 3, {}, ThreadType::Dummy);
}
ResultCode KThread::InitializeIdleThread(Core::System& system, KThread* thread, s32 virt_core) {
@@ -273,11 +304,14 @@ void KThread::Finalize() {
auto it = waiter_list.begin();
while (it != waiter_list.end()) {
- // The thread shouldn't be a kernel waiter.
+ // Clear the lock owner
it->SetLockOwner(nullptr);
- it->SetSyncedObject(nullptr, ResultInvalidState);
- it->Wakeup();
+
+ // Erase the waiter from our list.
it = waiter_list.erase(it);
+
+ // Cancel the thread's wait.
+ it->CancelWait(ResultInvalidState, true);
}
}
@@ -294,15 +328,12 @@ bool KThread::IsSignaled() const {
return signaled;
}
-void KThread::Wakeup() {
- KScopedSchedulerLock sl{kernel};
+void KThread::OnTimer() {
+ ASSERT(kernel.GlobalSchedulerContext().IsLocked());
+ // If we're waiting, cancel the wait.
if (GetState() == ThreadState::Waiting) {
- if (sleeping_queue != nullptr) {
- sleeping_queue->WakeupThread(this);
- } else {
- SetState(ThreadState::Runnable);
- }
+ wait_queue->CancelWait(this, ResultTimedOut, false);
}
}
@@ -327,7 +358,7 @@ void KThread::StartTermination() {
// Signal.
signaled = true;
- NotifyAvailable();
+ KSynchronizationObject::NotifyAvailable();
// Clear previous thread in KScheduler.
KScheduler::ClearPreviousThread(kernel, this);
@@ -475,30 +506,32 @@ ResultCode KThread::GetPhysicalCoreMask(s32* out_ideal_core, u64* out_affinity_m
return ResultSuccess;
}
-ResultCode KThread::SetCoreMask(s32 cpu_core_id, u64 v_affinity_mask) {
+ResultCode KThread::SetCoreMask(s32 core_id_, u64 v_affinity_mask) {
ASSERT(parent != nullptr);
ASSERT(v_affinity_mask != 0);
- KScopedLightLock lk{activity_pause_lock};
+ KScopedLightLock lk(activity_pause_lock);
// Set the core mask.
u64 p_affinity_mask = 0;
{
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl(kernel);
ASSERT(num_core_migration_disables >= 0);
- // If the core id is no-update magic, preserve the ideal core id.
- if (cpu_core_id == Svc::IdealCoreNoUpdate) {
- cpu_core_id = virtual_ideal_core_id;
- R_UNLESS(((1ULL << cpu_core_id) & v_affinity_mask) != 0, ResultInvalidCombination);
+ // If we're updating, set our ideal virtual core.
+ if (core_id_ != Svc::IdealCoreNoUpdate) {
+ virtual_ideal_core_id = core_id_;
+ } else {
+ // Preserve our ideal core id.
+ core_id_ = virtual_ideal_core_id;
+ R_UNLESS(((1ULL << core_id_) & v_affinity_mask) != 0, ResultInvalidCombination);
}
- // Set the virtual core/affinity mask.
- virtual_ideal_core_id = cpu_core_id;
+ // Set our affinity mask.
virtual_affinity_mask = v_affinity_mask;
// Translate the virtual core to a physical core.
- if (cpu_core_id >= 0) {
- cpu_core_id = Core::Hardware::VirtualToPhysicalCoreMap[cpu_core_id];
+ if (core_id_ >= 0) {
+ core_id_ = Core::Hardware::VirtualToPhysicalCoreMap[core_id_];
}
// Translate the virtual affinity mask to a physical one.
@@ -513,7 +546,7 @@ ResultCode KThread::SetCoreMask(s32 cpu_core_id, u64 v_affinity_mask) {
const KAffinityMask old_mask = physical_affinity_mask;
// Set our new ideals.
- physical_ideal_core_id = cpu_core_id;
+ physical_ideal_core_id = core_id_;
physical_affinity_mask.SetAffinityMask(p_affinity_mask);
if (physical_affinity_mask.GetAffinityMask() != old_mask.GetAffinityMask()) {
@@ -531,18 +564,18 @@ ResultCode KThread::SetCoreMask(s32 cpu_core_id, u64 v_affinity_mask) {
}
} else {
// Otherwise, we edit the original affinity for restoration later.
- original_physical_ideal_core_id = cpu_core_id;
+ original_physical_ideal_core_id = core_id_;
original_physical_affinity_mask.SetAffinityMask(p_affinity_mask);
}
}
// Update the pinned waiter list.
+ ThreadQueueImplForKThreadSetProperty wait_queue_(kernel, std::addressof(pinned_waiter_list));
{
bool retry_update{};
- bool thread_is_pinned{};
do {
// Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl(kernel);
// Don't do any further management if our termination has been requested.
R_SUCCEED_IF(IsTerminationRequested());
@@ -570,12 +603,9 @@ ResultCode KThread::SetCoreMask(s32 cpu_core_id, u64 v_affinity_mask) {
R_UNLESS(!GetCurrentThread(kernel).IsTerminationRequested(),
ResultTerminationRequested);
- // Note that the thread was pinned.
- thread_is_pinned = true;
-
// Wait until the thread isn't pinned any more.
pinned_waiter_list.push_back(GetCurrentThread(kernel));
- GetCurrentThread(kernel).SetState(ThreadState::Waiting);
+ GetCurrentThread(kernel).BeginWait(std::addressof(wait_queue_));
} else {
// If the thread isn't pinned, release the scheduler lock and retry until it's
// not current.
@@ -583,16 +613,6 @@ ResultCode KThread::SetCoreMask(s32 cpu_core_id, u64 v_affinity_mask) {
}
}
} while (retry_update);
-
- // If the thread was pinned, it no longer is, and we should remove the current thread from
- // our waiter list.
- if (thread_is_pinned) {
- // Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
-
- // Remove from the list.
- pinned_waiter_list.erase(pinned_waiter_list.iterator_to(GetCurrentThread(kernel)));
- }
}
return ResultSuccess;
@@ -641,15 +661,9 @@ void KThread::WaitCancel() {
KScopedSchedulerLock sl{kernel};
// Check if we're waiting and cancellable.
- if (GetState() == ThreadState::Waiting && cancellable) {
- if (sleeping_queue != nullptr) {
- sleeping_queue->WakeupThread(this);
- wait_cancelled = true;
- } else {
- SetSyncedObject(nullptr, ResultCancelled);
- SetState(ThreadState::Runnable);
- wait_cancelled = false;
- }
+ if (this->GetState() == ThreadState::Waiting && cancellable) {
+ wait_cancelled = false;
+ wait_queue->CancelWait(this, ResultCancelled, true);
} else {
// Otherwise, note that we cancelled a wait.
wait_cancelled = true;
@@ -700,60 +714,59 @@ ResultCode KThread::SetActivity(Svc::ThreadActivity activity) {
// Set the activity.
{
// Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl(kernel);
// Verify our state.
- const auto cur_state = GetState();
+ const auto cur_state = this->GetState();
R_UNLESS((cur_state == ThreadState::Waiting || cur_state == ThreadState::Runnable),
ResultInvalidState);
// Either pause or resume.
if (activity == Svc::ThreadActivity::Paused) {
// Verify that we're not suspended.
- R_UNLESS(!IsSuspendRequested(SuspendType::Thread), ResultInvalidState);
+ R_UNLESS(!this->IsSuspendRequested(SuspendType::Thread), ResultInvalidState);
// Suspend.
- RequestSuspend(SuspendType::Thread);
+ this->RequestSuspend(SuspendType::Thread);
} else {
ASSERT(activity == Svc::ThreadActivity::Runnable);
// Verify that we're suspended.
- R_UNLESS(IsSuspendRequested(SuspendType::Thread), ResultInvalidState);
+ R_UNLESS(this->IsSuspendRequested(SuspendType::Thread), ResultInvalidState);
// Resume.
- Resume(SuspendType::Thread);
+ this->Resume(SuspendType::Thread);
}
}
// If the thread is now paused, update the pinned waiter list.
if (activity == Svc::ThreadActivity::Paused) {
- bool thread_is_pinned{};
- bool thread_is_current{};
+ ThreadQueueImplForKThreadSetProperty wait_queue_(kernel,
+ std::addressof(pinned_waiter_list));
+
+ bool thread_is_current;
do {
// Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
+ KScopedSchedulerLock sl(kernel);
// Don't do any further management if our termination has been requested.
- R_SUCCEED_IF(IsTerminationRequested());
+ R_SUCCEED_IF(this->IsTerminationRequested());
+
+ // By default, treat the thread as not current.
+ thread_is_current = false;
// Check whether the thread is pinned.
- if (GetStackParameters().is_pinned) {
+ if (this->GetStackParameters().is_pinned) {
// Verify that the current thread isn't terminating.
R_UNLESS(!GetCurrentThread(kernel).IsTerminationRequested(),
ResultTerminationRequested);
- // Note that the thread was pinned and not current.
- thread_is_pinned = true;
- thread_is_current = false;
-
// Wait until the thread isn't pinned any more.
pinned_waiter_list.push_back(GetCurrentThread(kernel));
- GetCurrentThread(kernel).SetState(ThreadState::Waiting);
+ GetCurrentThread(kernel).BeginWait(std::addressof(wait_queue_));
} else {
// Check if the thread is currently running.
// If it is, we'll need to retry.
- thread_is_current = false;
-
for (auto i = 0; i < static_cast<s32>(Core::Hardware::NUM_CPU_CORES); ++i) {
if (kernel.Scheduler(i).GetCurrentThread() == this) {
thread_is_current = true;
@@ -762,16 +775,6 @@ ResultCode KThread::SetActivity(Svc::ThreadActivity activity) {
}
}
} while (thread_is_current);
-
- // If the thread was pinned, it no longer is, and we should remove the current thread from
- // our waiter list.
- if (thread_is_pinned) {
- // Lock the scheduler.
- KScopedSchedulerLock sl{kernel};
-
- // Remove from the list.
- pinned_waiter_list.erase(pinned_waiter_list.iterator_to(GetCurrentThread(kernel)));
- }
}
return ResultSuccess;
@@ -966,6 +969,9 @@ ResultCode KThread::Run() {
// Set our state and finish.
SetState(ThreadState::Runnable);
+
+ DisableDispatch();
+
return ResultSuccess;
}
}
@@ -996,27 +1002,61 @@ ResultCode KThread::Sleep(s64 timeout) {
ASSERT(this == GetCurrentThreadPointer(kernel));
ASSERT(timeout > 0);
+ ThreadQueueImplForKThreadSleep wait_queue_(kernel);
{
// Setup the scheduling lock and sleep.
- KScopedSchedulerLockAndSleep slp{kernel, this, timeout};
+ KScopedSchedulerLockAndSleep slp(kernel, this, timeout);
// Check if the thread should terminate.
- if (IsTerminationRequested()) {
+ if (this->IsTerminationRequested()) {
slp.CancelSleep();
return ResultTerminationRequested;
}
- // Mark the thread as waiting.
- SetState(ThreadState::Waiting);
+ // Wait for the sleep to end.
+ this->BeginWait(std::addressof(wait_queue_));
SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::Sleep);
}
- // The lock/sleep is done.
+ return ResultSuccess;
+}
- // Cancel the timer.
- kernel.TimeManager().UnscheduleTimeEvent(this);
+void KThread::BeginWait(KThreadQueue* queue) {
+ // Set our state as waiting.
+ SetState(ThreadState::Waiting);
- return ResultSuccess;
+ // Set our wait queue.
+ wait_queue = queue;
+}
+
+void KThread::NotifyAvailable(KSynchronizationObject* signaled_object, ResultCode wait_result_) {
+ // Lock the scheduler.
+ KScopedSchedulerLock sl(kernel);
+
+ // If we're waiting, notify our queue that we're available.
+ if (GetState() == ThreadState::Waiting) {
+ wait_queue->NotifyAvailable(this, signaled_object, wait_result_);
+ }
+}
+
+void KThread::EndWait(ResultCode wait_result_) {
+ // Lock the scheduler.
+ KScopedSchedulerLock sl(kernel);
+
+ // If we're waiting, notify our queue that we're available.
+ if (GetState() == ThreadState::Waiting) {
+ wait_queue->EndWait(this, wait_result_);
+ }
+}
+
+void KThread::CancelWait(ResultCode wait_result_, bool cancel_timer_task) {
+ // Lock the scheduler.
+ KScopedSchedulerLock sl(kernel);
+
+ // If we're waiting, notify our queue that we're available.
+ if (GetState() == ThreadState::Waiting) {
+ wait_queue->CancelWait(this, wait_result_, cancel_timer_task);
+ }
}
void KThread::SetState(ThreadState state) {
@@ -1050,4 +1090,26 @@ s32 GetCurrentCoreId(KernelCore& kernel) {
return GetCurrentThread(kernel).GetCurrentCore();
}
+KScopedDisableDispatch::~KScopedDisableDispatch() {
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
+ }
+
+ // Skip the reschedule if single-core, as dispatch tracking is disabled here.
+ if (!Settings::values.use_multi_core.GetValue()) {
+ return;
+ }
+
+ if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) {
+ auto scheduler = kernel.CurrentScheduler();
+
+ if (scheduler) {
+ scheduler->RescheduleCurrentCore();
+ }
+ } else {
+ GetCurrentThread(kernel).EnableDispatch();
+ }
+}
+
} // namespace Kernel
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h
index c77f44ad4..c8a08bd71 100644
--- a/src/core/hle/kernel/k_thread.h
+++ b/src/core/hle/kernel/k_thread.h
@@ -48,6 +48,7 @@ enum class ThreadType : u32 {
Kernel = 1,
HighPriority = 2,
User = 3,
+ Dummy = 100, // Special thread type for emulation purposes only
};
DECLARE_ENUM_FLAG_OPERATORS(ThreadType);
@@ -161,8 +162,6 @@ public:
}
}
- void Wakeup();
-
void SetBasePriority(s32 value);
[[nodiscard]] ResultCode Run();
@@ -197,13 +196,19 @@ public:
void Suspend();
- void SetSyncedObject(KSynchronizationObject* obj, ResultCode wait_res) {
- synced_object = obj;
+ constexpr void SetSyncedIndex(s32 index) {
+ synced_index = index;
+ }
+
+ [[nodiscard]] constexpr s32 GetSyncedIndex() const {
+ return synced_index;
+ }
+
+ constexpr void SetWaitResult(ResultCode wait_res) {
wait_result = wait_res;
}
- [[nodiscard]] ResultCode GetWaitResult(KSynchronizationObject** out) const {
- *out = synced_object;
+ [[nodiscard]] constexpr ResultCode GetWaitResult() const {
return wait_result;
}
@@ -374,6 +379,8 @@ public:
[[nodiscard]] bool IsSignaled() const override;
+ void OnTimer();
+
static void PostDestroy(uintptr_t arg);
[[nodiscard]] static ResultCode InitializeDummyThread(KThread* thread);
@@ -446,20 +453,39 @@ public:
return per_core_priority_queue_entry[core];
}
- void SetSleepingQueue(KThreadQueue* q) {
- sleeping_queue = q;
+ [[nodiscard]] bool IsKernelThread() const {
+ return GetActiveCore() == 3;
+ }
+
+ [[nodiscard]] bool IsDispatchTrackingDisabled() const {
+ return is_single_core || IsKernelThread();
}
[[nodiscard]] s32 GetDisableDispatchCount() const {
+ if (IsDispatchTrackingDisabled()) {
+ // TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
+ return 1;
+ }
+
return this->GetStackParameters().disable_count;
}
void DisableDispatch() {
+ if (IsDispatchTrackingDisabled()) {
+ // TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
+ return;
+ }
+
ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() >= 0);
this->GetStackParameters().disable_count++;
}
void EnableDispatch() {
+ if (IsDispatchTrackingDisabled()) {
+ // TODO(bunnei): Until kernel threads are emulated, we cannot enable/disable dispatch.
+ return;
+ }
+
ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() > 0);
this->GetStackParameters().disable_count--;
}
@@ -573,6 +599,15 @@ public:
address_key_value = val;
}
+ void ClearWaitQueue() {
+ wait_queue = nullptr;
+ }
+
+ void BeginWait(KThreadQueue* queue);
+ void NotifyAvailable(KSynchronizationObject* signaled_object, ResultCode wait_result_);
+ void EndWait(ResultCode wait_result_);
+ void CancelWait(ResultCode wait_result_, bool cancel_timer_task);
+
[[nodiscard]] bool HasWaiters() const {
return !waiter_list.empty();
}
@@ -667,7 +702,6 @@ private:
KAffinityMask physical_affinity_mask{};
u64 thread_id{};
std::atomic<s64> cpu_time{};
- KSynchronizationObject* synced_object{};
VAddr address_key{};
KProcess* parent{};
VAddr kernel_stack_top{};
@@ -677,13 +711,14 @@ private:
s64 schedule_count{};
s64 last_scheduled_tick{};
std::array<QueueEntry, Core::Hardware::NUM_CPU_CORES> per_core_priority_queue_entry{};
- KThreadQueue* sleeping_queue{};
+ KThreadQueue* wait_queue{};
WaiterList waiter_list{};
WaiterList pinned_waiter_list{};
KThread* lock_owner{};
u32 address_key_value{};
u32 suspend_request_flags{};
u32 suspend_allowed_flags{};
+ s32 synced_index{};
ResultCode wait_result{ResultSuccess};
s32 base_priority{};
s32 physical_ideal_core_id{};
@@ -708,6 +743,7 @@ private:
// For emulation
std::shared_ptr<Common::Fiber> host_context{};
+ bool is_single_core{};
// For debugging
std::vector<KSynchronizationObject*> wait_objects_for_debugging;
@@ -752,4 +788,20 @@ public:
}
};
+class KScopedDisableDispatch {
+public:
+ [[nodiscard]] explicit KScopedDisableDispatch(KernelCore& kernel_) : kernel{kernel_} {
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (kernel.IsShuttingDown()) {
+ return;
+ }
+ GetCurrentThread(kernel).DisableDispatch();
+ }
+
+ ~KScopedDisableDispatch();
+
+private:
+ KernelCore& kernel;
+};
+
} // namespace Kernel
diff --git a/src/core/hle/kernel/k_thread_queue.cpp b/src/core/hle/kernel/k_thread_queue.cpp
new file mode 100644
index 000000000..d5248b547
--- /dev/null
+++ b/src/core/hle/kernel/k_thread_queue.cpp
@@ -0,0 +1,49 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/kernel/k_thread_queue.h"
+#include "core/hle/kernel/kernel.h"
+#include "core/hle/kernel/time_manager.h"
+
+namespace Kernel {
+
+void KThreadQueue::NotifyAvailable([[maybe_unused]] KThread* waiting_thread,
+ [[maybe_unused]] KSynchronizationObject* signaled_object,
+ [[maybe_unused]] ResultCode wait_result) {}
+
+void KThreadQueue::EndWait(KThread* waiting_thread, ResultCode wait_result) {
+ // Set the thread's wait result.
+ waiting_thread->SetWaitResult(wait_result);
+
+ // Set the thread as runnable.
+ waiting_thread->SetState(ThreadState::Runnable);
+
+ // Clear the thread's wait queue.
+ waiting_thread->ClearWaitQueue();
+
+ // Cancel the thread task.
+ kernel.TimeManager().UnscheduleTimeEvent(waiting_thread);
+}
+
+void KThreadQueue::CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task) {
+ // Set the thread's wait result.
+ waiting_thread->SetWaitResult(wait_result);
+
+ // Set the thread as runnable.
+ waiting_thread->SetState(ThreadState::Runnable);
+
+ // Clear the thread's wait queue.
+ waiting_thread->ClearWaitQueue();
+
+ // Cancel the thread task.
+ if (cancel_timer_task) {
+ kernel.TimeManager().UnscheduleTimeEvent(waiting_thread);
+ }
+}
+
+void KThreadQueueWithoutEndWait::EndWait([[maybe_unused]] KThread* waiting_thread,
+ [[maybe_unused]] ResultCode wait_result) {}
+
+} // namespace Kernel
diff --git a/src/core/hle/kernel/k_thread_queue.h b/src/core/hle/kernel/k_thread_queue.h
index 35d471dc5..ccb718e49 100644
--- a/src/core/hle/kernel/k_thread_queue.h
+++ b/src/core/hle/kernel/k_thread_queue.h
@@ -4,6 +4,7 @@
#pragma once
+#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_thread.h"
namespace Kernel {
@@ -11,71 +12,24 @@ namespace Kernel {
class KThreadQueue {
public:
explicit KThreadQueue(KernelCore& kernel_) : kernel{kernel_} {}
+ virtual ~KThreadQueue() = default;
- bool IsEmpty() const {
- return wait_list.empty();
- }
-
- KThread::WaiterList::iterator begin() {
- return wait_list.begin();
- }
- KThread::WaiterList::iterator end() {
- return wait_list.end();
- }
-
- bool SleepThread(KThread* t) {
- KScopedSchedulerLock sl{kernel};
-
- // If the thread needs terminating, don't enqueue it.
- if (t->IsTerminationRequested()) {
- return false;
- }
-
- // Set the thread's queue and mark it as waiting.
- t->SetSleepingQueue(this);
- t->SetState(ThreadState::Waiting);
-
- // Add the thread to the queue.
- wait_list.push_back(*t);
-
- return true;
- }
-
- void WakeupThread(KThread* t) {
- KScopedSchedulerLock sl{kernel};
-
- // Remove the thread from the queue.
- wait_list.erase(wait_list.iterator_to(*t));
-
- // Mark the thread as no longer sleeping.
- t->SetState(ThreadState::Runnable);
- t->SetSleepingQueue(nullptr);
- }
-
- KThread* WakeupFrontThread() {
- KScopedSchedulerLock sl{kernel};
-
- if (wait_list.empty()) {
- return nullptr;
- } else {
- // Remove the thread from the queue.
- auto it = wait_list.begin();
- KThread* thread = std::addressof(*it);
- wait_list.erase(it);
-
- ASSERT(thread->GetState() == ThreadState::Waiting);
-
- // Mark the thread as no longer sleeping.
- thread->SetState(ThreadState::Runnable);
- thread->SetSleepingQueue(nullptr);
-
- return thread;
- }
- }
+ virtual void NotifyAvailable(KThread* waiting_thread, KSynchronizationObject* signaled_object,
+ ResultCode wait_result);
+ virtual void EndWait(KThread* waiting_thread, ResultCode wait_result);
+ virtual void CancelWait(KThread* waiting_thread, ResultCode wait_result,
+ bool cancel_timer_task);
private:
KernelCore& kernel;
KThread::WaiterList wait_list{};
};
+class KThreadQueueWithoutEndWait : public KThreadQueue {
+public:
+ explicit KThreadQueueWithoutEndWait(KernelCore& kernel_) : KThreadQueue(kernel_) {}
+
+ void EndWait(KThread* waiting_thread, ResultCode wait_result) override final;
+};
+
} // namespace Kernel
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index e42a6d36f..2e4e4cb1c 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -14,6 +14,7 @@
#include "common/assert.h"
#include "common/logging/log.h"
#include "common/microprofile.h"
+#include "common/scope_exit.h"
#include "common/thread.h"
#include "common/thread_worker.h"
#include "core/arm/arm_interface.h"
@@ -83,12 +84,16 @@ struct KernelCore::Impl {
}
void InitializeCores() {
- for (auto& core : cores) {
- core.Initialize(current_process->Is64BitProcess());
+ for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
+ cores[core_id].Initialize(current_process->Is64BitProcess());
+ system.Memory().SetCurrentPageTable(*current_process, core_id);
}
}
void Shutdown() {
+ is_shutting_down.store(true, std::memory_order_relaxed);
+ SCOPE_EXIT({ is_shutting_down.store(false, std::memory_order_relaxed); });
+
process_list.clear();
// Close all open server ports.
@@ -123,15 +128,6 @@ struct KernelCore::Impl {
next_user_process_id = KProcess::ProcessIDMin;
next_thread_id = 1;
- for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
- if (suspend_threads[core_id]) {
- suspend_threads[core_id]->Close();
- suspend_threads[core_id] = nullptr;
- }
-
- schedulers[core_id].reset();
- }
-
cores.clear();
global_handle_table->Finalize();
@@ -159,6 +155,16 @@ struct KernelCore::Impl {
CleanupObject(time_shared_mem);
CleanupObject(system_resource_limit);
+ for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
+ if (suspend_threads[core_id]) {
+ suspend_threads[core_id]->Close();
+ suspend_threads[core_id] = nullptr;
+ }
+
+ schedulers[core_id]->Finalize();
+ schedulers[core_id].reset();
+ }
+
// Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
@@ -245,13 +251,11 @@ struct KernelCore::Impl {
KScopedSchedulerLock lock(kernel);
global_scheduler_context->PreemptThreads();
}
- const auto time_interval = std::chrono::nanoseconds{
- Core::Timing::msToCycles(std::chrono::milliseconds(10))};
+ const auto time_interval = std::chrono::nanoseconds{std::chrono::milliseconds(10)};
system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
});
- const auto time_interval =
- std::chrono::nanoseconds{Core::Timing::msToCycles(std::chrono::milliseconds(10))};
+ const auto time_interval = std::chrono::nanoseconds{std::chrono::milliseconds(10)};
system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
}
@@ -267,14 +271,6 @@ struct KernelCore::Impl {
void MakeCurrentProcess(KProcess* process) {
current_process = process;
- if (process == nullptr) {
- return;
- }
-
- const u32 core_id = GetCurrentHostThreadID();
- if (core_id < Core::Hardware::NUM_CPU_CORES) {
- system.Memory().SetCurrentPageTable(*process, core_id);
- }
}
static inline thread_local u32 host_thread_id = UINT32_MAX;
@@ -300,15 +296,16 @@ struct KernelCore::Impl {
// Gets the dummy KThread for the caller, allocating a new one if this is the first time
KThread* GetHostDummyThread() {
auto make_thread = [this]() {
- std::unique_ptr<KThread> thread = std::make_unique<KThread>(system.Kernel());
+ std::lock_guard lk(dummy_thread_lock);
+ auto& thread = dummy_threads.emplace_back(std::make_unique<KThread>(system.Kernel()));
KAutoObject::Create(thread.get());
ASSERT(KThread::InitializeDummyThread(thread.get()).IsSuccess());
thread->SetName(fmt::format("DummyThread:{}", GetHostThreadId()));
- return thread;
+ return thread.get();
};
- thread_local auto thread = make_thread();
- return thread.get();
+ thread_local KThread* saved_thread = make_thread();
+ return saved_thread;
}
/// Registers a CPU core thread by allocating a host thread ID for it
@@ -343,7 +340,16 @@ struct KernelCore::Impl {
is_phantom_mode_for_singlecore = value;
}
+ bool IsShuttingDown() const {
+ return is_shutting_down.load(std::memory_order_relaxed);
+ }
+
KThread* GetCurrentEmuThread() {
+ // If we are shutting down the kernel, none of this is relevant anymore.
+ if (IsShuttingDown()) {
+ return {};
+ }
+
const auto thread_id = GetCurrentHostThreadID();
if (thread_id >= Core::Hardware::NUM_CPU_CORES) {
return GetHostDummyThread();
@@ -695,6 +701,12 @@ struct KernelCore::Impl {
return port;
}
+ std::mutex server_ports_lock;
+ std::mutex server_sessions_lock;
+ std::mutex registered_objects_lock;
+ std::mutex registered_in_use_objects_lock;
+ std::mutex dummy_thread_lock;
+
std::atomic<u32> next_object_id{0};
std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin};
std::atomic<u64> next_user_process_id{KProcess::ProcessIDMin};
@@ -725,10 +737,6 @@ struct KernelCore::Impl {
std::unordered_set<KServerSession*> server_sessions;
std::unordered_set<KAutoObject*> registered_objects;
std::unordered_set<KAutoObject*> registered_in_use_objects;
- std::mutex server_ports_lock;
- std::mutex server_sessions_lock;
- std::mutex registered_objects_lock;
- std::mutex registered_in_use_objects_lock;
std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
std::vector<Kernel::PhysicalCore> cores;
@@ -753,7 +761,11 @@ struct KernelCore::Impl {
std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{};
std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{};
+ // Specifically tracked to be automatically destroyed with kernel
+ std::vector<std::unique_ptr<KThread>> dummy_threads;
+
bool is_multicore{};
+ std::atomic_bool is_shutting_down{};
bool is_phantom_mode_for_singlecore{};
u32 single_core_thread_id{};
@@ -839,16 +851,20 @@ const Kernel::PhysicalCore& KernelCore::PhysicalCore(std::size_t id) const {
return impl->cores[id];
}
+size_t KernelCore::CurrentPhysicalCoreIndex() const {
+ const u32 core_id = impl->GetCurrentHostThreadID();
+ if (core_id >= Core::Hardware::NUM_CPU_CORES) {
+ return Core::Hardware::NUM_CPU_CORES - 1;
+ }
+ return core_id;
+}
+
Kernel::PhysicalCore& KernelCore::CurrentPhysicalCore() {
- u32 core_id = impl->GetCurrentHostThreadID();
- ASSERT(core_id < Core::Hardware::NUM_CPU_CORES);
- return impl->cores[core_id];
+ return impl->cores[CurrentPhysicalCoreIndex()];
}
const Kernel::PhysicalCore& KernelCore::CurrentPhysicalCore() const {
- u32 core_id = impl->GetCurrentHostThreadID();
- ASSERT(core_id < Core::Hardware::NUM_CPU_CORES);
- return impl->cores[core_id];
+ return impl->cores[CurrentPhysicalCoreIndex()];
}
Kernel::KScheduler* KernelCore::CurrentScheduler() {
@@ -1051,6 +1067,9 @@ void KernelCore::Suspend(bool in_suspention) {
impl->suspend_threads[core_id]->SetState(state);
impl->suspend_threads[core_id]->SetWaitReasonForDebugging(
ThreadWaitReasonForDebugging::Suspended);
+ if (!should_suspend) {
+ impl->suspend_threads[core_id]->DisableDispatch();
+ }
}
}
}
@@ -1059,19 +1078,21 @@ bool KernelCore::IsMulticore() const {
return impl->is_multicore;
}
+bool KernelCore::IsShuttingDown() const {
+ return impl->IsShuttingDown();
+}
+
void KernelCore::ExceptionalExit() {
exception_exited = true;
Suspend(true);
}
void KernelCore::EnterSVCProfile() {
- std::size_t core = impl->GetCurrentHostThreadID();
- impl->svc_ticks[core] = MicroProfileEnter(MICROPROFILE_TOKEN(Kernel_SVC));
+ impl->svc_ticks[CurrentPhysicalCoreIndex()] = MicroProfileEnter(MICROPROFILE_TOKEN(Kernel_SVC));
}
void KernelCore::ExitSVCProfile() {
- std::size_t core = impl->GetCurrentHostThreadID();
- MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[core]);
+ MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[CurrentPhysicalCoreIndex()]);
}
std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) {
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index d2ceae950..b9b423908 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -53,6 +53,7 @@ class KSharedMemoryInfo;
class KThread;
class KTransferMemory;
class KWritableEvent;
+class KCodeMemory;
class PhysicalCore;
class ServiceThread;
class Synchronization;
@@ -148,6 +149,9 @@ public:
/// Gets the an instance of the respective physical CPU core.
const Kernel::PhysicalCore& PhysicalCore(std::size_t id) const;
+ /// Gets the current physical core index for the running host thread.
+ std::size_t CurrentPhysicalCoreIndex() const;
+
/// Gets the sole instance of the Scheduler at the current running core.
Kernel::KScheduler* CurrentScheduler();
@@ -271,6 +275,8 @@ public:
bool IsMulticore() const;
+ bool IsShuttingDown() const;
+
void EnterSVCProfile();
void ExitSVCProfile();
@@ -326,6 +332,8 @@ public:
return slab_heap_container->transfer_memory;
} else if constexpr (std::is_same_v<T, KWritableEvent>) {
return slab_heap_container->writeable_event;
+ } else if constexpr (std::is_same_v<T, KCodeMemory>) {
+ return slab_heap_container->code_memory;
}
}
@@ -377,6 +385,7 @@ private:
KSlabHeap<KThread> thread;
KSlabHeap<KTransferMemory> transfer_memory;
KSlabHeap<KWritableEvent> writeable_event;
+ KSlabHeap<KCodeMemory> code_memory;
};
std::unique_ptr<SlabHeapContainer> slab_heap_container;
diff --git a/src/core/hle/kernel/service_thread.cpp b/src/core/hle/kernel/service_thread.cpp
index 6721b6276..03f3dec10 100644
--- a/src/core/hle/kernel/service_thread.cpp
+++ b/src/core/hle/kernel/service_thread.cpp
@@ -25,24 +25,27 @@ public:
void QueueSyncRequest(KSession& session, std::shared_ptr<HLERequestContext>&& context);
private:
- std::vector<std::thread> threads;
+ std::vector<std::jthread> threads;
std::queue<std::function<void()>> requests;
std::mutex queue_mutex;
- std::condition_variable condition;
+ std::condition_variable_any condition;
const std::string service_name;
- bool stop{};
};
ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads, const std::string& name)
: service_name{name} {
- for (std::size_t i = 0; i < num_threads; ++i)
- threads.emplace_back([this, &kernel] {
+ for (std::size_t i = 0; i < num_threads; ++i) {
+ threads.emplace_back([this, &kernel](std::stop_token stop_token) {
Common::SetCurrentThreadName(std::string{"yuzu:HleService:" + service_name}.c_str());
// Wait for first request before trying to acquire a render context
{
std::unique_lock lock{queue_mutex};
- condition.wait(lock, [this] { return stop || !requests.empty(); });
+ condition.wait(lock, stop_token, [this] { return !requests.empty(); });
+ }
+
+ if (stop_token.stop_requested()) {
+ return;
}
kernel.RegisterHostThread();
@@ -52,10 +55,16 @@ ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads, const std
{
std::unique_lock lock{queue_mutex};
- condition.wait(lock, [this] { return stop || !requests.empty(); });
- if (stop || requests.empty()) {
+ condition.wait(lock, stop_token, [this] { return !requests.empty(); });
+
+ if (stop_token.stop_requested()) {
return;
}
+
+ if (requests.empty()) {
+ continue;
+ }
+
task = std::move(requests.front());
requests.pop();
}
@@ -63,6 +72,7 @@ ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads, const std
task();
}
});
+ }
}
void ServiceThread::Impl::QueueSyncRequest(KSession& session,
@@ -88,12 +98,9 @@ void ServiceThread::Impl::QueueSyncRequest(KSession& session,
}
ServiceThread::Impl::~Impl() {
- {
- std::unique_lock lock{queue_mutex};
- stop = true;
- }
condition.notify_all();
- for (std::thread& thread : threads) {
+ for (auto& thread : threads) {
+ thread.request_stop();
thread.join();
}
}
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index f9d99bc51..a9f7438ea 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -18,6 +18,7 @@
#include "core/core_timing.h"
#include "core/hle/kernel/k_client_port.h"
#include "core/hle/kernel/k_client_session.h"
+#include "core/hle/kernel/k_code_memory.h"
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_handle_table.h"
#include "core/hle/kernel/k_memory_block.h"
@@ -31,6 +32,7 @@
#include "core/hle/kernel/k_shared_memory.h"
#include "core/hle/kernel/k_synchronization_object.h"
#include "core/hle/kernel/k_thread.h"
+#include "core/hle/kernel/k_thread_queue.h"
#include "core/hle/kernel/k_transfer_memory.h"
#include "core/hle/kernel/k_writable_event.h"
#include "core/hle/kernel/kernel.h"
@@ -307,26 +309,29 @@ static ResultCode ConnectToNamedPort32(Core::System& system, Handle* out_handle,
/// Makes a blocking IPC call to an OS service.
static ResultCode SendSyncRequest(Core::System& system, Handle handle) {
-
auto& kernel = system.Kernel();
+ // Create the wait queue.
+ KThreadQueue wait_queue(kernel);
+
+ // Get the client session from its handle.
+ KScopedAutoObject session =
+ kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle);
+ R_UNLESS(session.IsNotNull(), ResultInvalidHandle);
+
+ LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName());
+
auto thread = kernel.CurrentScheduler()->GetCurrentThread();
{
KScopedSchedulerLock lock(kernel);
- thread->SetState(ThreadState::Waiting);
- thread->SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC);
-
- {
- KScopedAutoObject session =
- kernel.CurrentProcess()->GetHandleTable().GetObject<KClientSession>(handle);
- R_UNLESS(session.IsNotNull(), ResultInvalidHandle);
- LOG_TRACE(Kernel_SVC, "called handle=0x{:08X}({})", handle, session->GetName());
- session->SendSyncRequest(thread, system.Memory(), system.CoreTiming());
- }
+
+ // This is a synchronous request, so we should wait for our request to complete.
+ GetCurrentThread(kernel).BeginWait(std::addressof(wait_queue));
+ GetCurrentThread(kernel).SetWaitReasonForDebugging(ThreadWaitReasonForDebugging::IPC);
+ session->SendSyncRequest(&GetCurrentThread(kernel), system.Memory(), system.CoreTiming());
}
- KSynchronizationObject* dummy{};
- return thread->GetWaitResult(std::addressof(dummy));
+ return thread->GetWaitResult();
}
static ResultCode SendSyncRequest32(Core::System& system, Handle handle) {
@@ -873,7 +878,7 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle
const u64 thread_ticks = current_thread->GetCpuTime();
out_ticks = thread_ticks + (core_timing.GetCPUTicks() - prev_ctx_ticks);
- } else if (same_thread && info_sub_id == system.CurrentCoreIndex()) {
+ } else if (same_thread && info_sub_id == system.Kernel().CurrentPhysicalCoreIndex()) {
out_ticks = core_timing.GetCPUTicks() - prev_ctx_ticks;
}
@@ -887,7 +892,8 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle
return ResultInvalidHandle;
}
- if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id != system.CurrentCoreIndex()) {
+ if (info_sub_id != 0xFFFFFFFFFFFFFFFF &&
+ info_sub_id != system.Kernel().CurrentPhysicalCoreIndex()) {
LOG_ERROR(Kernel_SVC, "Core is not the current core, got {}", info_sub_id);
return ResultInvalidCombination;
}
@@ -1169,6 +1175,8 @@ static u32 GetCurrentProcessorNumber32(Core::System& system) {
return GetCurrentProcessorNumber(system);
}
+namespace {
+
constexpr bool IsValidSharedMemoryPermission(Svc::MemoryPermission perm) {
switch (perm) {
case Svc::MemoryPermission::Read:
@@ -1179,10 +1187,40 @@ constexpr bool IsValidSharedMemoryPermission(Svc::MemoryPermission perm) {
}
}
-constexpr bool IsValidRemoteSharedMemoryPermission(Svc::MemoryPermission perm) {
+[[maybe_unused]] constexpr bool IsValidRemoteSharedMemoryPermission(Svc::MemoryPermission perm) {
return IsValidSharedMemoryPermission(perm) || perm == Svc::MemoryPermission::DontCare;
}
+constexpr bool IsValidProcessMemoryPermission(Svc::MemoryPermission perm) {
+ switch (perm) {
+ case Svc::MemoryPermission::None:
+ case Svc::MemoryPermission::Read:
+ case Svc::MemoryPermission::ReadWrite:
+ case Svc::MemoryPermission::ReadExecute:
+ return true;
+ default:
+ return false;
+ }
+}
+
+constexpr bool IsValidMapCodeMemoryPermission(Svc::MemoryPermission perm) {
+ return perm == Svc::MemoryPermission::ReadWrite;
+}
+
+constexpr bool IsValidMapToOwnerCodeMemoryPermission(Svc::MemoryPermission perm) {
+ return perm == Svc::MemoryPermission::Read || perm == Svc::MemoryPermission::ReadExecute;
+}
+
+constexpr bool IsValidUnmapCodeMemoryPermission(Svc::MemoryPermission perm) {
+ return perm == Svc::MemoryPermission::None;
+}
+
+constexpr bool IsValidUnmapFromOwnerCodeMemoryPermission(Svc::MemoryPermission perm) {
+ return perm == Svc::MemoryPermission::None;
+}
+
+} // Anonymous namespace
+
static ResultCode MapSharedMemory(Core::System& system, Handle shmem_handle, VAddr address,
u64 size, Svc::MemoryPermission map_perm) {
LOG_TRACE(Kernel_SVC,
@@ -1262,6 +1300,223 @@ static ResultCode UnmapSharedMemory32(Core::System& system, Handle shmem_handle,
return UnmapSharedMemory(system, shmem_handle, address, size);
}
+static ResultCode SetProcessMemoryPermission(Core::System& system, Handle process_handle,
+ VAddr address, u64 size, Svc::MemoryPermission perm) {
+ LOG_TRACE(Kernel_SVC,
+ "called, process_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}",
+ process_handle, address, size, perm);
+
+ // Validate the address/size.
+ R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
+ R_UNLESS(size > 0, ResultInvalidSize);
+ R_UNLESS((address < address + size), ResultInvalidCurrentMemory);
+
+ // Validate the memory permission.
+ R_UNLESS(IsValidProcessMemoryPermission(perm), ResultInvalidNewMemoryPermission);
+
+ // Get the process from its handle.
+ KScopedAutoObject process =
+ system.CurrentProcess()->GetHandleTable().GetObject<KProcess>(process_handle);
+ R_UNLESS(process.IsNotNull(), ResultInvalidHandle);
+
+ // Validate that the address is in range.
+ auto& page_table = process->PageTable();
+ R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory);
+
+ // Set the memory permission.
+ return page_table.SetProcessMemoryPermission(address, size, ConvertToKMemoryPermission(perm));
+}
+
+static ResultCode MapProcessMemory(Core::System& system, VAddr dst_address, Handle process_handle,
+ VAddr src_address, u64 size) {
+ LOG_TRACE(Kernel_SVC,
+ "called, dst_address=0x{:X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}",
+ dst_address, process_handle, src_address, size);
+
+ // Validate the address/size.
+ R_UNLESS(Common::IsAligned(dst_address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(src_address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
+ R_UNLESS(size > 0, ResultInvalidSize);
+ R_UNLESS((dst_address < dst_address + size), ResultInvalidCurrentMemory);
+ R_UNLESS((src_address < src_address + size), ResultInvalidCurrentMemory);
+
+ // Get the processes.
+ KProcess* dst_process = system.CurrentProcess();
+ KScopedAutoObject src_process =
+ dst_process->GetHandleTable().GetObjectWithoutPseudoHandle<KProcess>(process_handle);
+ R_UNLESS(src_process.IsNotNull(), ResultInvalidHandle);
+
+ // Get the page tables.
+ auto& dst_pt = dst_process->PageTable();
+ auto& src_pt = src_process->PageTable();
+
+ // Validate that the mapping is in range.
+ R_UNLESS(src_pt.Contains(src_address, size), ResultInvalidCurrentMemory);
+ R_UNLESS(dst_pt.CanContain(dst_address, size, KMemoryState::SharedCode),
+ ResultInvalidMemoryRegion);
+
+ // Create a new page group.
+ KMemoryInfo kBlockInfo = dst_pt.QueryInfo(dst_address);
+ KPageLinkedList pg(kBlockInfo.GetAddress(), kBlockInfo.GetNumPages());
+
+ // Map the group.
+ R_TRY(dst_pt.MapPages(dst_address, pg, KMemoryState::SharedCode,
+ KMemoryPermission::UserReadWrite));
+
+ return ResultSuccess;
+}
+
+static ResultCode UnmapProcessMemory(Core::System& system, VAddr dst_address, Handle process_handle,
+ VAddr src_address, u64 size) {
+ LOG_TRACE(Kernel_SVC,
+ "called, dst_address=0x{:X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}",
+ dst_address, process_handle, src_address, size);
+
+ // Validate the address/size.
+ R_UNLESS(Common::IsAligned(dst_address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(src_address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
+ R_UNLESS(size > 0, ResultInvalidSize);
+ R_UNLESS((dst_address < dst_address + size), ResultInvalidCurrentMemory);
+ R_UNLESS((src_address < src_address + size), ResultInvalidCurrentMemory);
+
+ // Get the processes.
+ KProcess* dst_process = system.CurrentProcess();
+ KScopedAutoObject src_process =
+ dst_process->GetHandleTable().GetObjectWithoutPseudoHandle<KProcess>(process_handle);
+ R_UNLESS(src_process.IsNotNull(), ResultInvalidHandle);
+
+ // Get the page tables.
+ auto& dst_pt = dst_process->PageTable();
+ auto& src_pt = src_process->PageTable();
+
+ // Validate that the mapping is in range.
+ R_UNLESS(src_pt.Contains(src_address, size), ResultInvalidCurrentMemory);
+ R_UNLESS(dst_pt.CanContain(dst_address, size, KMemoryState::SharedCode),
+ ResultInvalidMemoryRegion);
+
+ // Unmap the memory.
+ R_TRY(dst_pt.UnmapProcessMemory(dst_address, size, src_pt, src_address));
+
+ return ResultSuccess;
+}
+
+static ResultCode CreateCodeMemory(Core::System& system, Handle* out, VAddr address, size_t size) {
+ LOG_TRACE(Kernel_SVC, "called, handle_out=0x{:X}, address=0x{:X}, size=0x{:X}",
+ static_cast<void*>(out), address, size);
+ // Get kernel instance.
+ auto& kernel = system.Kernel();
+
+ // Validate address / size.
+ R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
+ R_UNLESS(size > 0, ResultInvalidSize);
+ R_UNLESS((address < address + size), ResultInvalidCurrentMemory);
+
+ // Create the code memory.
+
+ KCodeMemory* code_mem = KCodeMemory::Create(kernel);
+ R_UNLESS(code_mem != nullptr, ResultOutOfResource);
+
+ // Verify that the region is in range.
+ R_UNLESS(system.CurrentProcess()->PageTable().Contains(address, size),
+ ResultInvalidCurrentMemory);
+
+ // Initialize the code memory.
+ R_TRY(code_mem->Initialize(system.DeviceMemory(), address, size));
+
+ // Register the code memory.
+ KCodeMemory::Register(kernel, code_mem);
+
+ // Add the code memory to the handle table.
+ R_TRY(system.CurrentProcess()->GetHandleTable().Add(out, code_mem));
+
+ code_mem->Close();
+
+ return ResultSuccess;
+}
+
+static ResultCode ControlCodeMemory(Core::System& system, Handle code_memory_handle, u32 operation,
+ VAddr address, size_t size, Svc::MemoryPermission perm) {
+
+ LOG_TRACE(Kernel_SVC,
+ "called, code_memory_handle=0x{:X}, operation=0x{:X}, address=0x{:X}, size=0x{:X}, "
+ "permission=0x{:X}",
+ code_memory_handle, operation, address, size, perm);
+
+ // Validate the address / size.
+ R_UNLESS(Common::IsAligned(address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
+ R_UNLESS(size > 0, ResultInvalidSize);
+ R_UNLESS((address < address + size), ResultInvalidCurrentMemory);
+
+ // Get the code memory from its handle.
+ KScopedAutoObject code_mem =
+ system.CurrentProcess()->GetHandleTable().GetObject<KCodeMemory>(code_memory_handle);
+ R_UNLESS(code_mem.IsNotNull(), ResultInvalidHandle);
+
+ // NOTE: Here, Atmosphere extends the SVC to allow code memory operations on one's own process.
+ // This enables homebrew usage of these SVCs for JIT.
+
+ // Perform the operation.
+ switch (static_cast<CodeMemoryOperation>(operation)) {
+ case CodeMemoryOperation::Map: {
+ // Check that the region is in range.
+ R_UNLESS(
+ system.CurrentProcess()->PageTable().CanContain(address, size, KMemoryState::CodeOut),
+ ResultInvalidMemoryRegion);
+
+ // Check the memory permission.
+ R_UNLESS(IsValidMapCodeMemoryPermission(perm), ResultInvalidNewMemoryPermission);
+
+ // Map the memory.
+ R_TRY(code_mem->Map(address, size));
+ } break;
+ case CodeMemoryOperation::Unmap: {
+ // Check that the region is in range.
+ R_UNLESS(
+ system.CurrentProcess()->PageTable().CanContain(address, size, KMemoryState::CodeOut),
+ ResultInvalidMemoryRegion);
+
+ // Check the memory permission.
+ R_UNLESS(IsValidUnmapCodeMemoryPermission(perm), ResultInvalidNewMemoryPermission);
+
+ // Unmap the memory.
+ R_TRY(code_mem->Unmap(address, size));
+ } break;
+ case CodeMemoryOperation::MapToOwner: {
+ // Check that the region is in range.
+ R_UNLESS(code_mem->GetOwner()->PageTable().CanContain(address, size,
+ KMemoryState::GeneratedCode),
+ ResultInvalidMemoryRegion);
+
+ // Check the memory permission.
+ R_UNLESS(IsValidMapToOwnerCodeMemoryPermission(perm), ResultInvalidNewMemoryPermission);
+
+ // Map the memory to its owner.
+ R_TRY(code_mem->MapToOwner(address, size, perm));
+ } break;
+ case CodeMemoryOperation::UnmapFromOwner: {
+ // Check that the region is in range.
+ R_UNLESS(code_mem->GetOwner()->PageTable().CanContain(address, size,
+ KMemoryState::GeneratedCode),
+ ResultInvalidMemoryRegion);
+
+ // Check the memory permission.
+ R_UNLESS(IsValidUnmapFromOwnerCodeMemoryPermission(perm), ResultInvalidNewMemoryPermission);
+
+ // Unmap the memory from its owner.
+ R_TRY(code_mem->UnmapFromOwner(address, size));
+ } break;
+ default:
+ return ResultInvalidEnumValue;
+ }
+
+ return ResultSuccess;
+}
+
static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address,
VAddr page_info_address, Handle process_handle,
VAddr address) {
@@ -1459,10 +1714,14 @@ static void ExitProcess32(Core::System& system) {
ExitProcess(system);
}
-static constexpr bool IsValidVirtualCoreId(int32_t core_id) {
+namespace {
+
+constexpr bool IsValidVirtualCoreId(int32_t core_id) {
return (0 <= core_id && core_id < static_cast<int32_t>(Core::Hardware::NUM_CPU_CORES));
}
+} // Anonymous namespace
+
/// Creates a new thread
static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr entry_point, u64 arg,
VAddr stack_bottom, u32 priority, s32 core_id) {
@@ -1846,7 +2105,9 @@ static ResultCode ResetSignal32(Core::System& system, Handle handle) {
return ResetSignal(system, handle);
}
-static constexpr bool IsValidTransferMemoryPermission(MemoryPermission perm) {
+namespace {
+
+constexpr bool IsValidTransferMemoryPermission(MemoryPermission perm) {
switch (perm) {
case MemoryPermission::None:
case MemoryPermission::Read:
@@ -1857,6 +2118,8 @@ static constexpr bool IsValidTransferMemoryPermission(MemoryPermission perm) {
}
}
+} // Anonymous namespace
+
/// Creates a TransferMemory object
static ResultCode CreateTransferMemory(Core::System& system, Handle* out, VAddr address, u64 size,
MemoryPermission map_perm) {
@@ -2548,8 +2811,8 @@ static const FunctionDef SVC_Table_64[] = {
{0x48, nullptr, "MapPhysicalMemoryUnsafe"},
{0x49, nullptr, "UnmapPhysicalMemoryUnsafe"},
{0x4A, nullptr, "SetUnsafeLimit"},
- {0x4B, nullptr, "CreateCodeMemory"},
- {0x4C, nullptr, "ControlCodeMemory"},
+ {0x4B, SvcWrap64<CreateCodeMemory>, "CreateCodeMemory"},
+ {0x4C, SvcWrap64<ControlCodeMemory>, "ControlCodeMemory"},
{0x4D, nullptr, "SleepSystem"},
{0x4E, nullptr, "ReadWriteRegister"},
{0x4F, nullptr, "SetProcessActivity"},
@@ -2588,9 +2851,9 @@ static const FunctionDef SVC_Table_64[] = {
{0x70, nullptr, "CreatePort"},
{0x71, nullptr, "ManageNamedPort"},
{0x72, nullptr, "ConnectToPort"},
- {0x73, nullptr, "SetProcessMemoryPermission"},
- {0x74, nullptr, "MapProcessMemory"},
- {0x75, nullptr, "UnmapProcessMemory"},
+ {0x73, SvcWrap64<SetProcessMemoryPermission>, "SetProcessMemoryPermission"},
+ {0x74, SvcWrap64<MapProcessMemory>, "MapProcessMemory"},
+ {0x75, SvcWrap64<UnmapProcessMemory>, "UnmapProcessMemory"},
{0x76, SvcWrap64<QueryProcessMemory>, "QueryProcessMemory"},
{0x77, SvcWrap64<MapProcessCodeMemory>, "MapProcessCodeMemory"},
{0x78, SvcWrap64<UnmapProcessCodeMemory>, "UnmapProcessCodeMemory"},
diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h
index 6e62e656f..86255fe6d 100644
--- a/src/core/hle/kernel/svc_wrap.h
+++ b/src/core/hle/kernel/svc_wrap.h
@@ -73,6 +73,23 @@ void SvcWrap64(Core::System& system) {
.raw);
}
+// Used by MapProcessMemory and UnmapProcessMemory
+template <ResultCode func(Core::System&, u64, u32, u64, u64)>
+void SvcWrap64(Core::System& system) {
+ FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
+ Param(system, 2), Param(system, 3))
+ .raw);
+}
+
+// Used by ControlCodeMemory
+template <ResultCode func(Core::System&, Handle, u32, u64, u64, Svc::MemoryPermission)>
+void SvcWrap64(Core::System& system) {
+ FuncReturn(system, func(system, static_cast<Handle>(Param(system, 0)),
+ static_cast<u32>(Param(system, 1)), Param(system, 2), Param(system, 3),
+ static_cast<Svc::MemoryPermission>(Param(system, 4)))
+ .raw);
+}
+
template <ResultCode func(Core::System&, u32*)>
void SvcWrap64(Core::System& system) {
u32 param = 0;
@@ -301,6 +318,16 @@ void SvcWrap64(Core::System& system) {
FuncReturn(system, retval);
}
+// Used by CreateCodeMemory
+template <ResultCode func(Core::System&, Handle*, u64, u64)>
+void SvcWrap64(Core::System& system) {
+ u32 param_1 = 0;
+ const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2)).raw;
+
+ system.CurrentArmInterface().SetReg(1, param_1);
+ FuncReturn(system, retval);
+}
+
template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
void SvcWrap64(Core::System& system) {
u32 param_1 = 0;
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp
index 8cd7279a3..aa985d820 100644
--- a/src/core/hle/kernel/time_manager.cpp
+++ b/src/core/hle/kernel/time_manager.cpp
@@ -5,6 +5,7 @@
#include "common/assert.h"
#include "core/core.h"
#include "core/core_timing.h"
+#include "core/hle/kernel/k_scheduler.h"
#include "core/hle/kernel/k_thread.h"
#include "core/hle/kernel/time_manager.h"
@@ -15,7 +16,10 @@ TimeManager::TimeManager(Core::System& system_) : system{system_} {
Core::Timing::CreateEvent("Kernel::TimeManagerCallback",
[this](std::uintptr_t thread_handle, std::chrono::nanoseconds) {
KThread* thread = reinterpret_cast<KThread*>(thread_handle);
- thread->Wakeup();
+ {
+ KScopedSchedulerLock sl(system.Kernel());
+ thread->OnTimer();
+ }
});
}
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index aee8d4f93..e60661fe1 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -30,6 +30,7 @@
#include "core/hle/service/apm/apm_controller.h"
#include "core/hle/service/apm/apm_interface.h"
#include "core/hle/service/bcat/backend/backend.h"
+#include "core/hle/service/caps/caps.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/hle/service/ns/ns.h"
#include "core/hle/service/nvflinger/nvflinger.h"
@@ -298,7 +299,7 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv
{91, &ISelfController::GetAccumulatedSuspendedTickChangedEvent, "GetAccumulatedSuspendedTickChangedEvent"},
{100, &ISelfController::SetAlbumImageTakenNotificationEnabled, "SetAlbumImageTakenNotificationEnabled"},
{110, nullptr, "SetApplicationAlbumUserData"},
- {120, nullptr, "SaveCurrentScreenshot"},
+ {120, &ISelfController::SaveCurrentScreenshot, "SaveCurrentScreenshot"},
{130, nullptr, "SetRecordVolumeMuted"},
{1000, nullptr, "GetDebugStorageChannel"},
};
@@ -579,6 +580,17 @@ void ISelfController::SetAlbumImageTakenNotificationEnabled(Kernel::HLERequestCo
rb.Push(ResultSuccess);
}
+void ISelfController::SaveCurrentScreenshot(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+
+ const auto album_report_option = rp.PopEnum<Capture::AlbumReportOption>();
+
+ LOG_WARNING(Service_AM, "(STUBBED) called. album_report_option={}", album_report_option);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
AppletMessageQueue::AppletMessageQueue(Core::System& system)
: service_context{system, "AppletMessageQueue"} {
on_new_message = service_context.CreateEvent("AMMessageQueue:OnMessageReceived");
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h
index 202d20757..2a578aea5 100644
--- a/src/core/hle/service/am/am.h
+++ b/src/core/hle/service/am/am.h
@@ -151,6 +151,7 @@ private:
void GetAccumulatedSuspendedTickValue(Kernel::HLERequestContext& ctx);
void GetAccumulatedSuspendedTickChangedEvent(Kernel::HLERequestContext& ctx);
void SetAlbumImageTakenNotificationEnabled(Kernel::HLERequestContext& ctx);
+ void SaveCurrentScreenshot(Kernel::HLERequestContext& ctx);
enum class ScreenshotPermission : u32 {
Inherit = 0,
diff --git a/src/core/hle/service/am/applets/applet_controller.cpp b/src/core/hle/service/am/applets/applet_controller.cpp
index 2721679c1..d073f2210 100644
--- a/src/core/hle/service/am/applets/applet_controller.cpp
+++ b/src/core/hle/service/am/applets/applet_controller.cpp
@@ -10,6 +10,9 @@
#include "common/string_util.h"
#include "core/core.h"
#include "core/frontend/applets/controller.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
#include "core/hle/result.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/applet_controller.h"
@@ -25,7 +28,7 @@ namespace Service::AM::Applets {
static Core::Frontend::ControllerParameters ConvertToFrontendParameters(
ControllerSupportArgPrivate private_arg, ControllerSupportArgHeader header, bool enable_text,
std::vector<IdentificationColor> identification_colors, std::vector<ExplainText> text) {
- HID::Controller_NPad::NpadStyleSet npad_style_set;
+ Core::HID::NpadStyleTag npad_style_set;
npad_style_set.raw = private_arg.style_set;
return {
@@ -243,19 +246,11 @@ void Controller::Execute() {
void Controller::ConfigurationComplete() {
ControllerSupportResultInfo result_info{};
- const auto& players = Settings::values.players.GetValue();
-
// If enable_single_mode is enabled, player_count is 1 regardless of any other parameters.
// Otherwise, only count connected players from P1-P8.
- result_info.player_count =
- is_single_mode
- ? 1
- : static_cast<s8>(std::count_if(players.begin(), players.end() - 2,
- [](const auto& player) { return player.connected; }));
-
- result_info.selected_id = HID::Controller_NPad::IndexToNPad(std::distance(
- players.begin(), std::find_if(players.begin(), players.end(),
- [](const auto& player) { return player.connected; })));
+ result_info.player_count = is_single_mode ? 1 : system.HIDCore().GetPlayerCount();
+
+ result_info.selected_id = static_cast<u32>(system.HIDCore().GetFirstNpadId());
result_info.result = 0;
diff --git a/src/core/hle/service/am/applets/applet_controller.h b/src/core/hle/service/am/applets/applet_controller.h
index 0a34c4fc0..1a832505e 100644
--- a/src/core/hle/service/am/applets/applet_controller.h
+++ b/src/core/hle/service/am/applets/applet_controller.h
@@ -16,6 +16,10 @@ namespace Core {
class System;
}
+namespace Core::HID {
+enum class NpadStyleSet : u32;
+}
+
namespace Service::AM::Applets {
using IdentificationColor = std::array<u8, 4>;
@@ -52,7 +56,7 @@ struct ControllerSupportArgPrivate {
bool flag_1{};
ControllerSupportMode mode{};
ControllerSupportCaller caller{};
- u32 style_set{};
+ Core::HID::NpadStyleSet style_set{};
u32 joy_hold_type{};
};
static_assert(sizeof(ControllerSupportArgPrivate) == 0x14,
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index 7320b1c0f..134ac1ee2 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -231,7 +231,7 @@ void AppletManager::SetDefaultAppletFrontendSet() {
void AppletManager::SetDefaultAppletsIfMissing() {
if (frontend.controller == nullptr) {
frontend.controller =
- std::make_unique<Core::Frontend::DefaultControllerApplet>(system.ServiceManager());
+ std::make_unique<Core::Frontend::DefaultControllerApplet>(system.HIDCore());
}
if (frontend.error == nullptr) {
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
index 7da1f2969..981b6c996 100644
--- a/src/core/hle/service/audio/hwopus.cpp
+++ b/src/core/hle/service/audio/hwopus.cpp
@@ -96,7 +96,7 @@ private:
bool DecodeOpusData(u32& consumed, u32& sample_count, const std::vector<u8>& input,
std::vector<opus_int16>& output, u64* out_performance_time) const {
- const auto start_time = std::chrono::high_resolution_clock::now();
+ const auto start_time = std::chrono::steady_clock::now();
const std::size_t raw_output_sz = output.size() * sizeof(opus_int16);
if (sizeof(OpusPacketHeader) > input.size()) {
LOG_ERROR(Audio, "Input is smaller than the header size, header_sz={}, input_sz={}",
@@ -135,7 +135,7 @@ private:
return false;
}
- const auto end_time = std::chrono::high_resolution_clock::now() - start_time;
+ const auto end_time = std::chrono::steady_clock::now() - start_time;
sample_count = out_sample_count;
consumed = static_cast<u32>(sizeof(OpusPacketHeader) + hdr.size);
if (out_performance_time != nullptr) {
diff --git a/src/core/hle/service/caps/caps.h b/src/core/hle/service/caps/caps.h
index b18adcb9d..7254055e6 100644
--- a/src/core/hle/service/caps/caps.h
+++ b/src/core/hle/service/caps/caps.h
@@ -24,7 +24,7 @@ enum class AlbumImageOrientation {
Orientation3 = 3,
};
-enum class AlbumReportOption {
+enum class AlbumReportOption : s32 {
Disable = 0,
Enable = 1,
};
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp
index 68c9240ae..3c36f4085 100644
--- a/src/core/hle/service/friend/friend.cpp
+++ b/src/core/hle/service/friend/friend.cpp
@@ -17,10 +17,11 @@ namespace Service::Friend {
class IFriendService final : public ServiceFramework<IFriendService> {
public:
- explicit IFriendService(Core::System& system_) : ServiceFramework{system_, "IFriendService"} {
+ explicit IFriendService(Core::System& system_)
+ : ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} {
// clang-format off
static const FunctionInfo functions[] = {
- {0, nullptr, "GetCompletionEvent"},
+ {0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
{1, nullptr, "Cancel"},
{10100, nullptr, "GetFriendListIds"},
{10101, &IFriendService::GetFriendList, "GetFriendList"},
@@ -109,6 +110,12 @@ public:
// clang-format on
RegisterHandlers(functions);
+
+ completion_event = service_context.CreateEvent("IFriendService:CompletionEvent");
+ }
+
+ ~IFriendService() override {
+ service_context.CloseEvent(completion_event);
}
private:
@@ -129,6 +136,14 @@ private:
};
static_assert(sizeof(SizedFriendFilter) == 0x10, "SizedFriendFilter is an invalid size");
+ void GetCompletionEvent(Kernel::HLERequestContext& ctx) {
+ LOG_DEBUG(Service_Friend, "called");
+
+ IPC::ResponseBuilder rb{ctx, 2, 1};
+ rb.Push(ResultSuccess);
+ rb.PushCopyObjects(completion_event->GetReadableEvent());
+ }
+
void GetBlockedUserListIds(Kernel::HLERequestContext& ctx) {
// This is safe to stub, as there should be no adverse consequences from reporting no
// blocked users.
@@ -179,6 +194,10 @@ private:
rb.Push<u32>(0); // Friend count
// TODO(ogniK): Return a buffer of u64s which are the "NetworkServiceAccountId"
}
+
+ KernelHelpers::ServiceContext service_context;
+
+ Kernel::KEvent* completion_event;
};
class INotificationService final : public ServiceFramework<INotificationService> {
diff --git a/src/core/hle/service/glue/glue.cpp b/src/core/hle/service/glue/glue.cpp
index a08dc9758..b24d469cf 100644
--- a/src/core/hle/service/glue/glue.cpp
+++ b/src/core/hle/service/glue/glue.cpp
@@ -8,6 +8,7 @@
#include "core/hle/service/glue/bgtc.h"
#include "core/hle/service/glue/ectx.h"
#include "core/hle/service/glue/glue.h"
+#include "core/hle/service/glue/notif.h"
namespace Service::Glue {
@@ -24,6 +25,9 @@ void InstallInterfaces(Core::System& system) {
// Error Context
std::make_shared<ECTX_AW>(system)->InstallAsService(system.ServiceManager());
+
+ // Notification Services for application
+ std::make_shared<NOTIF_A>(system)->InstallAsService(system.ServiceManager());
}
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp
new file mode 100644
index 000000000..c559ec9df
--- /dev/null
+++ b/src/core/hle/service/glue/notif.cpp
@@ -0,0 +1,44 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/hle/ipc_helpers.h"
+#include "core/hle/service/glue/notif.h"
+
+namespace Service::Glue {
+
+NOTIF_A::NOTIF_A(Core::System& system_) : ServiceFramework{system_, "notif:a"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {500, nullptr, "RegisterAlarmSetting"},
+ {510, nullptr, "UpdateAlarmSetting"},
+ {520, &NOTIF_A::ListAlarmSettings, "ListAlarmSettings"},
+ {530, nullptr, "LoadApplicationParameter"},
+ {540, nullptr, "DeleteAlarmSetting"},
+ {1000, &NOTIF_A::Initialize, "Initialize"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+NOTIF_A::~NOTIF_A() = default;
+
+void NOTIF_A::ListAlarmSettings(Kernel::HLERequestContext& ctx) {
+ // Returns an array of AlarmSetting
+ constexpr s32 alarm_count = 0;
+
+ LOG_WARNING(Service_NOTIF, "(STUBBED) called");
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(alarm_count);
+}
+
+void NOTIF_A::Initialize(Kernel::HLERequestContext& ctx) {
+ LOG_WARNING(Service_NOTIF, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
+} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h
new file mode 100644
index 000000000..6ecf2015c
--- /dev/null
+++ b/src/core/hle/service/glue/notif.h
@@ -0,0 +1,25 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::Glue {
+
+class NOTIF_A final : public ServiceFramework<NOTIF_A> {
+public:
+ explicit NOTIF_A(Core::System& system_);
+ ~NOTIF_A() override;
+
+private:
+ void ListAlarmSettings(Kernel::HLERequestContext& ctx);
+ void Initialize(Kernel::HLERequestContext& ctx);
+};
+
+} // namespace Service::Glue
diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.cpp b/src/core/hle/service/hid/controllers/console_sixaxis.cpp
index bda6e2557..f0f3105dc 100644
--- a/src/core/hle/service/hid/controllers/console_sixaxis.cpp
+++ b/src/core/hle/service/hid/controllers/console_sixaxis.cpp
@@ -4,13 +4,18 @@
#include "common/settings.h"
#include "core/core_timing.h"
+#include "core/hid/emulated_console.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/console_sixaxis.h"
namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C200;
-Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::System& system_)
- : ControllerBase{system_} {}
+Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::HID::HIDCore& hid_core_)
+ : ControllerBase{hid_core_} {
+ console = hid_core.GetEmulatedConsole();
+}
+
Controller_ConsoleSixAxis::~Controller_ConsoleSixAxis() = default;
void Controller_ConsoleSixAxis::OnInit() {}
@@ -19,44 +24,31 @@ void Controller_ConsoleSixAxis::OnRelease() {}
void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- seven_six_axis.header.timestamp = core_timing.GetCPUTicks();
- seven_six_axis.header.total_entry_count = 17;
-
if (!IsControllerActivated() || !is_transfer_memory_set) {
- seven_six_axis.header.entry_count = 0;
- seven_six_axis.header.last_entry_index = 0;
+ seven_sixaxis_lifo.buffer_count = 0;
+ seven_sixaxis_lifo.buffer_tail = 0;
return;
}
- seven_six_axis.header.entry_count = 16;
-
- const auto& last_entry =
- seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index];
- seven_six_axis.header.last_entry_index = (seven_six_axis.header.last_entry_index + 1) % 17;
- auto& cur_entry = seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index];
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
+ const auto& last_entry = seven_sixaxis_lifo.ReadCurrentEntry().state;
+ next_seven_sixaxis_state.sampling_number = last_entry.sampling_number + 1;
// Try to read sixaxis sensor states
- MotionDevice motion_device{};
- const auto& device = motions[0];
- if (device) {
- std::tie(motion_device.accel, motion_device.gyro, motion_device.rotation,
- motion_device.orientation, motion_device.quaternion) = device->GetStatus();
- console_six_axis.is_seven_six_axis_sensor_at_rest = motion_device.gyro.Length2() < 0.0001f;
- }
+ const auto motion_status = console->GetMotion();
+
+ console_six_axis.is_seven_six_axis_sensor_at_rest = motion_status.is_at_rest;
- cur_entry.accel = motion_device.accel;
+ next_seven_sixaxis_state.accel = motion_status.accel;
// Zero gyro values as they just mess up with the camera
// Note: Probably a correct sensivity setting must be set
- cur_entry.gyro = {};
- cur_entry.quaternion = {
+ next_seven_sixaxis_state.gyro = {};
+ next_seven_sixaxis_state.quaternion = {
{
- motion_device.quaternion.xyz.y,
- motion_device.quaternion.xyz.x,
- -motion_device.quaternion.w,
+ motion_status.quaternion.xyz.y,
+ motion_status.quaternion.xyz.x,
+ -motion_status.quaternion.w,
},
- -motion_device.quaternion.xyz.z,
+ -motion_status.quaternion.xyz.z,
};
console_six_axis.sampling_number++;
@@ -67,14 +59,8 @@ void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_ti
// Update console six axis shared memory
std::memcpy(data + SHARED_MEMORY_OFFSET, &console_six_axis, sizeof(console_six_axis));
// Update seven six axis transfer memory
- std::memcpy(transfer_memory, &seven_six_axis, sizeof(seven_six_axis));
-}
-
-void Controller_ConsoleSixAxis::OnLoadInputDevices() {
- const auto player = Settings::values.players.GetValue()[0];
- std::transform(player.motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN,
- player.motions.begin() + Settings::NativeMotion::MOTION_HID_END, motions.begin(),
- Input::CreateDevice<Input::MotionDevice>);
+ seven_sixaxis_lifo.WriteNextEntry(next_seven_sixaxis_state);
+ std::memcpy(transfer_memory, &seven_sixaxis_lifo, sizeof(seven_sixaxis_lifo));
}
void Controller_ConsoleSixAxis::SetTransferMemoryPointer(u8* t_mem) {
@@ -83,8 +69,7 @@ void Controller_ConsoleSixAxis::SetTransferMemoryPointer(u8* t_mem) {
}
void Controller_ConsoleSixAxis::ResetTimestamp() {
- auto& cur_entry = seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index];
- cur_entry.sampling_number = 0;
- cur_entry.sampling_number2 = 0;
+ seven_sixaxis_lifo.buffer_count = 0;
+ seven_sixaxis_lifo.buffer_tail = 0;
}
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.h b/src/core/hle/service/hid/controllers/console_sixaxis.h
index fd8a427af..279241858 100644
--- a/src/core/hle/service/hid/controllers/console_sixaxis.h
+++ b/src/core/hle/service/hid/controllers/console_sixaxis.h
@@ -5,16 +5,21 @@
#pragma once
#include <array>
-#include "common/bit_field.h"
+
#include "common/common_types.h"
#include "common/quaternion.h"
-#include "core/frontend/input.h"
+#include "core/hid/hid_types.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedConsole;
+} // namespace Core::HID
namespace Service::HID {
class Controller_ConsoleSixAxis final : public ControllerBase {
public:
- explicit Controller_ConsoleSixAxis(Core::System& system_);
+ explicit Controller_ConsoleSixAxis(Core::HID::HIDCore& hid_core_);
~Controller_ConsoleSixAxis() override;
// Called when the controller is initialized
@@ -26,9 +31,6 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
// Called on InitializeSevenSixAxisSensor
void SetTransferMemoryPointer(u8* t_mem);
@@ -38,43 +40,31 @@ public:
private:
struct SevenSixAxisState {
INSERT_PADDING_WORDS(4); // unused
- s64_le sampling_number{};
- s64_le sampling_number2{};
+ s64 sampling_number{};
u64 unknown{};
Common::Vec3f accel{};
Common::Vec3f gyro{};
Common::Quaternion<f32> quaternion{};
};
- static_assert(sizeof(SevenSixAxisState) == 0x50, "SevenSixAxisState is an invalid size");
-
- struct SevenSixAxisMemory {
- CommonHeader header{};
- std::array<SevenSixAxisState, 0x21> sevensixaxis_states{};
- };
- static_assert(sizeof(SevenSixAxisMemory) == 0xA70, "SevenSixAxisMemory is an invalid size");
+ static_assert(sizeof(SevenSixAxisState) == 0x48, "SevenSixAxisState is an invalid size");
+ // This is nn::hid::detail::ConsoleSixAxisSensorSharedMemoryFormat
struct ConsoleSharedMemory {
- u64_le sampling_number{};
+ u64 sampling_number{};
bool is_seven_six_axis_sensor_at_rest{};
+ INSERT_PADDING_BYTES(4); // padding
f32 verticalization_error{};
Common::Vec3f gyro_bias{};
};
static_assert(sizeof(ConsoleSharedMemory) == 0x20, "ConsoleSharedMemory is an invalid size");
- struct MotionDevice {
- Common::Vec3f accel;
- Common::Vec3f gyro;
- Common::Vec3f rotation;
- std::array<Common::Vec3f, 3> orientation;
- Common::Quaternion<f32> quaternion;
- };
+ Lifo<SevenSixAxisState, 0x21> seven_sixaxis_lifo{};
+ static_assert(sizeof(seven_sixaxis_lifo) == 0xA70, "SevenSixAxisState is an invalid size");
- using MotionArray =
- std::array<std::unique_ptr<Input::MotionDevice>, Settings::NativeMotion::NUM_MOTIONS_HID>;
- MotionArray motions;
+ Core::HID::EmulatedConsole* console;
u8* transfer_memory = nullptr;
bool is_transfer_memory_set = false;
ConsoleSharedMemory console_six_axis{};
- SevenSixAxisMemory seven_six_axis{};
+ SevenSixAxisState next_seven_sixaxis_state{};
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/controller_base.cpp b/src/core/hle/service/hid/controllers/controller_base.cpp
index 9d1e6db6a..788ae9ae7 100644
--- a/src/core/hle/service/hid/controllers/controller_base.cpp
+++ b/src/core/hle/service/hid/controllers/controller_base.cpp
@@ -6,12 +6,12 @@
namespace Service::HID {
-ControllerBase::ControllerBase(Core::System& system_) : system(system_) {}
+ControllerBase::ControllerBase(Core::HID::HIDCore& hid_core_) : hid_core(hid_core_) {}
ControllerBase::~ControllerBase() = default;
void ControllerBase::ActivateController() {
if (is_activated) {
- OnRelease();
+ return;
}
is_activated = true;
OnInit();
diff --git a/src/core/hle/service/hid/controllers/controller_base.h b/src/core/hle/service/hid/controllers/controller_base.h
index 1556fb08e..7450eb20a 100644
--- a/src/core/hle/service/hid/controllers/controller_base.h
+++ b/src/core/hle/service/hid/controllers/controller_base.h
@@ -11,14 +11,14 @@ namespace Core::Timing {
class CoreTiming;
}
-namespace Core {
-class System;
+namespace Core::HID {
+class HIDCore;
}
namespace Service::HID {
class ControllerBase {
public:
- explicit ControllerBase(Core::System& system_);
+ explicit ControllerBase(Core::HID::HIDCore& hid_core_);
virtual ~ControllerBase();
// Called when the controller is initialized
@@ -35,26 +35,17 @@ public:
virtual void OnMotionUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {}
- // Called when input devices should be loaded
- virtual void OnLoadInputDevices() = 0;
-
void ActivateController();
void DeactivateController();
bool IsControllerActivated() const;
+ static const std::size_t hid_entry_count = 17;
+
protected:
bool is_activated{false};
- struct CommonHeader {
- s64_le timestamp;
- s64_le total_entry_count;
- s64_le last_entry_index;
- s64_le entry_count;
- };
- static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
-
- Core::System& system;
+ Core::HID::HIDCore& hid_core;
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/debug_pad.cpp b/src/core/hle/service/hid/controllers/debug_pad.cpp
index d439b8fb0..6a6fb9cab 100644
--- a/src/core/hle/service/hid/controllers/debug_pad.cpp
+++ b/src/core/hle/service/hid/controllers/debug_pad.cpp
@@ -6,15 +6,19 @@
#include "common/common_types.h"
#include "common/settings.h"
#include "core/core_timing.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
#include "core/hle/service/hid/controllers/debug_pad.h"
namespace Service::HID {
+constexpr std::size_t SHARED_MEMORY_OFFSET = 0x00000;
-constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
-[[maybe_unused]] constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
-enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right };
+Controller_DebugPad::Controller_DebugPad(Core::HID::HIDCore& hid_core_)
+ : ControllerBase{hid_core_} {
+ controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Other);
+}
-Controller_DebugPad::Controller_DebugPad(Core::System& system_) : ControllerBase{system_} {}
Controller_DebugPad::~Controller_DebugPad() = default;
void Controller_DebugPad::OnInit() {}
@@ -23,63 +27,29 @@ void Controller_DebugPad::OnRelease() {}
void Controller_DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- shared_memory.header.timestamp = core_timing.GetCPUTicks();
- shared_memory.header.total_entry_count = 17;
-
if (!IsControllerActivated()) {
- shared_memory.header.entry_count = 0;
- shared_memory.header.last_entry_index = 0;
+ debug_pad_lifo.buffer_count = 0;
+ debug_pad_lifo.buffer_tail = 0;
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &debug_pad_lifo, sizeof(debug_pad_lifo));
return;
}
- shared_memory.header.entry_count = 16;
- const auto& last_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
- shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
- auto& cur_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
-
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
+ const auto& last_entry = debug_pad_lifo.ReadCurrentEntry().state;
+ next_state.sampling_number = last_entry.sampling_number + 1;
if (Settings::values.debug_pad_enabled) {
- cur_entry.attribute.connected.Assign(1);
- auto& pad = cur_entry.pad_state;
+ next_state.attribute.connected.Assign(1);
- using namespace Settings::NativeButton;
- pad.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus());
- pad.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus());
- pad.x.Assign(buttons[X - BUTTON_HID_BEGIN]->GetStatus());
- pad.y.Assign(buttons[Y - BUTTON_HID_BEGIN]->GetStatus());
- pad.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus());
- pad.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus());
- pad.zl.Assign(buttons[ZL - BUTTON_HID_BEGIN]->GetStatus());
- pad.zr.Assign(buttons[ZR - BUTTON_HID_BEGIN]->GetStatus());
- pad.plus.Assign(buttons[Plus - BUTTON_HID_BEGIN]->GetStatus());
- pad.minus.Assign(buttons[Minus - BUTTON_HID_BEGIN]->GetStatus());
- pad.d_left.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus());
- pad.d_up.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus());
- pad.d_right.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus());
- pad.d_down.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus());
+ const auto& button_state = controller->GetDebugPadButtons();
+ const auto& stick_state = controller->GetSticks();
- const auto [stick_l_x_f, stick_l_y_f] =
- analogs[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus();
- const auto [stick_r_x_f, stick_r_y_f] =
- analogs[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus();
- cur_entry.l_stick.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX);
- cur_entry.l_stick.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX);
- cur_entry.r_stick.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX);
- cur_entry.r_stick.y = static_cast<s32>(stick_r_y_f * HID_JOYSTICK_MAX);
+ next_state.pad_state = button_state;
+ next_state.l_stick = stick_state.left;
+ next_state.r_stick = stick_state.right;
}
- std::memcpy(data, &shared_memory, sizeof(SharedMemory));
+ debug_pad_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &debug_pad_lifo, sizeof(debug_pad_lifo));
}
-void Controller_DebugPad::OnLoadInputDevices() {
- std::transform(Settings::values.debug_pad_buttons.begin(),
- Settings::values.debug_pad_buttons.begin() +
- Settings::NativeButton::NUM_BUTTONS_HID,
- buttons.begin(), Input::CreateDevice<Input::ButtonDevice>);
- std::transform(Settings::values.debug_pad_analogs.begin(),
- Settings::values.debug_pad_analogs.end(), analogs.begin(),
- Input::CreateDevice<Input::AnalogDevice>);
-}
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/debug_pad.h b/src/core/hle/service/hid/controllers/debug_pad.h
index 1b1645184..afe374fc2 100644
--- a/src/core/hle/service/hid/controllers/debug_pad.h
+++ b/src/core/hle/service/hid/controllers/debug_pad.h
@@ -8,15 +8,20 @@
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
-#include "common/settings.h"
#include "common/swap.h"
-#include "core/frontend/input.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedController;
+struct DebugPadButton;
+struct AnalogStickState;
+} // namespace Core::HID
namespace Service::HID {
class Controller_DebugPad final : public ControllerBase {
public:
- explicit Controller_DebugPad(Core::System& system_);
+ explicit Controller_DebugPad(Core::HID::HIDCore& hid_core_);
~Controller_DebugPad() override;
// Called when the controller is initialized
@@ -28,66 +33,31 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
- struct AnalogStick {
- s32_le x;
- s32_le y;
- };
- static_assert(sizeof(AnalogStick) == 0x8);
-
- struct PadState {
- union {
- u32_le raw{};
- BitField<0, 1, u32> a;
- BitField<1, 1, u32> b;
- BitField<2, 1, u32> x;
- BitField<3, 1, u32> y;
- BitField<4, 1, u32> l;
- BitField<5, 1, u32> r;
- BitField<6, 1, u32> zl;
- BitField<7, 1, u32> zr;
- BitField<8, 1, u32> plus;
- BitField<9, 1, u32> minus;
- BitField<10, 1, u32> d_left;
- BitField<11, 1, u32> d_up;
- BitField<12, 1, u32> d_right;
- BitField<13, 1, u32> d_down;
- };
- };
- static_assert(sizeof(PadState) == 0x4, "PadState is an invalid size");
-
- struct Attributes {
+ // This is nn::hid::DebugPadAttribute
+ struct DebugPadAttribute {
union {
- u32_le raw{};
+ u32 raw{};
BitField<0, 1, u32> connected;
};
};
- static_assert(sizeof(Attributes) == 0x4, "Attributes is an invalid size");
-
- struct PadStates {
- s64_le sampling_number;
- s64_le sampling_number2;
- Attributes attribute;
- PadState pad_state;
- AnalogStick r_stick;
- AnalogStick l_stick;
+ static_assert(sizeof(DebugPadAttribute) == 0x4, "DebugPadAttribute is an invalid size");
+
+ // This is nn::hid::DebugPadState
+ struct DebugPadState {
+ s64 sampling_number;
+ DebugPadAttribute attribute;
+ Core::HID::DebugPadButton pad_state;
+ Core::HID::AnalogStickState r_stick;
+ Core::HID::AnalogStickState l_stick;
};
- static_assert(sizeof(PadStates) == 0x28, "PadStates is an invalid state");
+ static_assert(sizeof(DebugPadState) == 0x20, "DebugPadState is an invalid state");
- struct SharedMemory {
- CommonHeader header;
- std::array<PadStates, 17> pad_states;
- INSERT_PADDING_BYTES(0x138);
- };
- static_assert(sizeof(SharedMemory) == 0x400, "SharedMemory is an invalid size");
- SharedMemory shared_memory{};
+ // This is nn::hid::detail::DebugPadLifo
+ Lifo<DebugPadState, hid_entry_count> debug_pad_lifo{};
+ static_assert(sizeof(debug_pad_lifo) == 0x2C8, "debug_pad_lifo is an invalid size");
+ DebugPadState next_state{};
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>
- buttons;
- std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>
- analogs;
+ Core::HID::EmulatedController* controller;
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/gesture.cpp b/src/core/hle/service/hid/controllers/gesture.cpp
index 764abb5b6..fe895c4f6 100644
--- a/src/core/hle/service/hid/controllers/gesture.cpp
+++ b/src/core/hle/service/hid/controllers/gesture.cpp
@@ -7,6 +7,7 @@
#include "common/settings.h"
#include "core/core_timing.h"
#include "core/frontend/emu_window.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/gesture.h"
namespace Service::HID {
@@ -23,16 +24,14 @@ constexpr f32 Square(s32 num) {
return static_cast<f32>(num * num);
}
-Controller_Gesture::Controller_Gesture(Core::System& system_) : ControllerBase(system_) {}
+Controller_Gesture::Controller_Gesture(Core::HID::HIDCore& hid_core_) : ControllerBase(hid_core_) {
+ console = hid_core.GetEmulatedConsole();
+}
Controller_Gesture::~Controller_Gesture() = default;
void Controller_Gesture::OnInit() {
- for (std::size_t id = 0; id < MAX_FINGERS; ++id) {
- mouse_finger_id[id] = MAX_POINTS;
- keyboard_finger_id[id] = MAX_POINTS;
- udp_finger_id[id] = MAX_POINTS;
- }
- shared_memory.header.entry_count = 0;
+ gesture_lifo.buffer_count = 0;
+ gesture_lifo.buffer_tail = 0;
force_update = true;
}
@@ -40,50 +39,38 @@ void Controller_Gesture::OnRelease() {}
void Controller_Gesture::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- shared_memory.header.timestamp = core_timing.GetCPUTicks();
- shared_memory.header.total_entry_count = 17;
-
if (!IsControllerActivated()) {
- shared_memory.header.entry_count = 0;
- shared_memory.header.last_entry_index = 0;
+ gesture_lifo.buffer_count = 0;
+ gesture_lifo.buffer_tail = 0;
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &gesture_lifo, sizeof(gesture_lifo));
return;
}
ReadTouchInput();
GestureProperties gesture = GetGestureProperties();
- f32 time_difference = static_cast<f32>(shared_memory.header.timestamp - last_update_timestamp) /
- (1000 * 1000 * 1000);
+ f32 time_difference =
+ static_cast<f32>(gesture_lifo.timestamp - last_update_timestamp) / (1000 * 1000 * 1000);
// Only update if necesary
if (!ShouldUpdateGesture(gesture, time_difference)) {
return;
}
- last_update_timestamp = shared_memory.header.timestamp;
+ last_update_timestamp = gesture_lifo.timestamp;
UpdateGestureSharedMemory(data, size, gesture, time_difference);
}
void Controller_Gesture::ReadTouchInput() {
- const Input::TouchStatus& mouse_status = touch_mouse_device->GetStatus();
- const Input::TouchStatus& udp_status = touch_udp_device->GetStatus();
- for (std::size_t id = 0; id < mouse_status.size(); ++id) {
- mouse_finger_id[id] = UpdateTouchInputEvent(mouse_status[id], mouse_finger_id[id]);
- udp_finger_id[id] = UpdateTouchInputEvent(udp_status[id], udp_finger_id[id]);
- }
-
- if (Settings::values.use_touch_from_button) {
- const Input::TouchStatus& keyboard_status = touch_btn_device->GetStatus();
- for (std::size_t id = 0; id < mouse_status.size(); ++id) {
- keyboard_finger_id[id] =
- UpdateTouchInputEvent(keyboard_status[id], keyboard_finger_id[id]);
- }
+ const auto touch_status = console->GetTouch();
+ for (std::size_t id = 0; id < fingers.size(); ++id) {
+ fingers[id] = touch_status[id];
}
}
bool Controller_Gesture::ShouldUpdateGesture(const GestureProperties& gesture,
f32 time_difference) {
- const auto& last_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
+ const auto& last_entry = GetLastGestureEntry();
if (force_update) {
force_update = false;
return true;
@@ -97,7 +84,7 @@ bool Controller_Gesture::ShouldUpdateGesture(const GestureProperties& gesture,
}
// Update on press and hold event after 0.5 seconds
- if (last_entry.type == TouchType::Touch && last_entry.point_count == 1 &&
+ if (last_entry.type == GestureType::Touch && last_entry.point_count == 1 &&
time_difference > press_delay) {
return enable_press_and_tap;
}
@@ -108,27 +95,19 @@ bool Controller_Gesture::ShouldUpdateGesture(const GestureProperties& gesture,
void Controller_Gesture::UpdateGestureSharedMemory(u8* data, std::size_t size,
GestureProperties& gesture,
f32 time_difference) {
- TouchType type = TouchType::Idle;
- Attribute attributes{};
+ GestureType type = GestureType::Idle;
+ GestureAttribute attributes{};
- const auto& last_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
- shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
- auto& cur_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
+ const auto& last_entry = gesture_lifo.ReadCurrentEntry().state;
- if (shared_memory.header.entry_count < 16) {
- shared_memory.header.entry_count++;
- }
-
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
-
- // Reset values to default
- cur_entry.delta = {};
- cur_entry.vel_x = 0;
- cur_entry.vel_y = 0;
- cur_entry.direction = Direction::None;
- cur_entry.rotation_angle = 0;
- cur_entry.scale = 0;
+ // Reset next state to default
+ next_state.sampling_number = last_entry.sampling_number + 1;
+ next_state.delta = {};
+ next_state.vel_x = 0;
+ next_state.vel_y = 0;
+ next_state.direction = GestureDirection::None;
+ next_state.rotation_angle = 0;
+ next_state.scale = 0;
if (gesture.active_points > 0) {
if (last_gesture.active_points == 0) {
@@ -141,46 +120,47 @@ void Controller_Gesture::UpdateGestureSharedMemory(u8* data, std::size_t size,
}
// Apply attributes
- cur_entry.detection_count = gesture.detection_count;
- cur_entry.type = type;
- cur_entry.attributes = attributes;
- cur_entry.pos = gesture.mid_point;
- cur_entry.point_count = static_cast<s32>(gesture.active_points);
- cur_entry.points = gesture.points;
+ next_state.detection_count = gesture.detection_count;
+ next_state.type = type;
+ next_state.attributes = attributes;
+ next_state.pos = gesture.mid_point;
+ next_state.point_count = static_cast<s32>(gesture.active_points);
+ next_state.points = gesture.points;
last_gesture = gesture;
- std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(SharedMemory));
+ gesture_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &gesture_lifo, sizeof(gesture_lifo));
}
-void Controller_Gesture::NewGesture(GestureProperties& gesture, TouchType& type,
- Attribute& attributes) {
+void Controller_Gesture::NewGesture(GestureProperties& gesture, GestureType& type,
+ GestureAttribute& attributes) {
const auto& last_entry = GetLastGestureEntry();
gesture.detection_count++;
- type = TouchType::Touch;
+ type = GestureType::Touch;
// New touch after cancel is not considered new
- if (last_entry.type != TouchType::Cancel) {
+ if (last_entry.type != GestureType::Cancel) {
attributes.is_new_touch.Assign(1);
enable_press_and_tap = true;
}
}
-void Controller_Gesture::UpdateExistingGesture(GestureProperties& gesture, TouchType& type,
+void Controller_Gesture::UpdateExistingGesture(GestureProperties& gesture, GestureType& type,
f32 time_difference) {
const auto& last_entry = GetLastGestureEntry();
// Promote to pan type if touch moved
for (size_t id = 0; id < MAX_POINTS; id++) {
if (gesture.points[id] != last_gesture.points[id]) {
- type = TouchType::Pan;
+ type = GestureType::Pan;
break;
}
}
// Number of fingers changed cancel the last event and clear data
if (gesture.active_points != last_gesture.active_points) {
- type = TouchType::Cancel;
+ type = GestureType::Cancel;
enable_press_and_tap = false;
gesture.active_points = 0;
gesture.mid_point = {};
@@ -189,41 +169,41 @@ void Controller_Gesture::UpdateExistingGesture(GestureProperties& gesture, Touch
}
// Calculate extra parameters of panning
- if (type == TouchType::Pan) {
+ if (type == GestureType::Pan) {
UpdatePanEvent(gesture, last_gesture, type, time_difference);
return;
}
// Promote to press type
- if (last_entry.type == TouchType::Touch) {
- type = TouchType::Press;
+ if (last_entry.type == GestureType::Touch) {
+ type = GestureType::Press;
}
}
void Controller_Gesture::EndGesture(GestureProperties& gesture,
- GestureProperties& last_gesture_props, TouchType& type,
- Attribute& attributes, f32 time_difference) {
+ GestureProperties& last_gesture_props, GestureType& type,
+ GestureAttribute& attributes, f32 time_difference) {
const auto& last_entry = GetLastGestureEntry();
if (last_gesture_props.active_points != 0) {
switch (last_entry.type) {
- case TouchType::Touch:
+ case GestureType::Touch:
if (enable_press_and_tap) {
SetTapEvent(gesture, last_gesture_props, type, attributes);
return;
}
- type = TouchType::Cancel;
+ type = GestureType::Cancel;
force_update = true;
break;
- case TouchType::Press:
- case TouchType::Tap:
- case TouchType::Swipe:
- case TouchType::Pinch:
- case TouchType::Rotate:
- type = TouchType::Complete;
+ case GestureType::Press:
+ case GestureType::Tap:
+ case GestureType::Swipe:
+ case GestureType::Pinch:
+ case GestureType::Rotate:
+ type = GestureType::Complete;
force_update = true;
break;
- case TouchType::Pan:
+ case GestureType::Pan:
EndPanEvent(gesture, last_gesture_props, type, time_difference);
break;
default:
@@ -231,15 +211,15 @@ void Controller_Gesture::EndGesture(GestureProperties& gesture,
}
return;
}
- if (last_entry.type == TouchType::Complete || last_entry.type == TouchType::Cancel) {
+ if (last_entry.type == GestureType::Complete || last_entry.type == GestureType::Cancel) {
gesture.detection_count++;
}
}
void Controller_Gesture::SetTapEvent(GestureProperties& gesture,
- GestureProperties& last_gesture_props, TouchType& type,
- Attribute& attributes) {
- type = TouchType::Tap;
+ GestureProperties& last_gesture_props, GestureType& type,
+ GestureAttribute& attributes) {
+ type = GestureType::Tap;
gesture = last_gesture_props;
force_update = true;
f32 tap_time_difference =
@@ -251,44 +231,42 @@ void Controller_Gesture::SetTapEvent(GestureProperties& gesture,
}
void Controller_Gesture::UpdatePanEvent(GestureProperties& gesture,
- GestureProperties& last_gesture_props, TouchType& type,
+ GestureProperties& last_gesture_props, GestureType& type,
f32 time_difference) {
- auto& cur_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
const auto& last_entry = GetLastGestureEntry();
- cur_entry.delta = gesture.mid_point - last_entry.pos;
- cur_entry.vel_x = static_cast<f32>(cur_entry.delta.x) / time_difference;
- cur_entry.vel_y = static_cast<f32>(cur_entry.delta.y) / time_difference;
+ next_state.delta = gesture.mid_point - last_entry.pos;
+ next_state.vel_x = static_cast<f32>(next_state.delta.x) / time_difference;
+ next_state.vel_y = static_cast<f32>(next_state.delta.y) / time_difference;
last_pan_time_difference = time_difference;
// Promote to pinch type
if (std::abs(gesture.average_distance - last_gesture_props.average_distance) >
pinch_threshold) {
- type = TouchType::Pinch;
- cur_entry.scale = gesture.average_distance / last_gesture_props.average_distance;
+ type = GestureType::Pinch;
+ next_state.scale = gesture.average_distance / last_gesture_props.average_distance;
}
const f32 angle_between_two_lines = std::atan((gesture.angle - last_gesture_props.angle) /
(1 + (gesture.angle * last_gesture_props.angle)));
// Promote to rotate type
if (std::abs(angle_between_two_lines) > angle_threshold) {
- type = TouchType::Rotate;
- cur_entry.scale = 0;
- cur_entry.rotation_angle = angle_between_two_lines * 180.0f / Common::PI;
+ type = GestureType::Rotate;
+ next_state.scale = 0;
+ next_state.rotation_angle = angle_between_two_lines * 180.0f / Common::PI;
}
}
void Controller_Gesture::EndPanEvent(GestureProperties& gesture,
- GestureProperties& last_gesture_props, TouchType& type,
+ GestureProperties& last_gesture_props, GestureType& type,
f32 time_difference) {
- auto& cur_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
const auto& last_entry = GetLastGestureEntry();
- cur_entry.vel_x =
+ next_state.vel_x =
static_cast<f32>(last_entry.delta.x) / (last_pan_time_difference + time_difference);
- cur_entry.vel_y =
+ next_state.vel_y =
static_cast<f32>(last_entry.delta.y) / (last_pan_time_difference + time_difference);
const f32 curr_vel =
- std::sqrt((cur_entry.vel_x * cur_entry.vel_x) + (cur_entry.vel_y * cur_entry.vel_y));
+ std::sqrt((next_state.vel_x * next_state.vel_x) + (next_state.vel_y * next_state.vel_y));
// Set swipe event with parameters
if (curr_vel > swipe_threshold) {
@@ -297,105 +275,50 @@ void Controller_Gesture::EndPanEvent(GestureProperties& gesture,
}
// End panning without swipe
- type = TouchType::Complete;
- cur_entry.vel_x = 0;
- cur_entry.vel_y = 0;
+ type = GestureType::Complete;
+ next_state.vel_x = 0;
+ next_state.vel_y = 0;
force_update = true;
}
void Controller_Gesture::SetSwipeEvent(GestureProperties& gesture,
- GestureProperties& last_gesture_props, TouchType& type) {
- auto& cur_entry = shared_memory.gesture_states[shared_memory.header.last_entry_index];
+ GestureProperties& last_gesture_props, GestureType& type) {
const auto& last_entry = GetLastGestureEntry();
- type = TouchType::Swipe;
+ type = GestureType::Swipe;
gesture = last_gesture_props;
force_update = true;
- cur_entry.delta = last_entry.delta;
+ next_state.delta = last_entry.delta;
- if (std::abs(cur_entry.delta.x) > std::abs(cur_entry.delta.y)) {
- if (cur_entry.delta.x > 0) {
- cur_entry.direction = Direction::Right;
+ if (std::abs(next_state.delta.x) > std::abs(next_state.delta.y)) {
+ if (next_state.delta.x > 0) {
+ next_state.direction = GestureDirection::Right;
return;
}
- cur_entry.direction = Direction::Left;
+ next_state.direction = GestureDirection::Left;
return;
}
- if (cur_entry.delta.y > 0) {
- cur_entry.direction = Direction::Down;
+ if (next_state.delta.y > 0) {
+ next_state.direction = GestureDirection::Down;
return;
}
- cur_entry.direction = Direction::Up;
-}
-
-void Controller_Gesture::OnLoadInputDevices() {
- touch_mouse_device = Input::CreateDevice<Input::TouchDevice>("engine:emu_window");
- touch_udp_device = Input::CreateDevice<Input::TouchDevice>("engine:cemuhookudp");
- touch_btn_device = Input::CreateDevice<Input::TouchDevice>("engine:touch_from_button");
-}
-
-std::optional<std::size_t> Controller_Gesture::GetUnusedFingerID() const {
- // Dont assign any touch input to a point if disabled
- if (!Settings::values.touchscreen.enabled) {
- return std::nullopt;
- }
- std::size_t first_free_id = 0;
- while (first_free_id < MAX_POINTS) {
- if (!fingers[first_free_id].pressed) {
- return first_free_id;
- } else {
- first_free_id++;
- }
- }
- return std::nullopt;
-}
-
-Controller_Gesture::GestureState& Controller_Gesture::GetLastGestureEntry() {
- return shared_memory.gesture_states[(shared_memory.header.last_entry_index + 16) % 17];
+ next_state.direction = GestureDirection::Up;
}
const Controller_Gesture::GestureState& Controller_Gesture::GetLastGestureEntry() const {
- return shared_memory.gesture_states[(shared_memory.header.last_entry_index + 16) % 17];
-}
-
-std::size_t Controller_Gesture::UpdateTouchInputEvent(
- const std::tuple<float, float, bool>& touch_input, std::size_t finger_id) {
- const auto& [x, y, pressed] = touch_input;
- if (finger_id > MAX_POINTS) {
- LOG_ERROR(Service_HID, "Invalid finger id {}", finger_id);
- return MAX_POINTS;
- }
- if (pressed) {
- if (finger_id == MAX_POINTS) {
- const auto first_free_id = GetUnusedFingerID();
- if (!first_free_id) {
- // Invalid finger id do nothing
- return MAX_POINTS;
- }
- finger_id = first_free_id.value();
- fingers[finger_id].pressed = true;
- }
- fingers[finger_id].pos = {x, y};
- return finger_id;
- }
-
- if (finger_id != MAX_POINTS) {
- fingers[finger_id].pressed = false;
- }
-
- return MAX_POINTS;
+ return gesture_lifo.ReadCurrentEntry().state;
}
Controller_Gesture::GestureProperties Controller_Gesture::GetGestureProperties() {
GestureProperties gesture;
- std::array<Finger, MAX_POINTS> active_fingers;
+ std::array<Core::HID::TouchFinger, MAX_POINTS> active_fingers;
const auto end_iter = std::copy_if(fingers.begin(), fingers.end(), active_fingers.begin(),
[](const auto& finger) { return finger.pressed; });
gesture.active_points =
static_cast<std::size_t>(std::distance(active_fingers.begin(), end_iter));
for (size_t id = 0; id < gesture.active_points; ++id) {
- const auto& [active_x, active_y] = active_fingers[id].pos;
+ const auto& [active_x, active_y] = active_fingers[id].position;
gesture.points[id] = {
.x = static_cast<s32>(active_x * Layout::ScreenUndocked::Width),
.y = static_cast<s32>(active_y * Layout::ScreenUndocked::Height),
diff --git a/src/core/hle/service/hid/controllers/gesture.h b/src/core/hle/service/hid/controllers/gesture.h
index 7e7ae6625..0936a3fa3 100644
--- a/src/core/hle/service/hid/controllers/gesture.h
+++ b/src/core/hle/service/hid/controllers/gesture.h
@@ -8,13 +8,14 @@
#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/point.h"
-#include "core/frontend/input.h"
+#include "core/hid/emulated_console.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
namespace Service::HID {
class Controller_Gesture final : public ControllerBase {
public:
- explicit Controller_Gesture(Core::System& system_);
+ explicit Controller_Gesture(Core::HID::HIDCore& hid_core_);
~Controller_Gesture() override;
// Called when the controller is initialized
@@ -26,14 +27,12 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
static constexpr size_t MAX_FINGERS = 16;
static constexpr size_t MAX_POINTS = 4;
- enum class TouchType : u32 {
+ // This is nn::hid::GestureType
+ enum class GestureType : u32 {
Idle, // Nothing touching the screen
Complete, // Set at the end of a touch event
Cancel, // Set when the number of fingers change
@@ -46,7 +45,8 @@ private:
Rotate, // All points rotating from the midpoint
};
- enum class Direction : u32 {
+ // This is nn::hid::GestureDirection
+ enum class GestureDirection : u32 {
None,
Left,
Up,
@@ -54,51 +54,41 @@ private:
Down,
};
- struct Attribute {
+ // This is nn::hid::GestureAttribute
+ struct GestureAttribute {
union {
- u32_le raw{};
+ u32 raw{};
BitField<4, 1, u32> is_new_touch;
BitField<8, 1, u32> is_double_tap;
};
};
- static_assert(sizeof(Attribute) == 4, "Attribute is an invalid size");
+ static_assert(sizeof(GestureAttribute) == 4, "GestureAttribute is an invalid size");
+ // This is nn::hid::GestureState
struct GestureState {
- s64_le sampling_number;
- s64_le sampling_number2;
- s64_le detection_count;
- TouchType type;
- Direction direction;
- Common::Point<s32_le> pos;
- Common::Point<s32_le> delta;
+ s64 sampling_number;
+ s64 detection_count;
+ GestureType type;
+ GestureDirection direction;
+ Common::Point<s32> pos;
+ Common::Point<s32> delta;
f32 vel_x;
f32 vel_y;
- Attribute attributes;
+ GestureAttribute attributes;
f32 scale;
f32 rotation_angle;
- s32_le point_count;
- std::array<Common::Point<s32_le>, 4> points;
- };
- static_assert(sizeof(GestureState) == 0x68, "GestureState is an invalid size");
-
- struct SharedMemory {
- CommonHeader header;
- std::array<GestureState, 17> gesture_states;
- };
- static_assert(sizeof(SharedMemory) == 0x708, "SharedMemory is an invalid size");
-
- struct Finger {
- Common::Point<f32> pos{};
- bool pressed{};
+ s32 point_count;
+ std::array<Common::Point<s32>, 4> points;
};
+ static_assert(sizeof(GestureState) == 0x60, "GestureState is an invalid size");
struct GestureProperties {
- std::array<Common::Point<s32_le>, MAX_POINTS> points{};
+ std::array<Common::Point<s32>, MAX_POINTS> points{};
std::size_t active_points{};
- Common::Point<s32_le> mid_point{};
- s64_le detection_count{};
- u64_le delta_time{};
+ Common::Point<s32> mid_point{};
+ s64 detection_count{};
+ u64 delta_time{};
f32 average_distance{};
f32 angle{};
};
@@ -114,61 +104,48 @@ private:
f32 time_difference);
// Initializes new gesture
- void NewGesture(GestureProperties& gesture, TouchType& type, Attribute& attributes);
+ void NewGesture(GestureProperties& gesture, GestureType& type, GestureAttribute& attributes);
// Updates existing gesture state
- void UpdateExistingGesture(GestureProperties& gesture, TouchType& type, f32 time_difference);
+ void UpdateExistingGesture(GestureProperties& gesture, GestureType& type, f32 time_difference);
// Terminates exiting gesture
void EndGesture(GestureProperties& gesture, GestureProperties& last_gesture_props,
- TouchType& type, Attribute& attributes, f32 time_difference);
+ GestureType& type, GestureAttribute& attributes, f32 time_difference);
// Set current event to a tap event
void SetTapEvent(GestureProperties& gesture, GestureProperties& last_gesture_props,
- TouchType& type, Attribute& attributes);
+ GestureType& type, GestureAttribute& attributes);
// Calculates and set the extra parameters related to a pan event
void UpdatePanEvent(GestureProperties& gesture, GestureProperties& last_gesture_props,
- TouchType& type, f32 time_difference);
+ GestureType& type, f32 time_difference);
// Terminates the pan event
void EndPanEvent(GestureProperties& gesture, GestureProperties& last_gesture_props,
- TouchType& type, f32 time_difference);
+ GestureType& type, f32 time_difference);
// Set current event to a swipe event
void SetSwipeEvent(GestureProperties& gesture, GestureProperties& last_gesture_props,
- TouchType& type);
-
- // Returns an unused finger id, if there is no fingers available std::nullopt is returned.
- [[nodiscard]] std::optional<size_t> GetUnusedFingerID() const;
+ GestureType& type);
// Retrieves the last gesture entry, as indicated by shared memory indices.
- [[nodiscard]] GestureState& GetLastGestureEntry();
[[nodiscard]] const GestureState& GetLastGestureEntry() const;
- /**
- * If the touch is new it tries to assign a new finger id, if there is no fingers available no
- * changes will be made. Updates the coordinates if the finger id it's already set. If the touch
- * ends delays the output by one frame to set the end_touch flag before finally freeing the
- * finger id
- */
- size_t UpdateTouchInputEvent(const std::tuple<float, float, bool>& touch_input,
- size_t finger_id);
-
// Returns the average distance, angle and middle point of the active fingers
GestureProperties GetGestureProperties();
- SharedMemory shared_memory{};
- std::unique_ptr<Input::TouchDevice> touch_mouse_device;
- std::unique_ptr<Input::TouchDevice> touch_udp_device;
- std::unique_ptr<Input::TouchDevice> touch_btn_device;
- std::array<size_t, MAX_FINGERS> mouse_finger_id{};
- std::array<size_t, MAX_FINGERS> keyboard_finger_id{};
- std::array<size_t, MAX_FINGERS> udp_finger_id{};
- std::array<Finger, MAX_POINTS> fingers{};
+ // This is nn::hid::detail::GestureLifo
+ Lifo<GestureState, hid_entry_count> gesture_lifo{};
+ static_assert(sizeof(gesture_lifo) == 0x708, "gesture_lifo is an invalid size");
+ GestureState next_state{};
+
+ Core::HID::EmulatedConsole* console;
+
+ std::array<Core::HID::TouchFinger, MAX_POINTS> fingers{};
GestureProperties last_gesture{};
- s64_le last_update_timestamp{};
- s64_le last_tap_timestamp{};
+ s64 last_update_timestamp{};
+ s64 last_tap_timestamp{};
f32 last_pan_time_difference{};
bool force_update{false};
bool enable_press_and_tap{false};
diff --git a/src/core/hle/service/hid/controllers/keyboard.cpp b/src/core/hle/service/hid/controllers/keyboard.cpp
index c6c620008..9588a6910 100644
--- a/src/core/hle/service/hid/controllers/keyboard.cpp
+++ b/src/core/hle/service/hid/controllers/keyboard.cpp
@@ -6,13 +6,18 @@
#include "common/common_types.h"
#include "common/settings.h"
#include "core/core_timing.h"
+#include "core/hid/emulated_devices.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/keyboard.h"
namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800;
-constexpr u8 KEYS_PER_BYTE = 8;
-Controller_Keyboard::Controller_Keyboard(Core::System& system_) : ControllerBase{system_} {}
+Controller_Keyboard::Controller_Keyboard(Core::HID::HIDCore& hid_core_)
+ : ControllerBase{hid_core_} {
+ emulated_devices = hid_core.GetEmulatedDevices();
+}
+
Controller_Keyboard::~Controller_Keyboard() = default;
void Controller_Keyboard::OnInit() {}
@@ -21,51 +26,27 @@ void Controller_Keyboard::OnRelease() {}
void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- shared_memory.header.timestamp = core_timing.GetCPUTicks();
- shared_memory.header.total_entry_count = 17;
-
if (!IsControllerActivated()) {
- shared_memory.header.entry_count = 0;
- shared_memory.header.last_entry_index = 0;
+ keyboard_lifo.buffer_count = 0;
+ keyboard_lifo.buffer_tail = 0;
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &keyboard_lifo, sizeof(keyboard_lifo));
return;
}
- shared_memory.header.entry_count = 16;
-
- const auto& last_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
- shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
- auto& cur_entry = shared_memory.pad_states[shared_memory.header.last_entry_index];
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
+ const auto& last_entry = keyboard_lifo.ReadCurrentEntry().state;
+ next_state.sampling_number = last_entry.sampling_number + 1;
- cur_entry.key.fill(0);
if (Settings::values.keyboard_enabled) {
- for (std::size_t i = 0; i < keyboard_keys.size(); ++i) {
- auto& entry = cur_entry.key[i / KEYS_PER_BYTE];
- entry = static_cast<u8>(entry | (keyboard_keys[i]->GetStatus() << (i % KEYS_PER_BYTE)));
- }
+ const auto& keyboard_state = emulated_devices->GetKeyboard();
+ const auto& keyboard_modifier_state = emulated_devices->GetKeyboardModifier();
- using namespace Settings::NativeKeyboard;
-
- // TODO: Assign the correct key to all modifiers
- cur_entry.modifier.control.Assign(keyboard_mods[LeftControl]->GetStatus());
- cur_entry.modifier.shift.Assign(keyboard_mods[LeftShift]->GetStatus());
- cur_entry.modifier.left_alt.Assign(keyboard_mods[LeftAlt]->GetStatus());
- cur_entry.modifier.right_alt.Assign(keyboard_mods[RightAlt]->GetStatus());
- cur_entry.modifier.gui.Assign(0);
- cur_entry.modifier.caps_lock.Assign(keyboard_mods[CapsLock]->GetStatus());
- cur_entry.modifier.scroll_lock.Assign(keyboard_mods[ScrollLock]->GetStatus());
- cur_entry.modifier.num_lock.Assign(keyboard_mods[NumLock]->GetStatus());
- cur_entry.modifier.katakana.Assign(0);
- cur_entry.modifier.hiragana.Assign(0);
+ next_state.key = keyboard_state;
+ next_state.modifier = keyboard_modifier_state;
+ next_state.attribute.is_connected.Assign(1);
}
- std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(SharedMemory));
-}
-void Controller_Keyboard::OnLoadInputDevices() {
- std::transform(Settings::values.keyboard_keys.begin(), Settings::values.keyboard_keys.end(),
- keyboard_keys.begin(), Input::CreateDevice<Input::ButtonDevice>);
- std::transform(Settings::values.keyboard_mods.begin(), Settings::values.keyboard_mods.end(),
- keyboard_mods.begin(), Input::CreateDevice<Input::ButtonDevice>);
+ keyboard_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &keyboard_lifo, sizeof(keyboard_lifo));
}
+
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/keyboard.h b/src/core/hle/service/hid/controllers/keyboard.h
index 172a80e9c..cf62d3896 100644
--- a/src/core/hle/service/hid/controllers/keyboard.h
+++ b/src/core/hle/service/hid/controllers/keyboard.h
@@ -8,15 +8,20 @@
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
-#include "common/settings.h"
#include "common/swap.h"
-#include "core/frontend/input.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedDevices;
+struct KeyboardModifier;
+struct KeyboardKey;
+} // namespace Core::HID
namespace Service::HID {
class Controller_Keyboard final : public ControllerBase {
public:
- explicit Controller_Keyboard(Core::System& system_);
+ explicit Controller_Keyboard(Core::HID::HIDCore& hid_core_);
~Controller_Keyboard() override;
// Called when the controller is initialized
@@ -28,47 +33,21 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
- struct Modifiers {
- union {
- u32_le raw{};
- BitField<0, 1, u32> control;
- BitField<1, 1, u32> shift;
- BitField<2, 1, u32> left_alt;
- BitField<3, 1, u32> right_alt;
- BitField<4, 1, u32> gui;
- BitField<8, 1, u32> caps_lock;
- BitField<9, 1, u32> scroll_lock;
- BitField<10, 1, u32> num_lock;
- BitField<11, 1, u32> katakana;
- BitField<12, 1, u32> hiragana;
- };
- };
- static_assert(sizeof(Modifiers) == 0x4, "Modifiers is an invalid size");
-
+ // This is nn::hid::detail::KeyboardState
struct KeyboardState {
- s64_le sampling_number;
- s64_le sampling_number2;
-
- Modifiers modifier;
- std::array<u8, 32> key;
+ s64 sampling_number;
+ Core::HID::KeyboardModifier modifier;
+ Core::HID::KeyboardAttribute attribute;
+ Core::HID::KeyboardKey key;
};
- static_assert(sizeof(KeyboardState) == 0x38, "KeyboardState is an invalid size");
+ static_assert(sizeof(KeyboardState) == 0x30, "KeyboardState is an invalid size");
- struct SharedMemory {
- CommonHeader header;
- std::array<KeyboardState, 17> pad_states;
- INSERT_PADDING_BYTES(0x28);
- };
- static_assert(sizeof(SharedMemory) == 0x400, "SharedMemory is an invalid size");
- SharedMemory shared_memory{};
+ // This is nn::hid::detail::KeyboardLifo
+ Lifo<KeyboardState, hid_entry_count> keyboard_lifo{};
+ static_assert(sizeof(keyboard_lifo) == 0x3D8, "keyboard_lifo is an invalid size");
+ KeyboardState next_state{};
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardKeys>
- keyboard_keys;
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardMods>
- keyboard_mods;
+ Core::HID::EmulatedDevices* emulated_devices;
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/mouse.cpp b/src/core/hle/service/hid/controllers/mouse.cpp
index 544a71948..ba79888ae 100644
--- a/src/core/hle/service/hid/controllers/mouse.cpp
+++ b/src/core/hle/service/hid/controllers/mouse.cpp
@@ -6,12 +6,17 @@
#include "common/common_types.h"
#include "core/core_timing.h"
#include "core/frontend/emu_window.h"
+#include "core/hid/emulated_devices.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/mouse.h"
namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400;
-Controller_Mouse::Controller_Mouse(Core::System& system_) : ControllerBase{system_} {}
+Controller_Mouse::Controller_Mouse(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {
+ emulated_devices = hid_core.GetEmulatedDevices();
+}
+
Controller_Mouse::~Controller_Mouse() = default;
void Controller_Mouse::OnInit() {}
@@ -19,50 +24,35 @@ void Controller_Mouse::OnRelease() {}
void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- shared_memory.header.timestamp = core_timing.GetCPUTicks();
- shared_memory.header.total_entry_count = 17;
-
if (!IsControllerActivated()) {
- shared_memory.header.entry_count = 0;
- shared_memory.header.last_entry_index = 0;
+ mouse_lifo.buffer_count = 0;
+ mouse_lifo.buffer_tail = 0;
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &mouse_lifo, sizeof(mouse_lifo));
return;
}
- shared_memory.header.entry_count = 16;
- auto& last_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
- shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
- auto& cur_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
+ const auto& last_entry = mouse_lifo.ReadCurrentEntry().state;
+ next_state.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
-
- cur_entry.attribute.raw = 0;
+ next_state.attribute.raw = 0;
if (Settings::values.mouse_enabled) {
- const auto [px, py, sx, sy] = mouse_device->GetStatus();
- const auto x = static_cast<s32>(px * Layout::ScreenUndocked::Width);
- const auto y = static_cast<s32>(py * Layout::ScreenUndocked::Height);
- cur_entry.x = x;
- cur_entry.y = y;
- cur_entry.delta_x = x - last_entry.x;
- cur_entry.delta_y = y - last_entry.y;
- cur_entry.mouse_wheel_x = sx;
- cur_entry.mouse_wheel_y = sy;
- cur_entry.attribute.is_connected.Assign(1);
-
- using namespace Settings::NativeMouseButton;
- cur_entry.button.left.Assign(mouse_button_devices[Left]->GetStatus());
- cur_entry.button.right.Assign(mouse_button_devices[Right]->GetStatus());
- cur_entry.button.middle.Assign(mouse_button_devices[Middle]->GetStatus());
- cur_entry.button.forward.Assign(mouse_button_devices[Forward]->GetStatus());
- cur_entry.button.back.Assign(mouse_button_devices[Back]->GetStatus());
+ const auto& mouse_button_state = emulated_devices->GetMouseButtons();
+ const auto& mouse_position_state = emulated_devices->GetMousePosition();
+ const auto& mouse_wheel_state = emulated_devices->GetMouseWheel();
+ next_state.attribute.is_connected.Assign(1);
+ next_state.x = static_cast<s32>(mouse_position_state.x * Layout::ScreenUndocked::Width);
+ next_state.y = static_cast<s32>(mouse_position_state.y * Layout::ScreenUndocked::Height);
+ next_state.delta_x = next_state.x - last_entry.x;
+ next_state.delta_y = next_state.y - last_entry.y;
+ next_state.delta_wheel_x = mouse_wheel_state.x - last_mouse_wheel_state.x;
+ next_state.delta_wheel_y = mouse_wheel_state.y - last_mouse_wheel_state.y;
+
+ last_mouse_wheel_state = mouse_wheel_state;
+ next_state.button = mouse_button_state;
}
- std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(SharedMemory));
+ mouse_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &mouse_lifo, sizeof(mouse_lifo));
}
-void Controller_Mouse::OnLoadInputDevices() {
- mouse_device = Input::CreateDevice<Input::MouseDevice>(Settings::values.mouse_device);
- std::transform(Settings::values.mouse_buttons.begin(), Settings::values.mouse_buttons.end(),
- mouse_button_devices.begin(), Input::CreateDevice<Input::ButtonDevice>);
-}
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/mouse.h b/src/core/hle/service/hid/controllers/mouse.h
index 3d391a798..7559fc78d 100644
--- a/src/core/hle/service/hid/controllers/mouse.h
+++ b/src/core/hle/service/hid/controllers/mouse.h
@@ -7,15 +7,20 @@
#include <array>
#include "common/bit_field.h"
#include "common/common_types.h"
-#include "common/settings.h"
#include "common/swap.h"
-#include "core/frontend/input.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedDevices;
+struct MouseState;
+struct AnalogStickState;
+} // namespace Core::HID
namespace Service::HID {
class Controller_Mouse final : public ControllerBase {
public:
- explicit Controller_Mouse(Core::System& system_);
+ explicit Controller_Mouse(Core::HID::HIDCore& hid_core_);
~Controller_Mouse() override;
// Called when the controller is initialized
@@ -27,53 +32,13 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
- struct Buttons {
- union {
- u32_le raw{};
- BitField<0, 1, u32> left;
- BitField<1, 1, u32> right;
- BitField<2, 1, u32> middle;
- BitField<3, 1, u32> forward;
- BitField<4, 1, u32> back;
- };
- };
- static_assert(sizeof(Buttons) == 0x4, "Buttons is an invalid size");
-
- struct Attributes {
- union {
- u32_le raw{};
- BitField<0, 1, u32> transferable;
- BitField<1, 1, u32> is_connected;
- };
- };
- static_assert(sizeof(Attributes) == 0x4, "Attributes is an invalid size");
-
- struct MouseState {
- s64_le sampling_number;
- s64_le sampling_number2;
- s32_le x;
- s32_le y;
- s32_le delta_x;
- s32_le delta_y;
- s32_le mouse_wheel_x;
- s32_le mouse_wheel_y;
- Buttons button;
- Attributes attribute;
- };
- static_assert(sizeof(MouseState) == 0x30, "MouseState is an invalid size");
-
- struct SharedMemory {
- CommonHeader header;
- std::array<MouseState, 17> mouse_states;
- };
- SharedMemory shared_memory{};
+ // This is nn::hid::detail::MouseLifo
+ Lifo<Core::HID::MouseState, hid_entry_count> mouse_lifo{};
+ static_assert(sizeof(mouse_lifo) == 0x350, "mouse_lifo is an invalid size");
+ Core::HID::MouseState next_state{};
- std::unique_ptr<Input::MouseDevice> mouse_device;
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeMouseButton::NumMouseButtons>
- mouse_button_devices;
+ Core::HID::AnalogStickState last_mouse_wheel_state;
+ Core::HID::EmulatedDevices* emulated_devices;
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 196876810..2705e9dcb 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -10,9 +10,9 @@
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/settings.h"
-#include "core/core.h"
#include "core/core_timing.h"
-#include "core/frontend/input.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
#include "core/hle/kernel/k_event.h"
#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_writable_event.h"
@@ -20,120 +20,26 @@
#include "core/hle/service/kernel_helpers.h"
namespace Service::HID {
-constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
-constexpr s32 HID_TRIGGER_MAX = 0x7fff;
-[[maybe_unused]] constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
constexpr std::size_t NPAD_OFFSET = 0x9A00;
-constexpr u32 BATTERY_FULL = 2;
-constexpr u32 MAX_NPAD_ID = 7;
-constexpr std::size_t HANDHELD_INDEX = 8;
-constexpr std::array<u32, 10> npad_id_list{
- 0, 1, 2, 3, 4, 5, 6, 7, NPAD_HANDHELD, NPAD_UNKNOWN,
+constexpr std::array<Core::HID::NpadIdType, 10> npad_id_list{
+ Core::HID::NpadIdType::Player1, Core::HID::NpadIdType::Player2, Core::HID::NpadIdType::Player3,
+ Core::HID::NpadIdType::Player4, Core::HID::NpadIdType::Player5, Core::HID::NpadIdType::Player6,
+ Core::HID::NpadIdType::Player7, Core::HID::NpadIdType::Player8, Core::HID::NpadIdType::Other,
+ Core::HID::NpadIdType::Handheld,
};
-enum class JoystickId : std::size_t {
- Joystick_Left,
- Joystick_Right,
-};
-
-Controller_NPad::NPadControllerType Controller_NPad::MapSettingsTypeToNPad(
- Settings::ControllerType type) {
- switch (type) {
- case Settings::ControllerType::ProController:
- return NPadControllerType::ProController;
- case Settings::ControllerType::DualJoyconDetached:
- return NPadControllerType::JoyDual;
- case Settings::ControllerType::LeftJoycon:
- return NPadControllerType::JoyLeft;
- case Settings::ControllerType::RightJoycon:
- return NPadControllerType::JoyRight;
- case Settings::ControllerType::Handheld:
- return NPadControllerType::Handheld;
- case Settings::ControllerType::GameCube:
- return NPadControllerType::GameCube;
- default:
- UNREACHABLE();
- return NPadControllerType::ProController;
- }
-}
-
-Settings::ControllerType Controller_NPad::MapNPadToSettingsType(
- Controller_NPad::NPadControllerType type) {
- switch (type) {
- case NPadControllerType::ProController:
- return Settings::ControllerType::ProController;
- case NPadControllerType::JoyDual:
- return Settings::ControllerType::DualJoyconDetached;
- case NPadControllerType::JoyLeft:
- return Settings::ControllerType::LeftJoycon;
- case NPadControllerType::JoyRight:
- return Settings::ControllerType::RightJoycon;
- case NPadControllerType::Handheld:
- return Settings::ControllerType::Handheld;
- case NPadControllerType::GameCube:
- return Settings::ControllerType::GameCube;
- default:
- UNREACHABLE();
- return Settings::ControllerType::ProController;
- }
-}
-
-std::size_t Controller_NPad::NPadIdToIndex(u32 npad_id) {
+bool Controller_NPad::IsNpadIdValid(Core::HID::NpadIdType npad_id) {
switch (npad_id) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- return npad_id;
- case HANDHELD_INDEX:
- case NPAD_HANDHELD:
- return HANDHELD_INDEX;
- case 9:
- case NPAD_UNKNOWN:
- return 9;
- default:
- UNIMPLEMENTED_MSG("Unknown npad id {}", npad_id);
- return 0;
- }
-}
-
-u32 Controller_NPad::IndexToNPad(std::size_t index) {
- switch (index) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- return static_cast<u32>(index);
- case HANDHELD_INDEX:
- return NPAD_HANDHELD;
- case 9:
- return NPAD_UNKNOWN;
- default:
- UNIMPLEMENTED_MSG("Unknown npad index {}", index);
- return 0;
- }
-}
-
-bool Controller_NPad::IsNpadIdValid(u32 npad_id) {
- switch (npad_id) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case NPAD_UNKNOWN:
- case NPAD_HANDHELD:
+ case Core::HID::NpadIdType::Player1:
+ case Core::HID::NpadIdType::Player2:
+ case Core::HID::NpadIdType::Player3:
+ case Core::HID::NpadIdType::Player4:
+ case Core::HID::NpadIdType::Player5:
+ case Core::HID::NpadIdType::Player6:
+ case Core::HID::NpadIdType::Player7:
+ case Core::HID::NpadIdType::Player8:
+ case Core::HID::NpadIdType::Other:
+ case Core::HID::NpadIdType::Handheld:
return true;
default:
LOG_ERROR(Service_HID, "Invalid npad id {}", npad_id);
@@ -141,305 +47,337 @@ bool Controller_NPad::IsNpadIdValid(u32 npad_id) {
}
}
-bool Controller_NPad::IsDeviceHandleValid(const DeviceHandle& device_handle) {
- return IsNpadIdValid(device_handle.npad_id) &&
- device_handle.npad_type < NpadType::MaxNpadType &&
- device_handle.device_index < DeviceIndex::MaxDeviceIndex;
+bool Controller_NPad::IsDeviceHandleValid(const Core::HID::VibrationDeviceHandle& device_handle) {
+ return IsNpadIdValid(static_cast<Core::HID::NpadIdType>(device_handle.npad_id)) &&
+ device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType &&
+ device_handle.device_index < Core::HID::DeviceIndex::MaxDeviceIndex;
}
-Controller_NPad::Controller_NPad(Core::System& system_,
+bool Controller_NPad::IsDeviceHandleValid(const Core::HID::SixAxisSensorHandle& device_handle) {
+ return IsNpadIdValid(static_cast<Core::HID::NpadIdType>(device_handle.npad_id)) &&
+ device_handle.npad_type < Core::HID::NpadStyleIndex::MaxNpadType &&
+ device_handle.device_index < Core::HID::DeviceIndex::MaxDeviceIndex;
+}
+
+Controller_NPad::Controller_NPad(Core::HID::HIDCore& hid_core_,
KernelHelpers::ServiceContext& service_context_)
- : ControllerBase{system_}, service_context{service_context_} {
- latest_vibration_values.fill({DEFAULT_VIBRATION_VALUE, DEFAULT_VIBRATION_VALUE});
+ : ControllerBase{hid_core_}, service_context{service_context_} {
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
+ controller.device = hid_core.GetEmulatedControllerByIndex(i);
+ controller.vibration[Core::HID::EmulatedDeviceIndex::LeftIndex].latest_vibration_value =
+ DEFAULT_VIBRATION_VALUE;
+ controller.vibration[Core::HID::EmulatedDeviceIndex::RightIndex].latest_vibration_value =
+ DEFAULT_VIBRATION_VALUE;
+ Core::HID::ControllerUpdateCallback engine_callback{
+ .on_change = [this,
+ i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); },
+ .is_npad_service = true,
+ };
+ controller.callback_key = controller.device->SetCallback(engine_callback);
+ }
}
Controller_NPad::~Controller_NPad() {
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
+ controller.device->DeleteCallback(controller.callback_key);
+ }
OnRelease();
}
-void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) {
- const auto controller_type = connected_controllers[controller_idx].type;
- auto& controller = shared_memory_entries[controller_idx];
- if (controller_type == NPadControllerType::None) {
- styleset_changed_events[controller_idx]->GetWritableEvent().Signal();
+void Controller_NPad::ControllerUpdate(Core::HID::ControllerTriggerType type,
+ std::size_t controller_idx) {
+ if (type == Core::HID::ControllerTriggerType::All) {
+ ControllerUpdate(Core::HID::ControllerTriggerType::Connected, controller_idx);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Battery, controller_idx);
+ return;
+ }
+ if (controller_idx >= controller_data.size()) {
+ return;
+ }
+
+ auto& controller = controller_data[controller_idx];
+ const auto is_connected = controller.device->IsConnected();
+ const auto npad_type = controller.device->GetNpadStyleIndex();
+ const auto npad_id = controller.device->GetNpadIdType();
+ switch (type) {
+ case Core::HID::ControllerTriggerType::Connected:
+ case Core::HID::ControllerTriggerType::Disconnected:
+ if (is_connected == controller.is_connected) {
+ return;
+ }
+ UpdateControllerAt(npad_type, npad_id, is_connected);
+ break;
+ case Core::HID::ControllerTriggerType::Battery: {
+ if (!controller.device->IsConnected()) {
+ return;
+ }
+ auto& shared_memory = controller.shared_memory_entry;
+ const auto& battery_level = controller.device->GetBattery();
+ shared_memory.battery_level_dual = battery_level.dual.battery_level;
+ shared_memory.battery_level_left = battery_level.left.battery_level;
+ shared_memory.battery_level_right = battery_level.right.battery_level;
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+void Controller_NPad::InitNewlyAddedController(Core::HID::NpadIdType npad_id) {
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ if (!IsControllerSupported(controller.device->GetNpadStyleIndex())) {
return;
}
- controller.style_set.raw = 0; // Zero out
- controller.device_type.raw = 0;
- controller.system_properties.raw = 0;
+ LOG_DEBUG(Service_HID, "Npad connected {}", npad_id);
+ const auto controller_type = controller.device->GetNpadStyleIndex();
+ auto& shared_memory = controller.shared_memory_entry;
+ if (controller_type == Core::HID::NpadStyleIndex::None) {
+ controller.styleset_changed_event->GetWritableEvent().Signal();
+ return;
+ }
+ shared_memory.style_tag.raw = Core::HID::NpadStyleSet::None;
+ shared_memory.device_type.raw = 0;
+ shared_memory.system_properties.raw = 0;
switch (controller_type) {
- case NPadControllerType::None:
+ case Core::HID::NpadStyleIndex::None:
UNREACHABLE();
break;
- case NPadControllerType::ProController:
- controller.style_set.fullkey.Assign(1);
- controller.device_type.fullkey.Assign(1);
- controller.system_properties.is_vertical.Assign(1);
- controller.system_properties.use_plus.Assign(1);
- controller.system_properties.use_minus.Assign(1);
- controller.assignment_mode = NpadAssignments::Single;
- controller.footer_type = AppletFooterUiType::SwitchProController;
+ case Core::HID::NpadStyleIndex::ProController:
+ shared_memory.style_tag.fullkey.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ shared_memory.system_properties.is_vertical.Assign(1);
+ shared_memory.system_properties.use_plus.Assign(1);
+ shared_memory.system_properties.use_minus.Assign(1);
+ shared_memory.applet_footer.type = AppletFooterUiType::SwitchProController;
break;
- case NPadControllerType::Handheld:
- controller.style_set.handheld.Assign(1);
- controller.device_type.handheld_left.Assign(1);
- controller.device_type.handheld_right.Assign(1);
- controller.system_properties.is_vertical.Assign(1);
- controller.system_properties.use_plus.Assign(1);
- controller.system_properties.use_minus.Assign(1);
- controller.assignment_mode = NpadAssignments::Dual;
- controller.footer_type = AppletFooterUiType::HandheldJoyConLeftJoyConRight;
+ case Core::HID::NpadStyleIndex::Handheld:
+ shared_memory.style_tag.handheld.Assign(1);
+ shared_memory.device_type.handheld_left.Assign(1);
+ shared_memory.device_type.handheld_right.Assign(1);
+ shared_memory.system_properties.is_vertical.Assign(1);
+ shared_memory.system_properties.use_plus.Assign(1);
+ shared_memory.system_properties.use_minus.Assign(1);
+ shared_memory.system_properties.use_directional_buttons.Assign(1);
+ shared_memory.assignment_mode = NpadJoyAssignmentMode::Dual;
+ shared_memory.applet_footer.type = AppletFooterUiType::HandheldJoyConLeftJoyConRight;
+ break;
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ shared_memory.style_tag.joycon_dual.Assign(1);
+ if (controller.is_dual_left_connected) {
+ shared_memory.device_type.joycon_left.Assign(1);
+ shared_memory.system_properties.use_minus.Assign(1);
+ }
+ if (controller.is_dual_right_connected) {
+ shared_memory.device_type.joycon_right.Assign(1);
+ shared_memory.system_properties.use_plus.Assign(1);
+ }
+ shared_memory.system_properties.use_directional_buttons.Assign(1);
+ shared_memory.system_properties.is_vertical.Assign(1);
+ shared_memory.assignment_mode = NpadJoyAssignmentMode::Dual;
+ if (controller.is_dual_left_connected && controller.is_dual_right_connected) {
+ shared_memory.applet_footer.type = AppletFooterUiType::JoyDual;
+ } else if (controller.is_dual_left_connected) {
+ shared_memory.applet_footer.type = AppletFooterUiType::JoyDualLeftOnly;
+ } else {
+ shared_memory.applet_footer.type = AppletFooterUiType::JoyDualRightOnly;
+ }
break;
- case NPadControllerType::JoyDual:
- controller.style_set.joycon_dual.Assign(1);
- controller.device_type.joycon_left.Assign(1);
- controller.device_type.joycon_right.Assign(1);
- controller.system_properties.is_vertical.Assign(1);
- controller.system_properties.use_plus.Assign(1);
- controller.system_properties.use_minus.Assign(1);
- controller.assignment_mode = NpadAssignments::Dual;
- controller.footer_type = AppletFooterUiType::JoyDual;
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ shared_memory.style_tag.joycon_left.Assign(1);
+ shared_memory.device_type.joycon_left.Assign(1);
+ shared_memory.system_properties.is_horizontal.Assign(1);
+ shared_memory.system_properties.use_minus.Assign(1);
+ shared_memory.applet_footer.type = AppletFooterUiType::JoyLeftHorizontal;
break;
- case NPadControllerType::JoyLeft:
- controller.style_set.joycon_left.Assign(1);
- controller.device_type.joycon_left.Assign(1);
- controller.system_properties.is_horizontal.Assign(1);
- controller.system_properties.use_minus.Assign(1);
- controller.assignment_mode = NpadAssignments::Single;
- controller.footer_type = AppletFooterUiType::JoyLeftHorizontal;
+ case Core::HID::NpadStyleIndex::JoyconRight:
+ shared_memory.style_tag.joycon_right.Assign(1);
+ shared_memory.device_type.joycon_right.Assign(1);
+ shared_memory.system_properties.is_horizontal.Assign(1);
+ shared_memory.system_properties.use_plus.Assign(1);
+ shared_memory.applet_footer.type = AppletFooterUiType::JoyRightHorizontal;
break;
- case NPadControllerType::JoyRight:
- controller.style_set.joycon_right.Assign(1);
- controller.device_type.joycon_right.Assign(1);
- controller.system_properties.is_horizontal.Assign(1);
- controller.system_properties.use_plus.Assign(1);
- controller.assignment_mode = NpadAssignments::Single;
- controller.footer_type = AppletFooterUiType::JoyRightHorizontal;
+ case Core::HID::NpadStyleIndex::GameCube:
+ shared_memory.style_tag.gamecube.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ shared_memory.system_properties.is_vertical.Assign(1);
+ shared_memory.system_properties.use_plus.Assign(1);
break;
- case NPadControllerType::GameCube:
- controller.style_set.gamecube.Assign(1);
- // The GC Controller behaves like a wired Pro Controller
- controller.device_type.fullkey.Assign(1);
- controller.system_properties.is_vertical.Assign(1);
- controller.system_properties.use_plus.Assign(1);
+ case Core::HID::NpadStyleIndex::Pokeball:
+ shared_memory.style_tag.palma.Assign(1);
+ shared_memory.device_type.palma.Assign(1);
break;
- case NPadControllerType::Pokeball:
- controller.style_set.palma.Assign(1);
- controller.device_type.palma.Assign(1);
- controller.assignment_mode = NpadAssignments::Single;
+ case Core::HID::NpadStyleIndex::NES:
+ shared_memory.style_tag.lark.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ break;
+ case Core::HID::NpadStyleIndex::SNES:
+ shared_memory.style_tag.lucia.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ shared_memory.applet_footer.type = AppletFooterUiType::Lucia;
+ break;
+ case Core::HID::NpadStyleIndex::N64:
+ shared_memory.style_tag.lagoon.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ shared_memory.applet_footer.type = AppletFooterUiType::Lagon;
+ break;
+ case Core::HID::NpadStyleIndex::SegaGenesis:
+ shared_memory.style_tag.lager.Assign(1);
+ shared_memory.device_type.fullkey.Assign(1);
+ break;
+ default:
break;
}
- controller.fullkey_color.attribute = ColorAttributes::Ok;
- controller.fullkey_color.fullkey.body = 0;
- controller.fullkey_color.fullkey.button = 0;
+ const auto& body_colors = controller.device->GetColors();
- controller.joycon_color.attribute = ColorAttributes::Ok;
- controller.joycon_color.left.body =
- Settings::values.players.GetValue()[controller_idx].body_color_left;
- controller.joycon_color.left.button =
- Settings::values.players.GetValue()[controller_idx].button_color_left;
- controller.joycon_color.right.body =
- Settings::values.players.GetValue()[controller_idx].body_color_right;
- controller.joycon_color.right.button =
- Settings::values.players.GetValue()[controller_idx].button_color_right;
+ shared_memory.fullkey_color.attribute = ColorAttribute::Ok;
+ shared_memory.fullkey_color.fullkey = body_colors.fullkey;
- // TODO: Investigate when we should report all batery types
- controller.battery_level_dual = BATTERY_FULL;
- controller.battery_level_left = BATTERY_FULL;
- controller.battery_level_right = BATTERY_FULL;
+ shared_memory.joycon_color.attribute = ColorAttribute::Ok;
+ shared_memory.joycon_color.left = body_colors.left;
+ shared_memory.joycon_color.right = body_colors.right;
- SignalStyleSetChangedEvent(IndexToNPad(controller_idx));
+ // TODO: Investigate when we should report all batery types
+ const auto& battery_level = controller.device->GetBattery();
+ shared_memory.battery_level_dual = battery_level.dual.battery_level;
+ shared_memory.battery_level_left = battery_level.left.battery_level;
+ shared_memory.battery_level_right = battery_level.right.battery_level;
+
+ controller.is_connected = true;
+ controller.device->Connect();
+ SignalStyleSetChangedEvent(npad_id);
+ WriteEmptyEntry(controller.shared_memory_entry);
}
void Controller_NPad::OnInit() {
- for (std::size_t i = 0; i < styleset_changed_events.size(); ++i) {
- styleset_changed_events[i] =
- service_context.CreateEvent(fmt::format("npad:NpadStyleSetChanged_{}", i));
- }
-
if (!IsControllerActivated()) {
return;
}
- OnLoadInputDevices();
-
- if (style.raw == 0) {
- // We want to support all controllers
- style.handheld.Assign(1);
- style.joycon_left.Assign(1);
- style.joycon_right.Assign(1);
- style.joycon_dual.Assign(1);
- style.fullkey.Assign(1);
- style.gamecube.Assign(1);
- style.palma.Assign(1);
- }
-
- std::transform(Settings::values.players.GetValue().begin(),
- Settings::values.players.GetValue().end(), connected_controllers.begin(),
- [](const Settings::PlayerInput& player) {
- return ControllerHolder{MapSettingsTypeToNPad(player.controller_type),
- player.connected};
- });
-
- // Connect the Player 1 or Handheld controller if none are connected.
- if (std::none_of(connected_controllers.begin(), connected_controllers.end(),
- [](const ControllerHolder& controller) { return controller.is_connected; })) {
- const auto controller =
- MapSettingsTypeToNPad(Settings::values.players.GetValue()[0].controller_type);
- if (controller == NPadControllerType::Handheld) {
- Settings::values.players.GetValue()[HANDHELD_INDEX].connected = true;
- connected_controllers[HANDHELD_INDEX] = {controller, true};
- } else {
- Settings::values.players.GetValue()[0].connected = true;
- connected_controllers[0] = {controller, true};
- }
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
+ controller.styleset_changed_event =
+ service_context.CreateEvent(fmt::format("npad:NpadStyleSetChanged_{}", i));
}
- // Account for handheld
- if (connected_controllers[HANDHELD_INDEX].is_connected) {
- connected_controllers[HANDHELD_INDEX].type = NPadControllerType::Handheld;
+ if (hid_core.GetSupportedStyleTag().raw == Core::HID::NpadStyleSet::None) {
+ // We want to support all controllers
+ hid_core.SetSupportedStyleTag({Core::HID::NpadStyleSet::All});
}
supported_npad_id_types.resize(npad_id_list.size());
std::memcpy(supported_npad_id_types.data(), npad_id_list.data(),
- npad_id_list.size() * sizeof(u32));
+ npad_id_list.size() * sizeof(Core::HID::NpadIdType));
+
+ // Prefill controller buffers
+ for (auto& controller : controller_data) {
+ auto& npad = controller.shared_memory_entry;
+ npad.fullkey_color = {
+ .attribute = ColorAttribute::NoController,
+ .fullkey = {},
+ };
+ npad.joycon_color = {
+ .attribute = ColorAttribute::NoController,
+ .left = {},
+ .right = {},
+ };
+ // HW seems to initialize the first 19 entries
+ for (std::size_t i = 0; i < 19; ++i) {
+ WriteEmptyEntry(npad);
+ }
+ }
- for (std::size_t i = 0; i < connected_controllers.size(); ++i) {
- const auto& controller = connected_controllers[i];
- if (controller.is_connected) {
- AddNewControllerAt(controller.type, i);
+ // Connect controllers
+ for (auto& controller : controller_data) {
+ const auto& device = controller.device;
+ if (device->IsConnected()) {
+ AddNewControllerAt(device->GetNpadStyleIndex(), device->GetNpadIdType());
}
}
}
-void Controller_NPad::OnLoadInputDevices() {
- const auto& players = Settings::values.players.GetValue();
+void Controller_NPad::WriteEmptyEntry(NpadInternalState& npad) {
+ NPadGenericState dummy_pad_state{};
+ NpadGcTriggerState dummy_gc_state{};
+ dummy_pad_state.sampling_number = npad.fullkey_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.fullkey_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.handheld_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.handheld_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.joy_dual_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.joy_dual_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.joy_left_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.joy_left_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.joy_right_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.joy_right_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.palma_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.palma_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_pad_state.sampling_number = npad.system_ext_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.system_ext_lifo.WriteNextEntry(dummy_pad_state);
+ dummy_gc_state.sampling_number = npad.gc_trigger_lifo.ReadCurrentEntry().sampling_number + 1;
+ npad.gc_trigger_lifo.WriteNextEntry(dummy_gc_state);
+}
- std::lock_guard lock{mutex};
- for (std::size_t i = 0; i < players.size(); ++i) {
- std::transform(players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
- players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_END,
- buttons[i].begin(), Input::CreateDevice<Input::ButtonDevice>);
- std::transform(players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN,
- players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_END,
- sticks[i].begin(), Input::CreateDevice<Input::AnalogDevice>);
- std::transform(players[i].vibrations.begin() +
- Settings::NativeVibration::VIBRATION_HID_BEGIN,
- players[i].vibrations.begin() + Settings::NativeVibration::VIBRATION_HID_END,
- vibrations[i].begin(), Input::CreateDevice<Input::VibrationDevice>);
- std::transform(players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN,
- players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_END,
- motions[i].begin(), Input::CreateDevice<Input::MotionDevice>);
- for (std::size_t device_idx = 0; device_idx < vibrations[i].size(); ++device_idx) {
- InitializeVibrationDeviceAtIndex(i, device_idx);
+void Controller_NPad::OnRelease() {
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
+ service_context.CloseEvent(controller.styleset_changed_event);
+ for (std::size_t device_idx = 0; device_idx < controller.vibration.size(); ++device_idx) {
+ VibrateControllerAtIndex(controller.device->GetNpadIdType(), device_idx, {});
}
}
}
-void Controller_NPad::OnRelease() {
- for (std::size_t npad_idx = 0; npad_idx < vibrations.size(); ++npad_idx) {
- for (std::size_t device_idx = 0; device_idx < vibrations[npad_idx].size(); ++device_idx) {
- VibrateControllerAtIndex(npad_idx, device_idx, {});
- }
+void Controller_NPad::RequestPadStateUpdate(Core::HID::NpadIdType npad_id) {
+ std::lock_guard lock{mutex};
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ const auto controller_type = controller.device->GetNpadStyleIndex();
+ if (!controller.device->IsConnected()) {
+ return;
}
- for (std::size_t i = 0; i < styleset_changed_events.size(); ++i) {
- service_context.CloseEvent(styleset_changed_events[i]);
+ auto& pad_entry = controller.npad_pad_state;
+ auto& trigger_entry = controller.npad_trigger_state;
+ const auto button_state = controller.device->GetNpadButtons();
+ const auto stick_state = controller.device->GetSticks();
+
+ using btn = Core::HID::NpadButton;
+ pad_entry.npad_buttons.raw = btn::None;
+ if (controller_type != Core::HID::NpadStyleIndex::JoyconLeft) {
+ constexpr btn right_button_mask = btn::A | btn::B | btn::X | btn::Y | btn::StickR | btn::R |
+ btn::ZR | btn::Plus | btn::StickRLeft | btn::StickRUp |
+ btn::StickRRight | btn::StickRDown;
+ pad_entry.npad_buttons.raw = button_state.raw & right_button_mask;
+ pad_entry.r_stick = stick_state.right;
}
-}
-void Controller_NPad::RequestPadStateUpdate(u32 npad_id) {
- std::lock_guard lock{mutex};
+ if (controller_type != Core::HID::NpadStyleIndex::JoyconRight) {
+ constexpr btn left_button_mask =
+ btn::Left | btn::Up | btn::Right | btn::Down | btn::StickL | btn::L | btn::ZL |
+ btn::Minus | btn::StickLLeft | btn::StickLUp | btn::StickLRight | btn::StickLDown;
+ pad_entry.npad_buttons.raw |= button_state.raw & left_button_mask;
+ pad_entry.l_stick = stick_state.left;
+ }
- const auto controller_idx = NPadIdToIndex(npad_id);
- const auto controller_type = connected_controllers[controller_idx].type;
- if (!connected_controllers[controller_idx].is_connected) {
- return;
+ if (controller_type == Core::HID::NpadStyleIndex::JoyconLeft) {
+ pad_entry.npad_buttons.left_sl.Assign(button_state.left_sl);
+ pad_entry.npad_buttons.left_sr.Assign(button_state.left_sr);
}
- auto& pad_state = npad_pad_states[controller_idx].pad_states;
- auto& lstick_entry = npad_pad_states[controller_idx].l_stick;
- auto& rstick_entry = npad_pad_states[controller_idx].r_stick;
- auto& trigger_entry = npad_trigger_states[controller_idx];
- const auto& button_state = buttons[controller_idx];
- const auto& analog_state = sticks[controller_idx];
- const auto [stick_l_x_f, stick_l_y_f] =
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus();
- const auto [stick_r_x_f, stick_r_y_f] =
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus();
-
- using namespace Settings::NativeButton;
- if (controller_type != NPadControllerType::JoyLeft) {
- pad_state.a.Assign(button_state[A - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.b.Assign(button_state[B - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.x.Assign(button_state[X - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.y.Assign(button_state[Y - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.r_stick.Assign(button_state[RStick - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.r.Assign(button_state[R - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.zr.Assign(button_state[ZR - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.plus.Assign(button_state[Plus - BUTTON_HID_BEGIN]->GetStatus());
-
- pad_state.r_stick_right.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::RIGHT));
- pad_state.r_stick_left.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::LEFT));
- pad_state.r_stick_up.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::UP));
- pad_state.r_stick_down.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::DOWN));
- rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX);
- rstick_entry.y = static_cast<s32>(stick_r_y_f * HID_JOYSTICK_MAX);
- }
-
- if (controller_type != NPadControllerType::JoyRight) {
- pad_state.d_left.Assign(button_state[DLeft - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.d_up.Assign(button_state[DUp - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.d_right.Assign(button_state[DRight - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.d_down.Assign(button_state[DDown - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.l_stick.Assign(button_state[LStick - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.l.Assign(button_state[L - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.zl.Assign(button_state[ZL - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.minus.Assign(button_state[Minus - BUTTON_HID_BEGIN]->GetStatus());
-
- pad_state.l_stick_right.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::RIGHT));
- pad_state.l_stick_left.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::LEFT));
- pad_state.l_stick_up.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::UP));
- pad_state.l_stick_down.Assign(
- analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]
- ->GetAnalogDirectionStatus(Input::AnalogDirection::DOWN));
- lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX);
- lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX);
- }
-
- if (controller_type == NPadControllerType::JoyLeft) {
- pad_state.left_sl.Assign(button_state[SL - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.left_sr.Assign(button_state[SR - BUTTON_HID_BEGIN]->GetStatus());
- }
-
- if (controller_type == NPadControllerType::JoyRight) {
- pad_state.right_sl.Assign(button_state[SL - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.right_sr.Assign(button_state[SR - BUTTON_HID_BEGIN]->GetStatus());
- }
-
- if (controller_type == NPadControllerType::GameCube) {
- trigger_entry.l_analog = static_cast<s32>(
- button_state[ZL - BUTTON_HID_BEGIN]->GetStatus() ? HID_TRIGGER_MAX : 0);
- trigger_entry.r_analog = static_cast<s32>(
- button_state[ZR - BUTTON_HID_BEGIN]->GetStatus() ? HID_TRIGGER_MAX : 0);
- pad_state.zl.Assign(false);
- pad_state.zr.Assign(button_state[R - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.l.Assign(button_state[ZL - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.r.Assign(button_state[ZR - BUTTON_HID_BEGIN]->GetStatus());
+
+ if (controller_type == Core::HID::NpadStyleIndex::JoyconRight) {
+ pad_entry.npad_buttons.right_sl.Assign(button_state.right_sl);
+ pad_entry.npad_buttons.right_sr.Assign(button_state.right_sr);
+ }
+
+ if (controller_type == Core::HID::NpadStyleIndex::GameCube) {
+ const auto& trigger_state = controller.device->GetTriggers();
+ trigger_entry.l_analog = trigger_state.left;
+ trigger_entry.r_analog = trigger_state.right;
+ pad_entry.npad_buttons.zl.Assign(false);
+ pad_entry.npad_buttons.zr.Assign(button_state.r);
+ pad_entry.npad_buttons.l.Assign(button_state.zl);
+ pad_entry.npad_buttons.r.Assign(button_state.zr);
}
}
@@ -448,173 +386,136 @@ void Controller_NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
if (!IsControllerActivated()) {
return;
}
- for (std::size_t i = 0; i < shared_memory_entries.size(); ++i) {
- auto& npad = shared_memory_entries[i];
- const std::array<NPadGeneric*, 7> controller_npads{
- &npad.fullkey_states, &npad.handheld_states, &npad.joy_dual_states,
- &npad.joy_left_states, &npad.joy_right_states, &npad.palma_states,
- &npad.system_ext_states};
-
- // There is the posibility to have more controllers with analog triggers
- const std::array<TriggerGeneric*, 1> controller_triggers{
- &npad.gc_trigger_states,
- };
-
- for (auto* main_controller : controller_npads) {
- main_controller->common.entry_count = 16;
- main_controller->common.total_entry_count = 17;
-
- const auto& last_entry =
- main_controller->npad[main_controller->common.last_entry_index];
-
- main_controller->common.timestamp = core_timing.GetCPUTicks();
- main_controller->common.last_entry_index =
- (main_controller->common.last_entry_index + 1) % 17;
-
- auto& cur_entry = main_controller->npad[main_controller->common.last_entry_index];
-
- cur_entry.timestamp = last_entry.timestamp + 1;
- cur_entry.timestamp2 = cur_entry.timestamp;
- }
-
- for (auto* analog_trigger : controller_triggers) {
- analog_trigger->entry_count = 16;
- analog_trigger->total_entry_count = 17;
-
- const auto& last_entry = analog_trigger->trigger[analog_trigger->last_entry_index];
-
- analog_trigger->timestamp = core_timing.GetCPUTicks();
- analog_trigger->last_entry_index = (analog_trigger->last_entry_index + 1) % 17;
-
- auto& cur_entry = analog_trigger->trigger[analog_trigger->last_entry_index];
- cur_entry.timestamp = last_entry.timestamp + 1;
- cur_entry.timestamp2 = cur_entry.timestamp;
- }
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
+ auto& npad = controller.shared_memory_entry;
- const auto& controller_type = connected_controllers[i].type;
+ const auto& controller_type = controller.device->GetNpadStyleIndex();
- if (controller_type == NPadControllerType::None || !connected_controllers[i].is_connected) {
+ if (controller_type == Core::HID::NpadStyleIndex::None ||
+ !controller.device->IsConnected()) {
+ // Refresh shared memory
+ std::memcpy(data + NPAD_OFFSET + (i * sizeof(NpadInternalState)),
+ &controller.shared_memory_entry, sizeof(NpadInternalState));
continue;
}
- const u32 npad_index = static_cast<u32>(i);
-
- RequestPadStateUpdate(npad_index);
- auto& pad_state = npad_pad_states[npad_index];
- auto& trigger_state = npad_trigger_states[npad_index];
-
- auto& main_controller =
- npad.fullkey_states.npad[npad.fullkey_states.common.last_entry_index];
- auto& handheld_entry =
- npad.handheld_states.npad[npad.handheld_states.common.last_entry_index];
- auto& dual_entry = npad.joy_dual_states.npad[npad.joy_dual_states.common.last_entry_index];
- auto& left_entry = npad.joy_left_states.npad[npad.joy_left_states.common.last_entry_index];
- auto& right_entry =
- npad.joy_right_states.npad[npad.joy_right_states.common.last_entry_index];
- auto& pokeball_entry = npad.palma_states.npad[npad.palma_states.common.last_entry_index];
- auto& libnx_entry =
- npad.system_ext_states.npad[npad.system_ext_states.common.last_entry_index];
- auto& trigger_entry =
- npad.gc_trigger_states.trigger[npad.gc_trigger_states.last_entry_index];
-
- libnx_entry.connection_status.raw = 0;
- libnx_entry.connection_status.is_connected.Assign(1);
+ RequestPadStateUpdate(controller.device->GetNpadIdType());
+ auto& pad_state = controller.npad_pad_state;
+ auto& libnx_state = controller.npad_libnx_state;
+ auto& trigger_state = controller.npad_trigger_state;
+
+ // LibNX exclusively uses this section, so we always update it since LibNX doesn't activate
+ // any controllers.
+ libnx_state.connection_status.raw = 0;
+ libnx_state.connection_status.is_connected.Assign(1);
switch (controller_type) {
- case NPadControllerType::None:
+ case Core::HID::NpadStyleIndex::None:
UNREACHABLE();
break;
- case NPadControllerType::ProController:
- main_controller.connection_status.raw = 0;
- main_controller.connection_status.is_connected.Assign(1);
- main_controller.connection_status.is_wired.Assign(1);
- main_controller.pad.pad_states.raw = pad_state.pad_states.raw;
- main_controller.pad.l_stick = pad_state.l_stick;
- main_controller.pad.r_stick = pad_state.r_stick;
-
- libnx_entry.connection_status.is_wired.Assign(1);
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::NES:
+ case Core::HID::NpadStyleIndex::SNES:
+ case Core::HID::NpadStyleIndex::N64:
+ case Core::HID::NpadStyleIndex::SegaGenesis:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.connection_status.is_wired.Assign(1);
+
+ libnx_state.connection_status.is_wired.Assign(1);
+ pad_state.sampling_number =
+ npad.fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.fullkey_lifo.WriteNextEntry(pad_state);
break;
- case NPadControllerType::Handheld:
- handheld_entry.connection_status.raw = 0;
- handheld_entry.connection_status.is_connected.Assign(1);
- handheld_entry.connection_status.is_wired.Assign(1);
- handheld_entry.connection_status.is_left_connected.Assign(1);
- handheld_entry.connection_status.is_right_connected.Assign(1);
- handheld_entry.connection_status.is_left_wired.Assign(1);
- handheld_entry.connection_status.is_right_wired.Assign(1);
- handheld_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- handheld_entry.pad.l_stick = pad_state.l_stick;
- handheld_entry.pad.r_stick = pad_state.r_stick;
-
- libnx_entry.connection_status.is_wired.Assign(1);
- libnx_entry.connection_status.is_left_connected.Assign(1);
- libnx_entry.connection_status.is_right_connected.Assign(1);
- libnx_entry.connection_status.is_left_wired.Assign(1);
- libnx_entry.connection_status.is_right_wired.Assign(1);
+ case Core::HID::NpadStyleIndex::Handheld:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.connection_status.is_wired.Assign(1);
+ pad_state.connection_status.is_left_connected.Assign(1);
+ pad_state.connection_status.is_right_connected.Assign(1);
+ pad_state.connection_status.is_left_wired.Assign(1);
+ pad_state.connection_status.is_right_wired.Assign(1);
+
+ libnx_state.connection_status.is_wired.Assign(1);
+ libnx_state.connection_status.is_left_connected.Assign(1);
+ libnx_state.connection_status.is_right_connected.Assign(1);
+ libnx_state.connection_status.is_left_wired.Assign(1);
+ libnx_state.connection_status.is_right_wired.Assign(1);
+ pad_state.sampling_number =
+ npad.handheld_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.handheld_lifo.WriteNextEntry(pad_state);
break;
- case NPadControllerType::JoyDual:
- dual_entry.connection_status.raw = 0;
- dual_entry.connection_status.is_connected.Assign(1);
- dual_entry.connection_status.is_left_connected.Assign(1);
- dual_entry.connection_status.is_right_connected.Assign(1);
- dual_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- dual_entry.pad.l_stick = pad_state.l_stick;
- dual_entry.pad.r_stick = pad_state.r_stick;
-
- libnx_entry.connection_status.is_left_connected.Assign(1);
- libnx_entry.connection_status.is_right_connected.Assign(1);
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ if (controller.is_dual_left_connected) {
+ pad_state.connection_status.is_left_connected.Assign(1);
+ libnx_state.connection_status.is_left_connected.Assign(1);
+ }
+ if (controller.is_dual_right_connected) {
+ pad_state.connection_status.is_right_connected.Assign(1);
+ libnx_state.connection_status.is_right_connected.Assign(1);
+ }
+
+ pad_state.sampling_number =
+ npad.joy_dual_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.joy_dual_lifo.WriteNextEntry(pad_state);
break;
- case NPadControllerType::JoyLeft:
- left_entry.connection_status.raw = 0;
- left_entry.connection_status.is_connected.Assign(1);
- left_entry.connection_status.is_left_connected.Assign(1);
- left_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- left_entry.pad.l_stick = pad_state.l_stick;
- left_entry.pad.r_stick = pad_state.r_stick;
-
- libnx_entry.connection_status.is_left_connected.Assign(1);
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.connection_status.is_left_connected.Assign(1);
+
+ libnx_state.connection_status.is_left_connected.Assign(1);
+ pad_state.sampling_number =
+ npad.joy_left_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.joy_left_lifo.WriteNextEntry(pad_state);
break;
- case NPadControllerType::JoyRight:
- right_entry.connection_status.raw = 0;
- right_entry.connection_status.is_connected.Assign(1);
- right_entry.connection_status.is_right_connected.Assign(1);
- right_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- right_entry.pad.l_stick = pad_state.l_stick;
- right_entry.pad.r_stick = pad_state.r_stick;
-
- libnx_entry.connection_status.is_right_connected.Assign(1);
+ case Core::HID::NpadStyleIndex::JoyconRight:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.connection_status.is_right_connected.Assign(1);
+
+ libnx_state.connection_status.is_right_connected.Assign(1);
+ pad_state.sampling_number =
+ npad.joy_right_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.joy_right_lifo.WriteNextEntry(pad_state);
break;
- case NPadControllerType::GameCube:
- main_controller.connection_status.raw = 0;
- main_controller.connection_status.is_connected.Assign(1);
- main_controller.connection_status.is_wired.Assign(1);
- main_controller.pad.pad_states.raw = pad_state.pad_states.raw;
- main_controller.pad.l_stick = pad_state.l_stick;
- main_controller.pad.r_stick = pad_state.r_stick;
- trigger_entry.l_analog = trigger_state.l_analog;
- trigger_entry.r_analog = trigger_state.r_analog;
-
- libnx_entry.connection_status.is_wired.Assign(1);
+ case Core::HID::NpadStyleIndex::GameCube:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.connection_status.is_wired.Assign(1);
+
+ libnx_state.connection_status.is_wired.Assign(1);
+ pad_state.sampling_number =
+ npad.fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ trigger_state.sampling_number =
+ npad.gc_trigger_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.fullkey_lifo.WriteNextEntry(pad_state);
+ npad.gc_trigger_lifo.WriteNextEntry(trigger_state);
break;
- case NPadControllerType::Pokeball:
- pokeball_entry.connection_status.raw = 0;
- pokeball_entry.connection_status.is_connected.Assign(1);
- pokeball_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- pokeball_entry.pad.l_stick = pad_state.l_stick;
- pokeball_entry.pad.r_stick = pad_state.r_stick;
+ case Core::HID::NpadStyleIndex::Pokeball:
+ pad_state.connection_status.raw = 0;
+ pad_state.connection_status.is_connected.Assign(1);
+ pad_state.sampling_number =
+ npad.palma_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ npad.palma_lifo.WriteNextEntry(pad_state);
+ break;
+ default:
break;
}
- // LibNX exclusively uses this section, so we always update it since LibNX doesn't activate
- // any controllers.
- libnx_entry.pad.pad_states.raw = pad_state.pad_states.raw;
- libnx_entry.pad.l_stick = pad_state.l_stick;
- libnx_entry.pad.r_stick = pad_state.r_stick;
+ libnx_state.npad_buttons.raw = pad_state.npad_buttons.raw;
+ libnx_state.l_stick = pad_state.l_stick;
+ libnx_state.r_stick = pad_state.r_stick;
+ npad.system_ext_lifo.WriteNextEntry(pad_state);
+
+ press_state |= static_cast<u64>(pad_state.npad_buttons.raw);
- press_state |= static_cast<u32>(pad_state.pad_states.raw);
+ std::memcpy(data + NPAD_OFFSET + (i * sizeof(NpadInternalState)),
+ &controller.shared_memory_entry, sizeof(NpadInternalState));
}
- std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(),
- shared_memory_entries.size() * sizeof(NPadEntry));
}
void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
@@ -622,145 +523,138 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing
if (!IsControllerActivated()) {
return;
}
- for (std::size_t i = 0; i < shared_memory_entries.size(); ++i) {
- auto& npad = shared_memory_entries[i];
-
- const auto& controller_type = connected_controllers[i].type;
- if (controller_type == NPadControllerType::None || !connected_controllers[i].is_connected) {
- continue;
- }
-
- const std::array<SixAxisGeneric*, 6> controller_sixaxes{
- &npad.sixaxis_fullkey, &npad.sixaxis_handheld, &npad.sixaxis_dual_left,
- &npad.sixaxis_dual_right, &npad.sixaxis_left, &npad.sixaxis_right,
- };
-
- for (auto* sixaxis_sensor : controller_sixaxes) {
- sixaxis_sensor->common.entry_count = 16;
- sixaxis_sensor->common.total_entry_count = 17;
-
- const auto& last_entry =
- sixaxis_sensor->sixaxis[sixaxis_sensor->common.last_entry_index];
-
- sixaxis_sensor->common.timestamp = core_timing.GetCPUTicks();
- sixaxis_sensor->common.last_entry_index =
- (sixaxis_sensor->common.last_entry_index + 1) % 17;
+ for (std::size_t i = 0; i < controller_data.size(); ++i) {
+ auto& controller = controller_data[i];
- auto& cur_entry = sixaxis_sensor->sixaxis[sixaxis_sensor->common.last_entry_index];
+ const auto& controller_type = controller.device->GetNpadStyleIndex();
- cur_entry.timestamp = last_entry.timestamp + 1;
- cur_entry.timestamp2 = cur_entry.timestamp;
+ if (controller_type == Core::HID::NpadStyleIndex::None ||
+ !controller.device->IsConnected()) {
+ continue;
}
- // Try to read sixaxis sensor states
- std::array<MotionDevice, 2> motion_devices;
-
- if (sixaxis_sensors_enabled && Settings::values.motion_enabled.GetValue()) {
- sixaxis_at_rest = true;
- for (std::size_t e = 0; e < motion_devices.size(); ++e) {
- const auto& device = motions[i][e];
- if (device) {
- std::tie(motion_devices[e].accel, motion_devices[e].gyro,
- motion_devices[e].rotation, motion_devices[e].orientation,
- motion_devices[e].quaternion) = device->GetStatus();
- sixaxis_at_rest = sixaxis_at_rest && motion_devices[e].gyro.Length2() < 0.0001f;
- }
+ auto& npad = controller.shared_memory_entry;
+ const auto& motion_state = controller.device->GetMotions();
+ auto& sixaxis_fullkey_state = controller.sixaxis_fullkey_state;
+ auto& sixaxis_handheld_state = controller.sixaxis_handheld_state;
+ auto& sixaxis_dual_left_state = controller.sixaxis_dual_left_state;
+ auto& sixaxis_dual_right_state = controller.sixaxis_dual_right_state;
+ auto& sixaxis_left_lifo_state = controller.sixaxis_left_lifo_state;
+ auto& sixaxis_right_lifo_state = controller.sixaxis_right_lifo_state;
+
+ if (controller.sixaxis_sensor_enabled && Settings::values.motion_enabled.GetValue()) {
+ controller.sixaxis_at_rest = true;
+ for (std::size_t e = 0; e < motion_state.size(); ++e) {
+ controller.sixaxis_at_rest =
+ controller.sixaxis_at_rest && motion_state[e].is_at_rest;
}
}
- auto& full_sixaxis_entry =
- npad.sixaxis_fullkey.sixaxis[npad.sixaxis_fullkey.common.last_entry_index];
- auto& handheld_sixaxis_entry =
- npad.sixaxis_handheld.sixaxis[npad.sixaxis_handheld.common.last_entry_index];
- auto& dual_left_sixaxis_entry =
- npad.sixaxis_dual_left.sixaxis[npad.sixaxis_dual_left.common.last_entry_index];
- auto& dual_right_sixaxis_entry =
- npad.sixaxis_dual_right.sixaxis[npad.sixaxis_dual_right.common.last_entry_index];
- auto& left_sixaxis_entry =
- npad.sixaxis_left.sixaxis[npad.sixaxis_left.common.last_entry_index];
- auto& right_sixaxis_entry =
- npad.sixaxis_right.sixaxis[npad.sixaxis_right.common.last_entry_index];
-
switch (controller_type) {
- case NPadControllerType::None:
+ case Core::HID::NpadStyleIndex::None:
UNREACHABLE();
break;
- case NPadControllerType::ProController:
- full_sixaxis_entry.attribute.raw = 0;
- if (sixaxis_sensors_enabled && motions[i][0]) {
- full_sixaxis_entry.attribute.is_connected.Assign(1);
- full_sixaxis_entry.accel = motion_devices[0].accel;
- full_sixaxis_entry.gyro = motion_devices[0].gyro;
- full_sixaxis_entry.rotation = motion_devices[0].rotation;
- full_sixaxis_entry.orientation = motion_devices[0].orientation;
+ case Core::HID::NpadStyleIndex::ProController:
+ sixaxis_fullkey_state.attribute.raw = 0;
+ if (controller.sixaxis_sensor_enabled) {
+ sixaxis_fullkey_state.attribute.is_connected.Assign(1);
+ sixaxis_fullkey_state.accel = motion_state[0].accel;
+ sixaxis_fullkey_state.gyro = motion_state[0].gyro;
+ sixaxis_fullkey_state.rotation = motion_state[0].rotation;
+ sixaxis_fullkey_state.orientation = motion_state[0].orientation;
}
break;
- case NPadControllerType::Handheld:
- handheld_sixaxis_entry.attribute.raw = 0;
- if (sixaxis_sensors_enabled && motions[i][0]) {
- handheld_sixaxis_entry.attribute.is_connected.Assign(1);
- handheld_sixaxis_entry.accel = motion_devices[0].accel;
- handheld_sixaxis_entry.gyro = motion_devices[0].gyro;
- handheld_sixaxis_entry.rotation = motion_devices[0].rotation;
- handheld_sixaxis_entry.orientation = motion_devices[0].orientation;
+ case Core::HID::NpadStyleIndex::Handheld:
+ sixaxis_handheld_state.attribute.raw = 0;
+ if (controller.sixaxis_sensor_enabled) {
+ sixaxis_handheld_state.attribute.is_connected.Assign(1);
+ sixaxis_handheld_state.accel = motion_state[0].accel;
+ sixaxis_handheld_state.gyro = motion_state[0].gyro;
+ sixaxis_handheld_state.rotation = motion_state[0].rotation;
+ sixaxis_handheld_state.orientation = motion_state[0].orientation;
}
break;
- case NPadControllerType::JoyDual:
- dual_left_sixaxis_entry.attribute.raw = 0;
- dual_right_sixaxis_entry.attribute.raw = 0;
- if (sixaxis_sensors_enabled && motions[i][0]) {
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ sixaxis_dual_left_state.attribute.raw = 0;
+ sixaxis_dual_right_state.attribute.raw = 0;
+ if (controller.sixaxis_sensor_enabled) {
// Set motion for the left joycon
- dual_left_sixaxis_entry.attribute.is_connected.Assign(1);
- dual_left_sixaxis_entry.accel = motion_devices[0].accel;
- dual_left_sixaxis_entry.gyro = motion_devices[0].gyro;
- dual_left_sixaxis_entry.rotation = motion_devices[0].rotation;
- dual_left_sixaxis_entry.orientation = motion_devices[0].orientation;
+ sixaxis_dual_left_state.attribute.is_connected.Assign(1);
+ sixaxis_dual_left_state.accel = motion_state[0].accel;
+ sixaxis_dual_left_state.gyro = motion_state[0].gyro;
+ sixaxis_dual_left_state.rotation = motion_state[0].rotation;
+ sixaxis_dual_left_state.orientation = motion_state[0].orientation;
}
- if (sixaxis_sensors_enabled && motions[i][1]) {
+ if (controller.sixaxis_sensor_enabled) {
// Set motion for the right joycon
- dual_right_sixaxis_entry.attribute.is_connected.Assign(1);
- dual_right_sixaxis_entry.accel = motion_devices[1].accel;
- dual_right_sixaxis_entry.gyro = motion_devices[1].gyro;
- dual_right_sixaxis_entry.rotation = motion_devices[1].rotation;
- dual_right_sixaxis_entry.orientation = motion_devices[1].orientation;
+ sixaxis_dual_right_state.attribute.is_connected.Assign(1);
+ sixaxis_dual_right_state.accel = motion_state[1].accel;
+ sixaxis_dual_right_state.gyro = motion_state[1].gyro;
+ sixaxis_dual_right_state.rotation = motion_state[1].rotation;
+ sixaxis_dual_right_state.orientation = motion_state[1].orientation;
}
break;
- case NPadControllerType::JoyLeft:
- left_sixaxis_entry.attribute.raw = 0;
- if (sixaxis_sensors_enabled && motions[i][0]) {
- left_sixaxis_entry.attribute.is_connected.Assign(1);
- left_sixaxis_entry.accel = motion_devices[0].accel;
- left_sixaxis_entry.gyro = motion_devices[0].gyro;
- left_sixaxis_entry.rotation = motion_devices[0].rotation;
- left_sixaxis_entry.orientation = motion_devices[0].orientation;
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ sixaxis_left_lifo_state.attribute.raw = 0;
+ if (controller.sixaxis_sensor_enabled) {
+ sixaxis_left_lifo_state.attribute.is_connected.Assign(1);
+ sixaxis_left_lifo_state.accel = motion_state[0].accel;
+ sixaxis_left_lifo_state.gyro = motion_state[0].gyro;
+ sixaxis_left_lifo_state.rotation = motion_state[0].rotation;
+ sixaxis_left_lifo_state.orientation = motion_state[0].orientation;
}
break;
- case NPadControllerType::JoyRight:
- right_sixaxis_entry.attribute.raw = 0;
- if (sixaxis_sensors_enabled && motions[i][1]) {
- right_sixaxis_entry.attribute.is_connected.Assign(1);
- right_sixaxis_entry.accel = motion_devices[1].accel;
- right_sixaxis_entry.gyro = motion_devices[1].gyro;
- right_sixaxis_entry.rotation = motion_devices[1].rotation;
- right_sixaxis_entry.orientation = motion_devices[1].orientation;
+ case Core::HID::NpadStyleIndex::JoyconRight:
+ sixaxis_right_lifo_state.attribute.raw = 0;
+ if (controller.sixaxis_sensor_enabled) {
+ sixaxis_right_lifo_state.attribute.is_connected.Assign(1);
+ sixaxis_right_lifo_state.accel = motion_state[1].accel;
+ sixaxis_right_lifo_state.gyro = motion_state[1].gyro;
+ sixaxis_right_lifo_state.rotation = motion_state[1].rotation;
+ sixaxis_right_lifo_state.orientation = motion_state[1].orientation;
}
break;
- case NPadControllerType::GameCube:
- case NPadControllerType::Pokeball:
+ default:
break;
}
+
+ sixaxis_fullkey_state.sampling_number =
+ npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ sixaxis_handheld_state.sampling_number =
+ npad.sixaxis_handheld_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ sixaxis_dual_left_state.sampling_number =
+ npad.sixaxis_dual_left_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ sixaxis_dual_right_state.sampling_number =
+ npad.sixaxis_dual_right_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ sixaxis_left_lifo_state.sampling_number =
+ npad.sixaxis_left_lifo.ReadCurrentEntry().state.sampling_number + 1;
+ sixaxis_right_lifo_state.sampling_number =
+ npad.sixaxis_right_lifo.ReadCurrentEntry().state.sampling_number + 1;
+
+ if (Core::HID::IndexToNpadIdType(i) == Core::HID::NpadIdType::Handheld) {
+ // This buffer only is updated on handheld on HW
+ npad.sixaxis_handheld_lifo.WriteNextEntry(sixaxis_handheld_state);
+ } else {
+ // Handheld doesn't update this buffer on HW
+ npad.sixaxis_fullkey_lifo.WriteNextEntry(sixaxis_fullkey_state);
+ }
+
+ npad.sixaxis_dual_left_lifo.WriteNextEntry(sixaxis_dual_left_state);
+ npad.sixaxis_dual_right_lifo.WriteNextEntry(sixaxis_dual_right_state);
+ npad.sixaxis_left_lifo.WriteNextEntry(sixaxis_left_lifo_state);
+ npad.sixaxis_right_lifo.WriteNextEntry(sixaxis_right_lifo_state);
+ std::memcpy(data + NPAD_OFFSET + (i * sizeof(NpadInternalState)),
+ &controller.shared_memory_entry, sizeof(NpadInternalState));
}
- std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(),
- shared_memory_entries.size() * sizeof(NPadEntry));
}
-void Controller_NPad::SetSupportedStyleSet(NpadStyleSet style_set) {
- style.raw = style_set.raw;
+void Controller_NPad::SetSupportedStyleSet(Core::HID::NpadStyleTag style_set) {
+ hid_core.SetSupportedStyleTag(style_set);
}
-Controller_NPad::NpadStyleSet Controller_NPad::GetSupportedStyleSet() const {
- return style;
+Core::HID::NpadStyleTag Controller_NPad::GetSupportedStyleSet() const {
+ return hid_core.GetSupportedStyleTag();
}
void Controller_NPad::SetSupportedNpadIdTypes(u8* data, std::size_t length) {
@@ -779,11 +673,11 @@ std::size_t Controller_NPad::GetSupportedNpadIdTypesSize() const {
return supported_npad_id_types.size();
}
-void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) {
+void Controller_NPad::SetHoldType(NpadJoyHoldType joy_hold_type) {
hold_type = joy_hold_type;
}
-Controller_NPad::NpadHoldType Controller_NPad::GetHoldType() const {
+Controller_NPad::NpadJoyHoldType Controller_NPad::GetHoldType() const {
return hold_type;
}
@@ -803,29 +697,91 @@ Controller_NPad::NpadCommunicationMode Controller_NPad::GetNpadCommunicationMode
return communication_mode;
}
-void Controller_NPad::SetNpadMode(u32 npad_id, NpadAssignments assignment_mode) {
- const std::size_t npad_index = NPadIdToIndex(npad_id);
- ASSERT(npad_index < shared_memory_entries.size());
- if (shared_memory_entries[npad_index].assignment_mode != assignment_mode) {
- shared_memory_entries[npad_index].assignment_mode = assignment_mode;
+void Controller_NPad::SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type,
+ NpadJoyAssignmentMode assignment_mode) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ return;
+ }
+
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ if (controller.shared_memory_entry.assignment_mode != assignment_mode) {
+ controller.shared_memory_entry.assignment_mode = assignment_mode;
+ }
+
+ if (!controller.device->IsConnected()) {
+ return;
+ }
+
+ if (assignment_mode == NpadJoyAssignmentMode::Dual) {
+ if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconLeft) {
+ DisconnectNpad(npad_id);
+ controller.is_dual_left_connected = true;
+ controller.is_dual_right_connected = false;
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true);
+ return;
+ }
+ if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) {
+ DisconnectNpad(npad_id);
+ controller.is_dual_left_connected = false;
+ controller.is_dual_right_connected = true;
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id, true);
+ return;
+ }
+ return;
+ }
+
+ // This is for NpadJoyAssignmentMode::Single
+
+ // Only JoyconDual get affected by this function
+ if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::JoyconDual) {
+ return;
+ }
+
+ if (controller.is_dual_left_connected && !controller.is_dual_right_connected) {
+ DisconnectNpad(npad_id);
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true);
+ return;
+ }
+ if (!controller.is_dual_left_connected && controller.is_dual_right_connected) {
+ DisconnectNpad(npad_id);
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true);
+ return;
+ }
+
+ // We have two controllers connected to the same npad_id we need to split them
+ const auto npad_id_2 = hid_core.GetFirstDisconnectedNpadId();
+ auto& controller_2 = GetControllerFromNpadIdType(npad_id_2);
+ DisconnectNpad(npad_id);
+ if (npad_device_type == NpadJoyDeviceType::Left) {
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true);
+ controller_2.is_dual_left_connected = false;
+ controller_2.is_dual_right_connected = true;
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true);
+ } else {
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconRight, npad_id, true);
+ controller_2.is_dual_left_connected = true;
+ controller_2.is_dual_right_connected = false;
+ UpdateControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_2, true);
}
}
-bool Controller_NPad::VibrateControllerAtIndex(std::size_t npad_index, std::size_t device_index,
- const VibrationValue& vibration_value) {
- if (!connected_controllers[npad_index].is_connected || !vibrations[npad_index][device_index]) {
+bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id,
+ std::size_t device_index,
+ const Core::HID::VibrationValue& vibration_value) {
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ if (!controller.device->IsConnected()) {
return false;
}
- const auto& player = Settings::values.players.GetValue()[npad_index];
-
- if (!player.vibration_enabled) {
- if (latest_vibration_values[npad_index][device_index].amp_low != 0.0f ||
- latest_vibration_values[npad_index][device_index].amp_high != 0.0f) {
+ if (!controller.device->IsVibrationEnabled()) {
+ if (controller.vibration[device_index].latest_vibration_value.low_amplitude != 0.0f ||
+ controller.vibration[device_index].latest_vibration_value.high_amplitude != 0.0f) {
// Send an empty vibration to stop any vibrations.
- vibrations[npad_index][device_index]->SetRumblePlay(0.0f, 160.0f, 0.0f, 320.0f);
+ Core::HID::VibrationValue vibration{0.0f, 160.0f, 0.0f, 320.0f};
+ controller.device->SetVibration(device_index, vibration);
// Then reset the vibration value to its default value.
- latest_vibration_values[npad_index][device_index] = DEFAULT_VIBRATION_VALUE;
+ controller.vibration[device_index].latest_vibration_value = DEFAULT_VIBRATION_VALUE;
}
return false;
@@ -839,27 +795,25 @@ bool Controller_NPad::VibrateControllerAtIndex(std::size_t npad_index, std::size
const auto now = steady_clock::now();
// Filter out non-zero vibrations that are within 10ms of each other.
- if ((vibration_value.amp_low != 0.0f || vibration_value.amp_high != 0.0f) &&
- duration_cast<milliseconds>(now - last_vibration_timepoints[npad_index][device_index]) <
+ if ((vibration_value.low_amplitude != 0.0f || vibration_value.high_amplitude != 0.0f) &&
+ duration_cast<milliseconds>(
+ now - controller.vibration[device_index].last_vibration_timepoint) <
milliseconds(10)) {
return false;
}
- last_vibration_timepoints[npad_index][device_index] = now;
+ controller.vibration[device_index].last_vibration_timepoint = now;
}
- auto& vibration = vibrations[npad_index][device_index];
- const auto player_vibration_strength = static_cast<f32>(player.vibration_strength);
- const auto amp_low =
- std::min(vibration_value.amp_low * player_vibration_strength / 100.0f, 1.0f);
- const auto amp_high =
- std::min(vibration_value.amp_high * player_vibration_strength / 100.0f, 1.0f);
- return vibration->SetRumblePlay(amp_low, vibration_value.freq_low, amp_high,
- vibration_value.freq_high);
+ Core::HID::VibrationValue vibration{
+ vibration_value.low_amplitude, vibration_value.low_frequency,
+ vibration_value.high_amplitude, vibration_value.high_frequency};
+ return controller.device->SetVibration(device_index, vibration);
}
-void Controller_NPad::VibrateController(const DeviceHandle& vibration_device_handle,
- const VibrationValue& vibration_value) {
+void Controller_NPad::VibrateController(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle,
+ const Core::HID::VibrationValue& vibration_value) {
if (!IsDeviceHandleValid(vibration_device_handle)) {
return;
}
@@ -868,42 +822,45 @@ void Controller_NPad::VibrateController(const DeviceHandle& vibration_device_han
return;
}
- const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id);
+ auto& controller = GetControllerFromHandle(vibration_device_handle);
const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
- if (!vibration_devices_mounted[npad_index][device_index] ||
- !connected_controllers[npad_index].is_connected) {
+ if (!controller.vibration[device_index].device_mounted || !controller.device->IsConnected()) {
return;
}
- if (vibration_device_handle.device_index == DeviceIndex::None) {
+ if (vibration_device_handle.device_index == Core::HID::DeviceIndex::None) {
UNREACHABLE_MSG("DeviceIndex should never be None!");
return;
}
// Some games try to send mismatched parameters in the device handle, block these.
- if ((connected_controllers[npad_index].type == NPadControllerType::JoyLeft &&
- (vibration_device_handle.npad_type == NpadType::JoyconRight ||
- vibration_device_handle.device_index == DeviceIndex::Right)) ||
- (connected_controllers[npad_index].type == NPadControllerType::JoyRight &&
- (vibration_device_handle.npad_type == NpadType::JoyconLeft ||
- vibration_device_handle.device_index == DeviceIndex::Left))) {
+ if ((controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconLeft &&
+ (vibration_device_handle.npad_type == Core::HID::NpadStyleIndex::JoyconRight ||
+ vibration_device_handle.device_index == Core::HID::DeviceIndex::Right)) ||
+ (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight &&
+ (vibration_device_handle.npad_type == Core::HID::NpadStyleIndex::JoyconLeft ||
+ vibration_device_handle.device_index == Core::HID::DeviceIndex::Left))) {
return;
}
// Filter out vibrations with equivalent values to reduce unnecessary state changes.
- if (vibration_value.amp_low == latest_vibration_values[npad_index][device_index].amp_low &&
- vibration_value.amp_high == latest_vibration_values[npad_index][device_index].amp_high) {
+ if (vibration_value.low_amplitude ==
+ controller.vibration[device_index].latest_vibration_value.low_amplitude &&
+ vibration_value.high_amplitude ==
+ controller.vibration[device_index].latest_vibration_value.high_amplitude) {
return;
}
- if (VibrateControllerAtIndex(npad_index, device_index, vibration_value)) {
- latest_vibration_values[npad_index][device_index] = vibration_value;
+ if (VibrateControllerAtIndex(controller.device->GetNpadIdType(), device_index,
+ vibration_value)) {
+ controller.vibration[device_index].latest_vibration_value = vibration_value;
}
}
-void Controller_NPad::VibrateControllers(const std::vector<DeviceHandle>& vibration_device_handles,
- const std::vector<VibrationValue>& vibration_values) {
+void Controller_NPad::VibrateControllers(
+ const std::vector<Core::HID::VibrationDeviceHandle>& vibration_device_handles,
+ const std::vector<Core::HID::VibrationValue>& vibration_values) {
if (!Settings::values.vibration_enabled.GetValue() && !permit_vibration_session_enabled) {
return;
}
@@ -918,168 +875,285 @@ void Controller_NPad::VibrateControllers(const std::vector<DeviceHandle>& vibrat
}
}
-Controller_NPad::VibrationValue Controller_NPad::GetLastVibration(
- const DeviceHandle& vibration_device_handle) const {
+Core::HID::VibrationValue Controller_NPad::GetLastVibration(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle) const {
if (!IsDeviceHandleValid(vibration_device_handle)) {
return {};
}
- const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id);
+ const auto& controller = GetControllerFromHandle(vibration_device_handle);
const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
- return latest_vibration_values[npad_index][device_index];
+ return controller.vibration[device_index].latest_vibration_value;
}
-void Controller_NPad::InitializeVibrationDevice(const DeviceHandle& vibration_device_handle) {
+void Controller_NPad::InitializeVibrationDevice(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle) {
if (!IsDeviceHandleValid(vibration_device_handle)) {
return;
}
- const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id);
+ const auto npad_index = static_cast<Core::HID::NpadIdType>(vibration_device_handle.npad_id);
const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
InitializeVibrationDeviceAtIndex(npad_index, device_index);
}
-void Controller_NPad::InitializeVibrationDeviceAtIndex(std::size_t npad_index,
+void Controller_NPad::InitializeVibrationDeviceAtIndex(Core::HID::NpadIdType npad_id,
std::size_t device_index) {
+ auto& controller = GetControllerFromNpadIdType(npad_id);
if (!Settings::values.vibration_enabled.GetValue()) {
- vibration_devices_mounted[npad_index][device_index] = false;
+ controller.vibration[device_index].device_mounted = false;
return;
}
- if (vibrations[npad_index][device_index]) {
- vibration_devices_mounted[npad_index][device_index] =
- vibrations[npad_index][device_index]->GetStatus() == 1;
- } else {
- vibration_devices_mounted[npad_index][device_index] = false;
- }
+ controller.vibration[device_index].device_mounted =
+ controller.device->TestVibration(device_index);
}
void Controller_NPad::SetPermitVibrationSession(bool permit_vibration_session) {
permit_vibration_session_enabled = permit_vibration_session;
}
-bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const {
+bool Controller_NPad::IsVibrationDeviceMounted(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle) const {
if (!IsDeviceHandleValid(vibration_device_handle)) {
return false;
}
- const auto npad_index = NPadIdToIndex(vibration_device_handle.npad_id);
+ const auto& controller = GetControllerFromHandle(vibration_device_handle);
const auto device_index = static_cast<std::size_t>(vibration_device_handle.device_index);
- return vibration_devices_mounted[npad_index][device_index];
+ return controller.vibration[device_index].device_mounted;
}
-Kernel::KReadableEvent& Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) {
- return styleset_changed_events[NPadIdToIndex(npad_id)]->GetReadableEvent();
+Kernel::KReadableEvent& Controller_NPad::GetStyleSetChangedEvent(Core::HID::NpadIdType npad_id) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ // Fallback to player 1
+ const auto& controller = GetControllerFromNpadIdType(Core::HID::NpadIdType::Player1);
+ return controller.styleset_changed_event->GetReadableEvent();
+ }
+
+ const auto& controller = GetControllerFromNpadIdType(npad_id);
+ return controller.styleset_changed_event->GetReadableEvent();
}
-void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const {
- styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent().Signal();
+void Controller_NPad::SignalStyleSetChangedEvent(Core::HID::NpadIdType npad_id) const {
+ const auto& controller = GetControllerFromNpadIdType(npad_id);
+ controller.styleset_changed_event->GetWritableEvent().Signal();
}
-void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) {
- UpdateControllerAt(controller, npad_index, true);
+void Controller_NPad::AddNewControllerAt(Core::HID::NpadStyleIndex controller,
+ Core::HID::NpadIdType npad_id) {
+ UpdateControllerAt(controller, npad_id, true);
}
-void Controller_NPad::UpdateControllerAt(NPadControllerType controller, std::size_t npad_index,
- bool connected) {
+void Controller_NPad::UpdateControllerAt(Core::HID::NpadStyleIndex type,
+ Core::HID::NpadIdType npad_id, bool connected) {
+ auto& controller = GetControllerFromNpadIdType(npad_id);
if (!connected) {
- DisconnectNpadAtIndex(npad_index);
- return;
- }
-
- if (controller == NPadControllerType::Handheld && npad_index == HANDHELD_INDEX) {
- Settings::values.players.GetValue()[HANDHELD_INDEX].controller_type =
- MapNPadToSettingsType(controller);
- Settings::values.players.GetValue()[HANDHELD_INDEX].connected = true;
- connected_controllers[HANDHELD_INDEX] = {controller, true};
- InitNewlyAddedController(HANDHELD_INDEX);
+ DisconnectNpad(npad_id);
return;
}
- Settings::values.players.GetValue()[npad_index].controller_type =
- MapNPadToSettingsType(controller);
- Settings::values.players.GetValue()[npad_index].connected = true;
- connected_controllers[npad_index] = {controller, true};
- InitNewlyAddedController(npad_index);
+ controller.device->SetNpadStyleIndex(type);
+ InitNewlyAddedController(npad_id);
}
-void Controller_NPad::DisconnectNpad(u32 npad_id) {
- DisconnectNpadAtIndex(NPadIdToIndex(npad_id));
-}
+void Controller_NPad::DisconnectNpad(Core::HID::NpadIdType npad_id) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ return;
+ }
-void Controller_NPad::DisconnectNpadAtIndex(std::size_t npad_index) {
- for (std::size_t device_idx = 0; device_idx < vibrations[npad_index].size(); ++device_idx) {
+ LOG_DEBUG(Service_HID, "Npad disconnected {}", npad_id);
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ for (std::size_t device_idx = 0; device_idx < controller.vibration.size(); ++device_idx) {
// Send an empty vibration to stop any vibrations.
- VibrateControllerAtIndex(npad_index, device_idx, {});
- vibration_devices_mounted[npad_index][device_idx] = false;
+ VibrateControllerAtIndex(npad_id, device_idx, {});
+ controller.vibration[device_idx].device_mounted = false;
}
- Settings::values.players.GetValue()[npad_index].connected = false;
- connected_controllers[npad_index].is_connected = false;
-
- auto& controller = shared_memory_entries[npad_index];
- controller.style_set.raw = 0; // Zero out
- controller.device_type.raw = 0;
- controller.system_properties.raw = 0;
- controller.button_properties.raw = 0;
- controller.battery_level_dual = 0;
- controller.battery_level_left = 0;
- controller.battery_level_right = 0;
- controller.fullkey_color = {};
- controller.joycon_color = {};
- controller.assignment_mode = NpadAssignments::Dual;
- controller.footer_type = AppletFooterUiType::None;
+ auto& shared_memory_entry = controller.shared_memory_entry;
+ // Don't reset shared_memory_entry.assignment_mode this value is persistent
+ shared_memory_entry.style_tag.raw = Core::HID::NpadStyleSet::None; // Zero out
+ shared_memory_entry.device_type.raw = 0;
+ shared_memory_entry.system_properties.raw = 0;
+ shared_memory_entry.button_properties.raw = 0;
+ shared_memory_entry.battery_level_dual = 0;
+ shared_memory_entry.battery_level_left = 0;
+ shared_memory_entry.battery_level_right = 0;
+ shared_memory_entry.fullkey_color = {
+ .attribute = ColorAttribute::NoController,
+ .fullkey = {},
+ };
+ shared_memory_entry.joycon_color = {
+ .attribute = ColorAttribute::NoController,
+ .left = {},
+ .right = {},
+ };
+ shared_memory_entry.applet_footer.type = AppletFooterUiType::None;
+
+ controller.is_dual_left_connected = true;
+ controller.is_dual_right_connected = true;
+ controller.is_connected = false;
+ controller.device->Disconnect();
+ SignalStyleSetChangedEvent(npad_id);
+ WriteEmptyEntry(controller.shared_memory_entry);
+}
- SignalStyleSetChangedEvent(IndexToNPad(npad_index));
+void Controller_NPad::SetGyroscopeZeroDriftMode(Core::HID::SixAxisSensorHandle sixaxis_handle,
+ GyroscopeZeroDriftMode drift_mode) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ return;
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ controller.gyroscope_zero_drift_mode = drift_mode;
}
-void Controller_NPad::SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode) {
- gyroscope_zero_drift_mode = drift_mode;
+Controller_NPad::GyroscopeZeroDriftMode Controller_NPad::GetGyroscopeZeroDriftMode(
+ Core::HID::SixAxisSensorHandle sixaxis_handle) const {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ // Return the default value
+ return GyroscopeZeroDriftMode::Standard;
+ }
+ const auto& controller = GetControllerFromHandle(sixaxis_handle);
+ return controller.gyroscope_zero_drift_mode;
}
-Controller_NPad::GyroscopeZeroDriftMode Controller_NPad::GetGyroscopeZeroDriftMode() const {
- return gyroscope_zero_drift_mode;
+bool Controller_NPad::IsSixAxisSensorAtRest(Core::HID::SixAxisSensorHandle sixaxis_handle) const {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ // Return the default value
+ return true;
+ }
+ const auto& controller = GetControllerFromHandle(sixaxis_handle);
+ return controller.sixaxis_at_rest;
}
-bool Controller_NPad::IsSixAxisSensorAtRest() const {
- return sixaxis_at_rest;
+void Controller_NPad::SetSixAxisEnabled(Core::HID::SixAxisSensorHandle sixaxis_handle,
+ bool sixaxis_status) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ return;
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ controller.sixaxis_sensor_enabled = sixaxis_status;
}
-void Controller_NPad::SetSixAxisEnabled(bool six_axis_status) {
- sixaxis_sensors_enabled = six_axis_status;
+void Controller_NPad::SetSixAxisFusionEnabled(Core::HID::SixAxisSensorHandle sixaxis_handle,
+ bool sixaxis_fusion_status) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ return;
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ controller.sixaxis_fusion_enabled = sixaxis_fusion_status;
}
-void Controller_NPad::SetSixAxisFusionParameters(f32 parameter1, f32 parameter2) {
- sixaxis_fusion_parameter1 = parameter1;
- sixaxis_fusion_parameter2 = parameter2;
+void Controller_NPad::SetSixAxisFusionParameters(
+ Core::HID::SixAxisSensorHandle sixaxis_handle,
+ Core::HID::SixAxisSensorFusionParameters sixaxis_fusion_parameters) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ return;
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ controller.sixaxis_fusion = sixaxis_fusion_parameters;
}
-std::pair<f32, f32> Controller_NPad::GetSixAxisFusionParameters() {
- return {
- sixaxis_fusion_parameter1,
- sixaxis_fusion_parameter2,
- };
+Core::HID::SixAxisSensorFusionParameters Controller_NPad::GetSixAxisFusionParameters(
+ Core::HID::SixAxisSensorHandle sixaxis_handle) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ // Since these parameters are unknow just return zeros
+ return {};
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ return controller.sixaxis_fusion;
}
-void Controller_NPad::ResetSixAxisFusionParameters() {
- sixaxis_fusion_parameter1 = 0.0f;
- sixaxis_fusion_parameter2 = 0.0f;
+void Controller_NPad::ResetSixAxisFusionParameters(Core::HID::SixAxisSensorHandle sixaxis_handle) {
+ if (!IsDeviceHandleValid(sixaxis_handle)) {
+ LOG_ERROR(Service_HID, "Invalid handle");
+ return;
+ }
+ auto& controller = GetControllerFromHandle(sixaxis_handle);
+ // Since these parameters are unknow just fill with zeros
+ controller.sixaxis_fusion = {};
}
-void Controller_NPad::MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2) {
- const auto npad_index_1 = NPadIdToIndex(npad_id_1);
- const auto npad_index_2 = NPadIdToIndex(npad_id_2);
+void Controller_NPad::MergeSingleJoyAsDualJoy(Core::HID::NpadIdType npad_id_1,
+ Core::HID::NpadIdType npad_id_2) {
+ if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id_1:{}, npad_id_2:{}", npad_id_1,
+ npad_id_2);
+ return;
+ }
+ auto& controller_1 = GetControllerFromNpadIdType(npad_id_1);
+ auto& controller_2 = GetControllerFromNpadIdType(npad_id_2);
+ const auto controller_style_1 = controller_1.device->GetNpadStyleIndex();
+ const auto controller_style_2 = controller_2.device->GetNpadStyleIndex();
+ bool merge_controllers = false;
// If the controllers at both npad indices form a pair of left and right joycons, merge them.
// Otherwise, do nothing.
- if ((connected_controllers[npad_index_1].type == NPadControllerType::JoyLeft &&
- connected_controllers[npad_index_2].type == NPadControllerType::JoyRight) ||
- (connected_controllers[npad_index_2].type == NPadControllerType::JoyLeft &&
- connected_controllers[npad_index_1].type == NPadControllerType::JoyRight)) {
+ if (controller_style_1 == Core::HID::NpadStyleIndex::JoyconLeft &&
+ controller_style_2 == Core::HID::NpadStyleIndex::JoyconRight) {
+ merge_controllers = true;
+ }
+ if (controller_style_2 == Core::HID::NpadStyleIndex::JoyconLeft &&
+ controller_style_1 == Core::HID::NpadStyleIndex::JoyconRight) {
+ merge_controllers = true;
+ }
+ if (controller_style_1 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_2 == Core::HID::NpadStyleIndex::JoyconRight &&
+ controller_1.is_dual_left_connected && !controller_1.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+ if (controller_style_1 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_2 == Core::HID::NpadStyleIndex::JoyconLeft &&
+ !controller_1.is_dual_left_connected && controller_1.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+ if (controller_style_2 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_1 == Core::HID::NpadStyleIndex::JoyconRight &&
+ controller_2.is_dual_left_connected && !controller_2.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+ if (controller_style_2 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_1 == Core::HID::NpadStyleIndex::JoyconLeft &&
+ !controller_2.is_dual_left_connected && controller_2.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+ if (controller_style_1 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_2 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_1.is_dual_left_connected && !controller_1.is_dual_right_connected &&
+ !controller_2.is_dual_left_connected && controller_2.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+ if (controller_style_1 == Core::HID::NpadStyleIndex::JoyconDual &&
+ controller_style_2 == Core::HID::NpadStyleIndex::JoyconDual &&
+ !controller_1.is_dual_left_connected && controller_1.is_dual_right_connected &&
+ controller_2.is_dual_left_connected && !controller_2.is_dual_right_connected) {
+ merge_controllers = true;
+ }
+
+ if (merge_controllers) {
// Disconnect the joycon at the second id and connect the dual joycon at the first index.
DisconnectNpad(npad_id_2);
- AddNewControllerAt(NPadControllerType::JoyDual, npad_index_1);
+ controller_1.is_dual_left_connected = true;
+ controller_1.is_dual_right_connected = true;
+ AddNewControllerAt(Core::HID::NpadStyleIndex::JoyconDual, npad_id_1);
+ return;
}
+ LOG_WARNING(Service_HID,
+ "Controllers can't be merged npad_id_1:{}, npad_id_2:{}, type_1:{}, type_2:{}, "
+ "dual_1(left/right):{}/{}, dual_2(left/right):{}/{}",
+ npad_id_1, npad_id_2, controller_1.device->GetNpadStyleIndex(),
+ controller_2.device->GetNpadStyleIndex(), controller_1.is_dual_left_connected,
+ controller_1.is_dual_right_connected, controller_2.is_dual_left_connected,
+ controller_2.is_dual_right_connected);
}
void Controller_NPad::StartLRAssignmentMode() {
@@ -1092,61 +1166,66 @@ void Controller_NPad::StopLRAssignmentMode() {
is_in_lr_assignment_mode = false;
}
-bool Controller_NPad::SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2) {
- if (npad_id_1 == NPAD_HANDHELD || npad_id_2 == NPAD_HANDHELD || npad_id_1 == NPAD_UNKNOWN ||
- npad_id_2 == NPAD_UNKNOWN) {
+bool Controller_NPad::SwapNpadAssignment(Core::HID::NpadIdType npad_id_1,
+ Core::HID::NpadIdType npad_id_2) {
+ if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id_1:{}, npad_id_2:{}", npad_id_1,
+ npad_id_2);
+ return false;
+ }
+ if (npad_id_1 == Core::HID::NpadIdType::Handheld ||
+ npad_id_2 == Core::HID::NpadIdType::Handheld || npad_id_1 == Core::HID::NpadIdType::Other ||
+ npad_id_2 == Core::HID::NpadIdType::Other) {
return true;
}
- const auto npad_index_1 = NPadIdToIndex(npad_id_1);
- const auto npad_index_2 = NPadIdToIndex(npad_id_2);
-
- if (!IsControllerSupported(connected_controllers[npad_index_1].type) ||
- !IsControllerSupported(connected_controllers[npad_index_2].type)) {
+ const auto& controller_1 = GetControllerFromNpadIdType(npad_id_1).device;
+ const auto& controller_2 = GetControllerFromNpadIdType(npad_id_2).device;
+ const auto type_index_1 = controller_1->GetNpadStyleIndex();
+ const auto type_index_2 = controller_2->GetNpadStyleIndex();
+ const auto is_connected_1 = controller_1->IsConnected();
+ const auto is_connected_2 = controller_2->IsConnected();
+
+ if (!IsControllerSupported(type_index_1) && is_connected_1) {
+ return false;
+ }
+ if (!IsControllerSupported(type_index_2) && is_connected_2) {
return false;
}
- std::swap(connected_controllers[npad_index_1].type, connected_controllers[npad_index_2].type);
-
- AddNewControllerAt(connected_controllers[npad_index_1].type, npad_index_1);
- AddNewControllerAt(connected_controllers[npad_index_2].type, npad_index_2);
+ UpdateControllerAt(type_index_2, npad_id_1, is_connected_2);
+ UpdateControllerAt(type_index_1, npad_id_2, is_connected_1);
return true;
}
-Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) {
- if (npad_id == npad_id_list.back() || npad_id == npad_id_list[npad_id_list.size() - 2]) {
- // These are controllers without led patterns
- return LedPattern{0, 0, 0, 0};
- }
- switch (npad_id) {
- case 0:
- return LedPattern{1, 0, 0, 0};
- case 1:
- return LedPattern{1, 1, 0, 0};
- case 2:
- return LedPattern{1, 1, 1, 0};
- case 3:
- return LedPattern{1, 1, 1, 1};
- case 4:
- return LedPattern{1, 0, 0, 1};
- case 5:
- return LedPattern{1, 0, 1, 0};
- case 6:
- return LedPattern{1, 0, 1, 1};
- case 7:
- return LedPattern{0, 1, 1, 0};
- default:
- return LedPattern{0, 0, 0, 0};
+Core::HID::LedPattern Controller_NPad::GetLedPattern(Core::HID::NpadIdType npad_id) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ return Core::HID::LedPattern{0, 0, 0, 0};
}
+ const auto& controller = GetControllerFromNpadIdType(npad_id).device;
+ return controller->GetLedPattern();
}
-bool Controller_NPad::IsUnintendedHomeButtonInputProtectionEnabled(u32 npad_id) const {
- return unintended_home_button_input_protection[NPadIdToIndex(npad_id)];
+bool Controller_NPad::IsUnintendedHomeButtonInputProtectionEnabled(
+ Core::HID::NpadIdType npad_id) const {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ // Return the default value
+ return false;
+ }
+ const auto& controller = GetControllerFromNpadIdType(npad_id);
+ return controller.unintended_home_button_input_protection;
}
void Controller_NPad::SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled,
- u32 npad_id) {
- unintended_home_button_input_protection[NPadIdToIndex(npad_id)] = is_protection_enabled;
+ Core::HID::NpadIdType npad_id) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ return;
+ }
+ auto& controller = GetControllerFromNpadIdType(npad_id);
+ controller.unintended_home_button_input_protection = is_protection_enabled;
}
void Controller_NPad::SetAnalogStickUseCenterClamp(bool use_center_clamp) {
@@ -1154,49 +1233,51 @@ void Controller_NPad::SetAnalogStickUseCenterClamp(bool use_center_clamp) {
}
void Controller_NPad::ClearAllConnectedControllers() {
- for (auto& controller : connected_controllers) {
- if (controller.is_connected && controller.type != NPadControllerType::None) {
- controller.type = NPadControllerType::None;
- controller.is_connected = false;
+ for (auto& controller : controller_data) {
+ if (controller.device->IsConnected() &&
+ controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::None) {
+ controller.device->Disconnect();
+ controller.device->SetNpadStyleIndex(Core::HID::NpadStyleIndex::None);
}
}
}
void Controller_NPad::DisconnectAllConnectedControllers() {
- for (auto& controller : connected_controllers) {
- controller.is_connected = false;
+ for (auto& controller : controller_data) {
+ controller.device->Disconnect();
}
}
void Controller_NPad::ConnectAllDisconnectedControllers() {
- for (auto& controller : connected_controllers) {
- if (controller.type != NPadControllerType::None && !controller.is_connected) {
- controller.is_connected = true;
+ for (auto& controller : controller_data) {
+ if (controller.device->GetNpadStyleIndex() != Core::HID::NpadStyleIndex::None &&
+ !controller.device->IsConnected()) {
+ controller.device->Connect();
}
}
}
void Controller_NPad::ClearAllControllers() {
- for (auto& controller : connected_controllers) {
- controller.type = NPadControllerType::None;
- controller.is_connected = false;
+ for (auto& controller : controller_data) {
+ controller.device->Disconnect();
+ controller.device->SetNpadStyleIndex(Core::HID::NpadStyleIndex::None);
}
}
-u32 Controller_NPad::GetAndResetPressState() {
- return press_state.exchange(0);
+Core::HID::NpadButton Controller_NPad::GetAndResetPressState() {
+ return static_cast<Core::HID::NpadButton>(press_state.exchange(0));
}
-bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const {
- if (controller == NPadControllerType::Handheld) {
+bool Controller_NPad::IsControllerSupported(Core::HID::NpadStyleIndex controller) const {
+ if (controller == Core::HID::NpadStyleIndex::Handheld) {
const bool support_handheld =
std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(),
- NPAD_HANDHELD) != supported_npad_id_types.end();
+ Core::HID::NpadIdType::Handheld) != supported_npad_id_types.end();
// Handheld is not even a supported type, lets stop here
if (!support_handheld) {
return false;
}
- // Handheld should not be supported in docked mode
+ // Handheld shouldn't be supported in docked mode
if (Settings::values.use_docked_mode.GetValue()) {
return false;
}
@@ -1205,20 +1286,31 @@ bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const
}
if (std::any_of(supported_npad_id_types.begin(), supported_npad_id_types.end(),
- [](u32 npad_id) { return npad_id <= MAX_NPAD_ID; })) {
+ [](Core::HID::NpadIdType npad_id) {
+ return npad_id <= Core::HID::NpadIdType::Player8;
+ })) {
+ Core::HID::NpadStyleTag style = GetSupportedStyleSet();
switch (controller) {
- case NPadControllerType::ProController:
+ case Core::HID::NpadStyleIndex::ProController:
return style.fullkey;
- case NPadControllerType::JoyDual:
+ case Core::HID::NpadStyleIndex::JoyconDual:
return style.joycon_dual;
- case NPadControllerType::JoyLeft:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
return style.joycon_left;
- case NPadControllerType::JoyRight:
+ case Core::HID::NpadStyleIndex::JoyconRight:
return style.joycon_right;
- case NPadControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
return style.gamecube;
- case NPadControllerType::Pokeball:
+ case Core::HID::NpadStyleIndex::Pokeball:
return style.palma;
+ case Core::HID::NpadStyleIndex::NES:
+ return style.lark;
+ case Core::HID::NpadStyleIndex::SNES:
+ return style.lucia;
+ case Core::HID::NpadStyleIndex::N64:
+ return style.lagoon;
+ case Core::HID::NpadStyleIndex::SegaGenesis:
+ return style.lager;
default:
return false;
}
@@ -1227,4 +1319,48 @@ bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const
return false;
}
+Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromHandle(
+ const Core::HID::SixAxisSensorHandle& device_handle) {
+ const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id);
+ return GetControllerFromNpadIdType(npad_id);
+}
+
+const Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromHandle(
+ const Core::HID::SixAxisSensorHandle& device_handle) const {
+ const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id);
+ return GetControllerFromNpadIdType(npad_id);
+}
+
+Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromHandle(
+ const Core::HID::VibrationDeviceHandle& device_handle) {
+ const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id);
+ return GetControllerFromNpadIdType(npad_id);
+}
+
+const Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromHandle(
+ const Core::HID::VibrationDeviceHandle& device_handle) const {
+ const auto npad_id = static_cast<Core::HID::NpadIdType>(device_handle.npad_id);
+ return GetControllerFromNpadIdType(npad_id);
+}
+
+Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromNpadIdType(
+ Core::HID::NpadIdType npad_id) {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ npad_id = Core::HID::NpadIdType::Player1;
+ }
+ const auto npad_index = Core::HID::NpadIdTypeToIndex(npad_id);
+ return controller_data[npad_index];
+}
+
+const Controller_NPad::NpadControllerData& Controller_NPad::GetControllerFromNpadIdType(
+ Core::HID::NpadIdType npad_id) const {
+ if (!IsNpadIdValid(npad_id)) {
+ LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id);
+ npad_id = Core::HID::NpadIdType::Player1;
+ }
+ const auto npad_index = Core::HID::NpadIdTypeToIndex(npad_id);
+ return controller_data[npad_index];
+}
+
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 9ee146caf..63281cb35 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -11,9 +11,14 @@
#include "common/bit_field.h"
#include "common/common_types.h"
#include "common/quaternion.h"
-#include "common/settings.h"
-#include "core/frontend/input.h"
+#include "core/hid/hid_types.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedController;
+enum class ControllerTriggerType;
+} // namespace Core::HID
namespace Kernel {
class KEvent;
@@ -26,12 +31,9 @@ class ServiceContext;
namespace Service::HID {
-constexpr u32 NPAD_HANDHELD = 32;
-constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this?
-
class Controller_NPad final : public ControllerBase {
public:
- explicit Controller_NPad(Core::System& system_,
+ explicit Controller_NPad(Core::HID::HIDCore& hid_core_,
KernelHelpers::ServiceContext& service_context_);
~Controller_NPad() override;
@@ -48,60 +50,39 @@ public:
void OnMotionUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
- enum class NPadControllerType {
- None,
- ProController,
- Handheld,
- JoyDual,
- JoyLeft,
- JoyRight,
- GameCube,
- Pokeball,
- };
-
- enum class NpadType : u8 {
- ProController = 3,
- Handheld = 4,
- JoyconDual = 5,
- JoyconLeft = 6,
- JoyconRight = 7,
- GameCube = 8,
- Pokeball = 9,
- MaxNpadType = 10,
- };
-
- enum class DeviceIndex : u8 {
- Left = 0,
- Right = 1,
- None = 2,
- MaxDeviceIndex = 3,
- };
-
+ // This is nn::hid::GyroscopeZeroDriftMode
enum class GyroscopeZeroDriftMode : u32 {
Loose = 0,
Standard = 1,
Tight = 2,
};
- enum class NpadHoldType : u64 {
+ // This is nn::hid::NpadJoyHoldType
+ enum class NpadJoyHoldType : u64 {
Vertical = 0,
Horizontal = 1,
};
- enum class NpadAssignments : u32 {
+ // This is nn::hid::NpadJoyAssignmentMode
+ enum class NpadJoyAssignmentMode : u32 {
Dual = 0,
Single = 1,
};
+ // This is nn::hid::NpadJoyDeviceType
+ enum class NpadJoyDeviceType : s64 {
+ Left = 0,
+ Right = 1,
+ };
+
+ // This is nn::hid::NpadHandheldActivationMode
enum class NpadHandheldActivationMode : u64 {
Dual = 0,
Single = 1,
None = 2,
};
+ // This is nn::hid::NpadCommunicationMode
enum class NpadCommunicationMode : u64 {
Mode_5ms = 0,
Mode_10ms = 1,
@@ -109,74 +90,22 @@ public:
Default = 3,
};
- struct DeviceHandle {
- NpadType npad_type;
- u8 npad_id;
- DeviceIndex device_index;
- INSERT_PADDING_BYTES_NOINIT(1);
+ static constexpr Core::HID::VibrationValue DEFAULT_VIBRATION_VALUE{
+ .low_amplitude = 0.0f,
+ .low_frequency = 160.0f,
+ .high_amplitude = 0.0f,
+ .high_frequency = 320.0f,
};
- static_assert(sizeof(DeviceHandle) == 4, "DeviceHandle is an invalid size");
- struct NpadStyleSet {
- union {
- u32_le raw{};
-
- BitField<0, 1, u32> fullkey;
- BitField<1, 1, u32> handheld;
- BitField<2, 1, u32> joycon_dual;
- BitField<3, 1, u32> joycon_left;
- BitField<4, 1, u32> joycon_right;
- BitField<5, 1, u32> gamecube;
- BitField<6, 1, u32> palma;
- BitField<7, 1, u32> lark;
- BitField<8, 1, u32> handheld_lark;
- BitField<9, 1, u32> lucia;
- BitField<29, 1, u32> system_ext;
- BitField<30, 1, u32> system;
- };
- };
- static_assert(sizeof(NpadStyleSet) == 4, "NpadStyleSet is an invalid size");
-
- struct VibrationValue {
- f32 amp_low;
- f32 freq_low;
- f32 amp_high;
- f32 freq_high;
- };
- static_assert(sizeof(VibrationValue) == 0x10, "Vibration is an invalid size");
-
- static constexpr VibrationValue DEFAULT_VIBRATION_VALUE{
- .amp_low = 0.0f,
- .freq_low = 160.0f,
- .amp_high = 0.0f,
- .freq_high = 320.0f,
- };
-
- struct LedPattern {
- explicit LedPattern(u64 light1, u64 light2, u64 light3, u64 light4) {
- position1.Assign(light1);
- position2.Assign(light2);
- position3.Assign(light3);
- position4.Assign(light4);
- }
- union {
- u64 raw{};
- BitField<0, 1, u64> position1;
- BitField<1, 1, u64> position2;
- BitField<2, 1, u64> position3;
- BitField<3, 1, u64> position4;
- };
- };
-
- void SetSupportedStyleSet(NpadStyleSet style_set);
- NpadStyleSet GetSupportedStyleSet() const;
+ void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
+ Core::HID::NpadStyleTag GetSupportedStyleSet() const;
void SetSupportedNpadIdTypes(u8* data, std::size_t length);
void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
std::size_t GetSupportedNpadIdTypesSize() const;
- void SetHoldType(NpadHoldType joy_hold_type);
- NpadHoldType GetHoldType() const;
+ void SetHoldType(NpadJoyHoldType joy_hold_type);
+ NpadJoyHoldType GetHoldType() const;
void SetNpadHandheldActivationMode(NpadHandheldActivationMode activation_mode);
NpadHandheldActivationMode GetNpadHandheldActivationMode() const;
@@ -184,162 +113,107 @@ public:
void SetNpadCommunicationMode(NpadCommunicationMode communication_mode_);
NpadCommunicationMode GetNpadCommunicationMode() const;
- void SetNpadMode(u32 npad_id, NpadAssignments assignment_mode);
+ void SetNpadMode(Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type,
+ NpadJoyAssignmentMode assignment_mode);
- bool VibrateControllerAtIndex(std::size_t npad_index, std::size_t device_index,
- const VibrationValue& vibration_value);
+ bool VibrateControllerAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index,
+ const Core::HID::VibrationValue& vibration_value);
- void VibrateController(const DeviceHandle& vibration_device_handle,
- const VibrationValue& vibration_value);
+ void VibrateController(const Core::HID::VibrationDeviceHandle& vibration_device_handle,
+ const Core::HID::VibrationValue& vibration_value);
- void VibrateControllers(const std::vector<DeviceHandle>& vibration_device_handles,
- const std::vector<VibrationValue>& vibration_values);
+ void VibrateControllers(
+ const std::vector<Core::HID::VibrationDeviceHandle>& vibration_device_handles,
+ const std::vector<Core::HID::VibrationValue>& vibration_values);
- VibrationValue GetLastVibration(const DeviceHandle& vibration_device_handle) const;
+ Core::HID::VibrationValue GetLastVibration(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle) const;
- void InitializeVibrationDevice(const DeviceHandle& vibration_device_handle);
+ void InitializeVibrationDevice(const Core::HID::VibrationDeviceHandle& vibration_device_handle);
- void InitializeVibrationDeviceAtIndex(std::size_t npad_index, std::size_t device_index);
+ void InitializeVibrationDeviceAtIndex(Core::HID::NpadIdType npad_id, std::size_t device_index);
void SetPermitVibrationSession(bool permit_vibration_session);
- bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const;
+ bool IsVibrationDeviceMounted(
+ const Core::HID::VibrationDeviceHandle& vibration_device_handle) const;
- Kernel::KReadableEvent& GetStyleSetChangedEvent(u32 npad_id);
- void SignalStyleSetChangedEvent(u32 npad_id) const;
+ Kernel::KReadableEvent& GetStyleSetChangedEvent(Core::HID::NpadIdType npad_id);
+ void SignalStyleSetChangedEvent(Core::HID::NpadIdType npad_id) const;
// Adds a new controller at an index.
- void AddNewControllerAt(NPadControllerType controller, std::size_t npad_index);
+ void AddNewControllerAt(Core::HID::NpadStyleIndex controller, Core::HID::NpadIdType npad_id);
// Adds a new controller at an index with connection status.
- void UpdateControllerAt(NPadControllerType controller, std::size_t npad_index, bool connected);
-
- void DisconnectNpad(u32 npad_id);
- void DisconnectNpadAtIndex(std::size_t index);
-
- void SetGyroscopeZeroDriftMode(GyroscopeZeroDriftMode drift_mode);
- GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode() const;
- bool IsSixAxisSensorAtRest() const;
- void SetSixAxisEnabled(bool six_axis_status);
- void SetSixAxisFusionParameters(f32 parameter1, f32 parameter2);
- std::pair<f32, f32> GetSixAxisFusionParameters();
- void ResetSixAxisFusionParameters();
- LedPattern GetLedPattern(u32 npad_id);
- bool IsUnintendedHomeButtonInputProtectionEnabled(u32 npad_id) const;
- void SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled, u32 npad_id);
+ void UpdateControllerAt(Core::HID::NpadStyleIndex controller, Core::HID::NpadIdType npad_id,
+ bool connected);
+
+ void DisconnectNpad(Core::HID::NpadIdType npad_id);
+
+ void SetGyroscopeZeroDriftMode(Core::HID::SixAxisSensorHandle sixaxis_handle,
+ GyroscopeZeroDriftMode drift_mode);
+ GyroscopeZeroDriftMode GetGyroscopeZeroDriftMode(
+ Core::HID::SixAxisSensorHandle sixaxis_handle) const;
+ bool IsSixAxisSensorAtRest(Core::HID::SixAxisSensorHandle sixaxis_handle) const;
+ void SetSixAxisEnabled(Core::HID::SixAxisSensorHandle sixaxis_handle, bool sixaxis_status);
+ void SetSixAxisFusionEnabled(Core::HID::SixAxisSensorHandle sixaxis_handle,
+ bool sixaxis_fusion_status);
+ void SetSixAxisFusionParameters(
+ Core::HID::SixAxisSensorHandle sixaxis_handle,
+ Core::HID::SixAxisSensorFusionParameters sixaxis_fusion_parameters);
+ Core::HID::SixAxisSensorFusionParameters GetSixAxisFusionParameters(
+ Core::HID::SixAxisSensorHandle sixaxis_handle);
+ void ResetSixAxisFusionParameters(Core::HID::SixAxisSensorHandle sixaxis_handle);
+ Core::HID::LedPattern GetLedPattern(Core::HID::NpadIdType npad_id);
+ bool IsUnintendedHomeButtonInputProtectionEnabled(Core::HID::NpadIdType npad_id) const;
+ void SetUnintendedHomeButtonInputProtectionEnabled(bool is_protection_enabled,
+ Core::HID::NpadIdType npad_id);
void SetAnalogStickUseCenterClamp(bool use_center_clamp);
void ClearAllConnectedControllers();
void DisconnectAllConnectedControllers();
void ConnectAllDisconnectedControllers();
void ClearAllControllers();
- void MergeSingleJoyAsDualJoy(u32 npad_id_1, u32 npad_id_2);
+ void MergeSingleJoyAsDualJoy(Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2);
void StartLRAssignmentMode();
void StopLRAssignmentMode();
- bool SwapNpadAssignment(u32 npad_id_1, u32 npad_id_2);
+ bool SwapNpadAssignment(Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2);
// Logical OR for all buttons presses on all controllers
// Specifically for cheat engine and other features.
- u32 GetAndResetPressState();
+ Core::HID::NpadButton GetAndResetPressState();
- static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::ControllerType type);
- static Settings::ControllerType MapNPadToSettingsType(Controller_NPad::NPadControllerType type);
- static std::size_t NPadIdToIndex(u32 npad_id);
- static u32 IndexToNPad(std::size_t index);
- static bool IsNpadIdValid(u32 npad_id);
- static bool IsDeviceHandleValid(const DeviceHandle& device_handle);
+ static bool IsNpadIdValid(Core::HID::NpadIdType npad_id);
+ static bool IsDeviceHandleValid(const Core::HID::SixAxisSensorHandle& device_handle);
+ static bool IsDeviceHandleValid(const Core::HID::VibrationDeviceHandle& device_handle);
private:
- struct CommonHeader {
- s64_le timestamp;
- s64_le total_entry_count;
- s64_le last_entry_index;
- s64_le entry_count;
- };
- static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
-
- enum class ColorAttributes : u32_le {
+ // This is nn::hid::detail::ColorAttribute
+ enum class ColorAttribute : u32 {
Ok = 0,
ReadError = 1,
NoController = 2,
};
- static_assert(sizeof(ColorAttributes) == 4, "ColorAttributes is an invalid size");
+ static_assert(sizeof(ColorAttribute) == 4, "ColorAttribute is an invalid size");
- struct ControllerColor {
- u32_le body;
- u32_le button;
+ // This is nn::hid::detail::NpadFullKeyColorState
+ struct NpadFullKeyColorState {
+ ColorAttribute attribute;
+ Core::HID::NpadControllerColor fullkey;
};
- static_assert(sizeof(ControllerColor) == 8, "ControllerColor is an invalid size");
+ static_assert(sizeof(NpadFullKeyColorState) == 0xC, "NpadFullKeyColorState is an invalid size");
- struct FullKeyColor {
- ColorAttributes attribute;
- ControllerColor fullkey;
+ // This is nn::hid::detail::NpadJoyColorState
+ struct NpadJoyColorState {
+ ColorAttribute attribute;
+ Core::HID::NpadControllerColor left;
+ Core::HID::NpadControllerColor right;
};
- static_assert(sizeof(FullKeyColor) == 0xC, "FullKeyColor is an invalid size");
+ static_assert(sizeof(NpadJoyColorState) == 0x14, "NpadJoyColorState is an invalid size");
- struct JoyconColor {
- ColorAttributes attribute;
- ControllerColor left;
- ControllerColor right;
- };
- static_assert(sizeof(JoyconColor) == 0x14, "JoyconColor is an invalid size");
-
- struct ControllerPadState {
- union {
- u64_le raw{};
- // Button states
- BitField<0, 1, u64> a;
- BitField<1, 1, u64> b;
- BitField<2, 1, u64> x;
- BitField<3, 1, u64> y;
- BitField<4, 1, u64> l_stick;
- BitField<5, 1, u64> r_stick;
- BitField<6, 1, u64> l;
- BitField<7, 1, u64> r;
- BitField<8, 1, u64> zl;
- BitField<9, 1, u64> zr;
- BitField<10, 1, u64> plus;
- BitField<11, 1, u64> minus;
-
- // D-Pad
- BitField<12, 1, u64> d_left;
- BitField<13, 1, u64> d_up;
- BitField<14, 1, u64> d_right;
- BitField<15, 1, u64> d_down;
-
- // Left JoyStick
- BitField<16, 1, u64> l_stick_left;
- BitField<17, 1, u64> l_stick_up;
- BitField<18, 1, u64> l_stick_right;
- BitField<19, 1, u64> l_stick_down;
-
- // Right JoyStick
- BitField<20, 1, u64> r_stick_left;
- BitField<21, 1, u64> r_stick_up;
- BitField<22, 1, u64> r_stick_right;
- BitField<23, 1, u64> r_stick_down;
-
- // Not always active?
- BitField<24, 1, u64> left_sl;
- BitField<25, 1, u64> left_sr;
-
- BitField<26, 1, u64> right_sl;
- BitField<27, 1, u64> right_sr;
-
- BitField<28, 1, u64> palma;
- BitField<30, 1, u64> handheld_left_b;
- };
- };
- static_assert(sizeof(ControllerPadState) == 8, "ControllerPadState is an invalid size");
-
- struct AnalogPosition {
- s32_le x;
- s32_le y;
- };
- static_assert(sizeof(AnalogPosition) == 8, "AnalogPosition is an invalid size");
-
- struct ConnectionState {
+ // This is nn::hid::NpadAttribute
+ struct NpadAttribute {
union {
- u32_le raw{};
+ u32 raw{};
BitField<0, 1, u32> is_connected;
BitField<1, 1, u32> is_wired;
BitField<2, 1, u32> is_left_connected;
@@ -348,79 +222,60 @@ private:
BitField<5, 1, u32> is_right_wired;
};
};
- static_assert(sizeof(ConnectionState) == 4, "ConnectionState is an invalid size");
-
- struct ControllerPad {
- ControllerPadState pad_states;
- AnalogPosition l_stick;
- AnalogPosition r_stick;
- };
- static_assert(sizeof(ControllerPad) == 0x18, "ControllerPad is an invalid size");
-
- struct GenericStates {
- s64_le timestamp;
- s64_le timestamp2;
- ControllerPad pad;
- ConnectionState connection_status;
- };
- static_assert(sizeof(GenericStates) == 0x30, "NPadGenericStates is an invalid size");
-
- struct NPadGeneric {
- CommonHeader common;
- std::array<GenericStates, 17> npad;
+ static_assert(sizeof(NpadAttribute) == 4, "NpadAttribute is an invalid size");
+
+ // This is nn::hid::NpadFullKeyState
+ // This is nn::hid::NpadHandheldState
+ // This is nn::hid::NpadJoyDualState
+ // This is nn::hid::NpadJoyLeftState
+ // This is nn::hid::NpadJoyRightState
+ // This is nn::hid::NpadPalmaState
+ // This is nn::hid::NpadSystemExtState
+ struct NPadGenericState {
+ s64_le sampling_number;
+ Core::HID::NpadButtonState npad_buttons;
+ Core::HID::AnalogStickState l_stick;
+ Core::HID::AnalogStickState r_stick;
+ NpadAttribute connection_status;
+ INSERT_PADDING_BYTES(4); // Reserved
};
- static_assert(sizeof(NPadGeneric) == 0x350, "NPadGeneric is an invalid size");
+ static_assert(sizeof(NPadGenericState) == 0x28, "NPadGenericState is an invalid size");
- struct SixAxisAttributes {
+ // This is nn::hid::SixAxisSensorAttribute
+ struct SixAxisSensorAttribute {
union {
- u32_le raw{};
+ u32 raw{};
BitField<0, 1, u32> is_connected;
BitField<1, 1, u32> is_interpolated;
};
};
- static_assert(sizeof(SixAxisAttributes) == 4, "SixAxisAttributes is an invalid size");
+ static_assert(sizeof(SixAxisSensorAttribute) == 4, "SixAxisSensorAttribute is an invalid size");
- struct SixAxisStates {
- s64_le timestamp{};
- INSERT_PADDING_WORDS(2);
- s64_le timestamp2{};
+ // This is nn::hid::SixAxisSensorState
+ struct SixAxisSensorState {
+ s64 delta_time{};
+ s64 sampling_number{};
Common::Vec3f accel{};
Common::Vec3f gyro{};
Common::Vec3f rotation{};
std::array<Common::Vec3f, 3> orientation{};
- SixAxisAttributes attribute;
+ SixAxisSensorAttribute attribute;
INSERT_PADDING_BYTES(4); // Reserved
};
- static_assert(sizeof(SixAxisStates) == 0x68, "SixAxisStates is an invalid size");
-
- struct SixAxisGeneric {
- CommonHeader common{};
- std::array<SixAxisStates, 17> sixaxis{};
- };
- static_assert(sizeof(SixAxisGeneric) == 0x708, "SixAxisGeneric is an invalid size");
+ static_assert(sizeof(SixAxisSensorState) == 0x60, "SixAxisSensorState is an invalid size");
- struct TriggerState {
- s64_le timestamp{};
- s64_le timestamp2{};
- s32_le l_analog{};
- s32_le r_analog{};
+ // This is nn::hid::server::NpadGcTriggerState
+ struct NpadGcTriggerState {
+ s64 sampling_number{};
+ s32 l_analog{};
+ s32 r_analog{};
};
- static_assert(sizeof(TriggerState) == 0x18, "TriggerState is an invalid size");
-
- struct TriggerGeneric {
- INSERT_PADDING_BYTES(0x4);
- s64_le timestamp;
- INSERT_PADDING_BYTES(0x4);
- s64_le total_entry_count;
- s64_le last_entry_index;
- s64_le entry_count;
- std::array<TriggerState, 17> trigger{};
- };
- static_assert(sizeof(TriggerGeneric) == 0x1C8, "TriggerGeneric is an invalid size");
+ static_assert(sizeof(NpadGcTriggerState) == 0x10, "NpadGcTriggerState is an invalid size");
+ // This is nn::hid::NpadSystemProperties
struct NPadSystemProperties {
union {
- s64_le raw{};
+ s64 raw{};
BitField<0, 1, s64> is_charging_joy_dual;
BitField<1, 1, s64> is_charging_joy_left;
BitField<2, 1, s64> is_charging_joy_right;
@@ -438,17 +293,20 @@ private:
};
static_assert(sizeof(NPadSystemProperties) == 0x8, "NPadSystemProperties is an invalid size");
- struct NPadButtonProperties {
+ // This is nn::hid::NpadSystemButtonProperties
+ struct NpadSystemButtonProperties {
union {
- s32_le raw{};
+ s32 raw{};
BitField<0, 1, s32> is_home_button_protection_enabled;
};
};
- static_assert(sizeof(NPadButtonProperties) == 0x4, "NPadButtonProperties is an invalid size");
+ static_assert(sizeof(NpadSystemButtonProperties) == 0x4,
+ "NPadButtonProperties is an invalid size");
- struct NPadDevice {
+ // This is nn::hid::system::DeviceType
+ struct DeviceType {
union {
- u32_le raw{};
+ u32 raw{};
BitField<0, 1, s32> fullkey;
BitField<1, 1, s32> debug_pad;
BitField<2, 1, s32> handheld_left;
@@ -465,26 +323,29 @@ private:
BitField<13, 1, s32> handheld_lark_nes_left;
BitField<14, 1, s32> handheld_lark_nes_right;
BitField<15, 1, s32> lucia;
+ BitField<16, 1, s32> lagon;
+ BitField<17, 1, s32> lager;
BitField<31, 1, s32> system;
};
};
- struct MotionDevice {
- Common::Vec3f accel;
- Common::Vec3f gyro;
- Common::Vec3f rotation;
- std::array<Common::Vec3f, 3> orientation;
- Common::Quaternion<f32> quaternion;
- };
-
- struct NfcXcdHandle {
- INSERT_PADDING_BYTES(0x60);
+ // This is nn::hid::detail::NfcXcdDeviceHandleStateImpl
+ struct NfcXcdDeviceHandleStateImpl {
+ u64 handle;
+ bool is_available;
+ bool is_activated;
+ INSERT_PADDING_BYTES(0x6); // Reserved
+ u64 sampling_number;
};
+ static_assert(sizeof(NfcXcdDeviceHandleStateImpl) == 0x18,
+ "NfcXcdDeviceHandleStateImpl is an invalid size");
+ // This is nn::hid::system::AppletFooterUiAttributesSet
struct AppletFooterUiAttributes {
INSERT_PADDING_BYTES(0x4);
};
+ // This is nn::hid::system::AppletFooterUiType
enum class AppletFooterUiType : u8 {
None = 0,
HandheldNone = 1,
@@ -510,95 +371,153 @@ private:
Lagon = 21,
};
- struct NPadEntry {
- NpadStyleSet style_set;
- NpadAssignments assignment_mode;
- FullKeyColor fullkey_color;
- JoyconColor joycon_color;
-
- NPadGeneric fullkey_states;
- NPadGeneric handheld_states;
- NPadGeneric joy_dual_states;
- NPadGeneric joy_left_states;
- NPadGeneric joy_right_states;
- NPadGeneric palma_states;
- NPadGeneric system_ext_states;
- SixAxisGeneric sixaxis_fullkey;
- SixAxisGeneric sixaxis_handheld;
- SixAxisGeneric sixaxis_dual_left;
- SixAxisGeneric sixaxis_dual_right;
- SixAxisGeneric sixaxis_left;
- SixAxisGeneric sixaxis_right;
- NPadDevice device_type;
- INSERT_PADDING_BYTES(0x4); // reserved
+ struct AppletFooterUi {
+ AppletFooterUiAttributes attributes;
+ AppletFooterUiType type;
+ INSERT_PADDING_BYTES(0x5B); // Reserved
+ };
+ static_assert(sizeof(AppletFooterUi) == 0x60, "AppletFooterUi is an invalid size");
+
+ // This is nn::hid::NpadLarkType
+ enum class NpadLarkType : u32 {
+ Invalid,
+ H1,
+ H2,
+ NL,
+ NR,
+ };
+
+ // This is nn::hid::NpadLuciaType
+ enum class NpadLuciaType : u32 {
+ Invalid,
+ J,
+ E,
+ U,
+ };
+
+ // This is nn::hid::NpadLagonType
+ enum class NpadLagonType : u32 {
+ Invalid,
+ };
+
+ // This is nn::hid::NpadLagerType
+ enum class NpadLagerType : u32 {
+ Invalid,
+ J,
+ E,
+ U,
+ };
+
+ // This is nn::hid::detail::NpadInternalState
+ struct NpadInternalState {
+ Core::HID::NpadStyleTag style_tag;
+ NpadJoyAssignmentMode assignment_mode;
+ NpadFullKeyColorState fullkey_color;
+ NpadJoyColorState joycon_color;
+ Lifo<NPadGenericState, hid_entry_count> fullkey_lifo;
+ Lifo<NPadGenericState, hid_entry_count> handheld_lifo;
+ Lifo<NPadGenericState, hid_entry_count> joy_dual_lifo;
+ Lifo<NPadGenericState, hid_entry_count> joy_left_lifo;
+ Lifo<NPadGenericState, hid_entry_count> joy_right_lifo;
+ Lifo<NPadGenericState, hid_entry_count> palma_lifo;
+ Lifo<NPadGenericState, hid_entry_count> system_ext_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_fullkey_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_handheld_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_dual_left_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_dual_right_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_left_lifo;
+ Lifo<SixAxisSensorState, hid_entry_count> sixaxis_right_lifo;
+ DeviceType device_type;
+ INSERT_PADDING_BYTES(0x4); // Reserved
NPadSystemProperties system_properties;
- NPadButtonProperties button_properties;
- u32 battery_level_dual;
- u32 battery_level_left;
- u32 battery_level_right;
- AppletFooterUiAttributes footer_attributes;
- AppletFooterUiType footer_type;
- // nfc_states needs to be checked switchbrew does not match with HW
- NfcXcdHandle nfc_states;
- INSERT_PADDING_BYTES(0x8); // Mutex
- TriggerGeneric gc_trigger_states;
- INSERT_PADDING_BYTES(0xc1f);
- };
- static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size");
-
- struct ControllerHolder {
- NPadControllerType type;
- bool is_connected;
- };
-
- void InitNewlyAddedController(std::size_t controller_idx);
- bool IsControllerSupported(NPadControllerType controller) const;
- void RequestPadStateUpdate(u32 npad_id);
-
- std::atomic<u32> press_state{};
-
- NpadStyleSet style{};
- std::array<NPadEntry, 10> shared_memory_entries{};
- using ButtonArray = std::array<
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>,
- 10>;
- using StickArray = std::array<
- std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
- 10>;
- using VibrationArray = std::array<std::array<std::unique_ptr<Input::VibrationDevice>,
- Settings::NativeVibration::NUM_VIBRATIONS_HID>,
- 10>;
- using MotionArray = std::array<
- std::array<std::unique_ptr<Input::MotionDevice>, Settings::NativeMotion::NUM_MOTIONS_HID>,
- 10>;
-
+ NpadSystemButtonProperties button_properties;
+ Core::HID::NpadBatteryLevel battery_level_dual;
+ Core::HID::NpadBatteryLevel battery_level_left;
+ Core::HID::NpadBatteryLevel battery_level_right;
+ union {
+ Lifo<NfcXcdDeviceHandleStateImpl, 0x2> nfc_xcd_device_lifo{};
+ AppletFooterUi applet_footer;
+ };
+ INSERT_PADDING_BYTES(0x20); // Unknown
+ Lifo<NpadGcTriggerState, hid_entry_count> gc_trigger_lifo;
+ NpadLarkType lark_type_l_and_main;
+ NpadLarkType lark_type_r;
+ NpadLuciaType lucia_type;
+ NpadLagonType lagon_type;
+ NpadLagerType lager_type;
+ // FW 13.x Investigate there is some sort of bitflag related to joycons
+ INSERT_PADDING_BYTES(0x4);
+ INSERT_PADDING_BYTES(0xc08); // Unknown
+ };
+ static_assert(sizeof(NpadInternalState) == 0x5000, "NpadInternalState is an invalid size");
+
+ struct VibrationData {
+ bool device_mounted{};
+ Core::HID::VibrationValue latest_vibration_value{};
+ std::chrono::steady_clock::time_point last_vibration_timepoint{};
+ };
+
+ struct NpadControllerData {
+ Core::HID::EmulatedController* device;
+ Kernel::KEvent* styleset_changed_event{};
+ NpadInternalState shared_memory_entry{};
+
+ std::array<VibrationData, 2> vibration{};
+ bool unintended_home_button_input_protection{};
+ bool is_connected{};
+
+ // Dual joycons can have only one side connected
+ bool is_dual_left_connected{true};
+ bool is_dual_right_connected{true};
+
+ // Motion parameters
+ bool sixaxis_at_rest{true};
+ bool sixaxis_sensor_enabled{true};
+ bool sixaxis_fusion_enabled{false};
+ Core::HID::SixAxisSensorFusionParameters sixaxis_fusion{};
+ GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
+
+ // Current pad state
+ NPadGenericState npad_pad_state{};
+ NPadGenericState npad_libnx_state{};
+ NpadGcTriggerState npad_trigger_state{};
+ SixAxisSensorState sixaxis_fullkey_state{};
+ SixAxisSensorState sixaxis_handheld_state{};
+ SixAxisSensorState sixaxis_dual_left_state{};
+ SixAxisSensorState sixaxis_dual_right_state{};
+ SixAxisSensorState sixaxis_left_lifo_state{};
+ SixAxisSensorState sixaxis_right_lifo_state{};
+ int callback_key;
+ };
+
+ void ControllerUpdate(Core::HID::ControllerTriggerType type, std::size_t controller_idx);
+ void InitNewlyAddedController(Core::HID::NpadIdType npad_id);
+ bool IsControllerSupported(Core::HID::NpadStyleIndex controller) const;
+ void RequestPadStateUpdate(Core::HID::NpadIdType npad_id);
+ void WriteEmptyEntry(NpadInternalState& npad);
+
+ NpadControllerData& GetControllerFromHandle(
+ const Core::HID::SixAxisSensorHandle& device_handle);
+ const NpadControllerData& GetControllerFromHandle(
+ const Core::HID::SixAxisSensorHandle& device_handle) const;
+ NpadControllerData& GetControllerFromHandle(
+ const Core::HID::VibrationDeviceHandle& device_handle);
+ const NpadControllerData& GetControllerFromHandle(
+ const Core::HID::VibrationDeviceHandle& device_handle) const;
+ NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id);
+ const NpadControllerData& GetControllerFromNpadIdType(Core::HID::NpadIdType npad_id) const;
+
+ std::atomic<u64> press_state{};
+
+ std::array<NpadControllerData, 10> controller_data{};
KernelHelpers::ServiceContext& service_context;
std::mutex mutex;
- ButtonArray buttons;
- StickArray sticks;
- VibrationArray vibrations;
- MotionArray motions;
- std::vector<u32> supported_npad_id_types{};
- NpadHoldType hold_type{NpadHoldType::Vertical};
+ std::vector<Core::HID::NpadIdType> supported_npad_id_types{};
+ NpadJoyHoldType hold_type{NpadJoyHoldType::Vertical};
NpadHandheldActivationMode handheld_activation_mode{NpadHandheldActivationMode::Dual};
NpadCommunicationMode communication_mode{NpadCommunicationMode::Default};
- // Each controller should have their own styleset changed event
- std::array<Kernel::KEvent*, 10> styleset_changed_events{};
- std::array<std::array<std::chrono::steady_clock::time_point, 2>, 10>
- last_vibration_timepoints{};
- std::array<std::array<VibrationValue, 2>, 10> latest_vibration_values{};
bool permit_vibration_session_enabled{false};
- std::array<std::array<bool, 2>, 10> vibration_devices_mounted{};
- std::array<ControllerHolder, 10> connected_controllers{};
- std::array<bool, 10> unintended_home_button_input_protection{};
bool analog_stick_use_center_clamp{};
- GyroscopeZeroDriftMode gyroscope_zero_drift_mode{GyroscopeZeroDriftMode::Standard};
- bool sixaxis_sensors_enabled{true};
- f32 sixaxis_fusion_parameter1{};
- f32 sixaxis_fusion_parameter2{};
- bool sixaxis_at_rest{true};
- std::array<ControllerPad, 10> npad_pad_states{};
- std::array<TriggerState, 10> npad_trigger_states{};
bool is_in_lr_assignment_mode{false};
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/stubbed.cpp b/src/core/hle/service/hid/controllers/stubbed.cpp
index 772c20453..b7d7a5756 100644
--- a/src/core/hle/service/hid/controllers/stubbed.cpp
+++ b/src/core/hle/service/hid/controllers/stubbed.cpp
@@ -5,11 +5,12 @@
#include <cstring>
#include "common/common_types.h"
#include "core/core_timing.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/stubbed.h"
namespace Service::HID {
-Controller_Stubbed::Controller_Stubbed(Core::System& system_) : ControllerBase{system_} {}
+Controller_Stubbed::Controller_Stubbed(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {}
Controller_Stubbed::~Controller_Stubbed() = default;
void Controller_Stubbed::OnInit() {}
@@ -31,10 +32,9 @@ void Controller_Stubbed::OnUpdate(const Core::Timing::CoreTiming& core_timing, u
std::memcpy(data + common_offset, &header, sizeof(CommonHeader));
}
-void Controller_Stubbed::OnLoadInputDevices() {}
-
void Controller_Stubbed::SetCommonHeaderOffset(std::size_t off) {
common_offset = off;
smart_update = true;
}
+
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/stubbed.h b/src/core/hle/service/hid/controllers/stubbed.h
index 21092af0d..0044a4efa 100644
--- a/src/core/hle/service/hid/controllers/stubbed.h
+++ b/src/core/hle/service/hid/controllers/stubbed.h
@@ -10,7 +10,7 @@
namespace Service::HID {
class Controller_Stubbed final : public ControllerBase {
public:
- explicit Controller_Stubbed(Core::System& system_);
+ explicit Controller_Stubbed(Core::HID::HIDCore& hid_core_);
~Controller_Stubbed() override;
// Called when the controller is initialized
@@ -22,12 +22,17 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
void SetCommonHeaderOffset(std::size_t off);
private:
+ struct CommonHeader {
+ s64 timestamp;
+ s64 total_entry_count;
+ s64 last_entry_index;
+ s64 entry_count;
+ };
+ static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
+
bool smart_update{};
std::size_t common_offset{};
};
diff --git a/src/core/hle/service/hid/controllers/touchscreen.cpp b/src/core/hle/service/hid/controllers/touchscreen.cpp
index 6ef17acc5..48978e5c6 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.cpp
+++ b/src/core/hle/service/hid/controllers/touchscreen.cpp
@@ -7,72 +7,82 @@
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/settings.h"
+#include "core/core.h"
#include "core/core_timing.h"
#include "core/frontend/emu_window.h"
-#include "core/frontend/input.h"
+#include "core/hid/emulated_console.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/touchscreen.h"
namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x400;
-Controller_Touchscreen::Controller_Touchscreen(Core::System& system_) : ControllerBase{system_} {}
+Controller_Touchscreen::Controller_Touchscreen(Core::HID::HIDCore& hid_core_)
+ : ControllerBase{hid_core_} {
+ console = hid_core.GetEmulatedConsole();
+}
+
Controller_Touchscreen::~Controller_Touchscreen() = default;
-void Controller_Touchscreen::OnInit() {
- for (std::size_t id = 0; id < MAX_FINGERS; ++id) {
- mouse_finger_id[id] = MAX_FINGERS;
- keyboard_finger_id[id] = MAX_FINGERS;
- udp_finger_id[id] = MAX_FINGERS;
- }
-}
+void Controller_Touchscreen::OnInit() {}
void Controller_Touchscreen::OnRelease() {}
void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- shared_memory.header.timestamp = core_timing.GetCPUTicks();
- shared_memory.header.total_entry_count = 17;
+ touch_screen_lifo.timestamp = core_timing.GetCPUTicks();
if (!IsControllerActivated()) {
- shared_memory.header.entry_count = 0;
- shared_memory.header.last_entry_index = 0;
+ touch_screen_lifo.buffer_count = 0;
+ touch_screen_lifo.buffer_tail = 0;
+ std::memcpy(data, &touch_screen_lifo, sizeof(touch_screen_lifo));
return;
}
- shared_memory.header.entry_count = 16;
- const auto& last_entry =
- shared_memory.shared_memory_entries[shared_memory.header.last_entry_index];
- shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
- auto& cur_entry = shared_memory.shared_memory_entries[shared_memory.header.last_entry_index];
+ const auto touch_status = console->GetTouch();
+ for (std::size_t id = 0; id < MAX_FINGERS; id++) {
+ const auto& current_touch = touch_status[id];
+ auto& finger = fingers[id];
+ finger.position = current_touch.position;
+ finger.id = current_touch.id;
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
+ if (finger.attribute.start_touch) {
+ finger.attribute.raw = 0;
+ continue;
+ }
- const Input::TouchStatus& mouse_status = touch_mouse_device->GetStatus();
- const Input::TouchStatus& udp_status = touch_udp_device->GetStatus();
- for (std::size_t id = 0; id < mouse_status.size(); ++id) {
- mouse_finger_id[id] = UpdateTouchInputEvent(mouse_status[id], mouse_finger_id[id]);
- udp_finger_id[id] = UpdateTouchInputEvent(udp_status[id], udp_finger_id[id]);
- }
+ if (finger.attribute.end_touch) {
+ finger.attribute.raw = 0;
+ finger.pressed = false;
+ continue;
+ }
+
+ if (!finger.pressed && current_touch.pressed) {
+ finger.attribute.start_touch.Assign(1);
+ finger.pressed = true;
+ continue;
+ }
- if (Settings::values.use_touch_from_button) {
- const Input::TouchStatus& keyboard_status = touch_btn_device->GetStatus();
- for (std::size_t id = 0; id < mouse_status.size(); ++id) {
- keyboard_finger_id[id] =
- UpdateTouchInputEvent(keyboard_status[id], keyboard_finger_id[id]);
+ if (finger.pressed && !current_touch.pressed) {
+ finger.attribute.raw = 0;
+ finger.attribute.end_touch.Assign(1);
}
}
- std::array<Finger, 16> active_fingers;
+ std::array<Core::HID::TouchFinger, MAX_FINGERS> active_fingers;
const auto end_iter = std::copy_if(fingers.begin(), fingers.end(), active_fingers.begin(),
[](const auto& finger) { return finger.pressed; });
const auto active_fingers_count =
static_cast<std::size_t>(std::distance(active_fingers.begin(), end_iter));
const u64 tick = core_timing.GetCPUTicks();
- cur_entry.entry_count = static_cast<s32_le>(active_fingers_count);
+ const auto& last_entry = touch_screen_lifo.ReadCurrentEntry().state;
+
+ next_state.sampling_number = last_entry.sampling_number + 1;
+ next_state.entry_count = static_cast<s32>(active_fingers_count);
+
for (std::size_t id = 0; id < MAX_FINGERS; ++id) {
- auto& touch_entry = cur_entry.states[id];
+ auto& touch_entry = next_state.states[id];
if (id < active_fingers_count) {
const auto& [active_x, active_y] = active_fingers[id].position;
touch_entry.position = {
@@ -97,66 +107,9 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
touch_entry.finger = 0;
}
}
- std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(TouchScreenSharedMemory));
-}
-
-void Controller_Touchscreen::OnLoadInputDevices() {
- touch_mouse_device = Input::CreateDevice<Input::TouchDevice>("engine:emu_window");
- touch_udp_device = Input::CreateDevice<Input::TouchDevice>("engine:cemuhookudp");
- touch_btn_device = Input::CreateDevice<Input::TouchDevice>("engine:touch_from_button");
-}
-
-std::optional<std::size_t> Controller_Touchscreen::GetUnusedFingerID() const {
- // Dont assign any touch input to a finger if disabled
- if (!Settings::values.touchscreen.enabled) {
- return std::nullopt;
- }
- std::size_t first_free_id = 0;
- while (first_free_id < MAX_FINGERS) {
- if (!fingers[first_free_id].pressed) {
- return first_free_id;
- } else {
- first_free_id++;
- }
- }
- return std::nullopt;
-}
-
-std::size_t Controller_Touchscreen::UpdateTouchInputEvent(
- const std::tuple<float, float, bool>& touch_input, std::size_t finger_id) {
- const auto& [x, y, pressed] = touch_input;
- if (finger_id > MAX_FINGERS) {
- LOG_ERROR(Service_HID, "Invalid finger id {}", finger_id);
- return MAX_FINGERS;
- }
- if (pressed) {
- Attributes attribute{};
- if (finger_id == MAX_FINGERS) {
- const auto first_free_id = GetUnusedFingerID();
- if (!first_free_id) {
- // Invalid finger id do nothing
- return MAX_FINGERS;
- }
- finger_id = first_free_id.value();
- fingers[finger_id].pressed = true;
- fingers[finger_id].id = static_cast<u32_le>(finger_id);
- attribute.start_touch.Assign(1);
- }
- fingers[finger_id].position = {x, y};
- fingers[finger_id].attribute = attribute;
- return finger_id;
- }
-
- if (finger_id != MAX_FINGERS) {
- if (!fingers[finger_id].attribute.end_touch) {
- fingers[finger_id].attribute.end_touch.Assign(1);
- fingers[finger_id].attribute.start_touch.Assign(0);
- return finger_id;
- }
- fingers[finger_id].pressed = false;
- }
- return MAX_FINGERS;
+ touch_screen_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &touch_screen_lifo, sizeof(touch_screen_lifo));
}
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/touchscreen.h b/src/core/hle/service/hid/controllers/touchscreen.h
index 8e9b40c0a..708dde4f0 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.h
+++ b/src/core/hle/service/hid/controllers/touchscreen.h
@@ -9,18 +9,25 @@
#include "common/common_types.h"
#include "common/point.h"
#include "common/swap.h"
-#include "core/frontend/input.h"
+#include "core/hid/hid_types.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
+
+namespace Core::HID {
+class EmulatedConsole;
+} // namespace Core::HID
namespace Service::HID {
class Controller_Touchscreen final : public ControllerBase {
public:
+ // This is nn::hid::TouchScreenModeForNx
enum class TouchScreenModeForNx : u8 {
UseSystemSetting,
Finger,
Heat2,
};
+ // This is nn::hid::TouchScreenConfigurationForNx
struct TouchScreenConfigurationForNx {
TouchScreenModeForNx mode;
INSERT_PADDING_BYTES_NOINIT(0x7);
@@ -29,7 +36,7 @@ public:
static_assert(sizeof(TouchScreenConfigurationForNx) == 0x17,
"TouchScreenConfigurationForNx is an invalid size");
- explicit Controller_Touchscreen(Core::System& system_);
+ explicit Controller_Touchscreen(Core::HID::HIDCore& hid_core_);
~Controller_Touchscreen() override;
// Called when the controller is initialized
@@ -41,73 +48,24 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
static constexpr std::size_t MAX_FINGERS = 16;
- // Returns an unused finger id, if there is no fingers available std::nullopt will be returned
- std::optional<std::size_t> GetUnusedFingerID() const;
-
- // If the touch is new it tries to assing a new finger id, if there is no fingers avaliable no
- // changes will be made. Updates the coordinates if the finger id it's already set. If the touch
- // ends delays the output by one frame to set the end_touch flag before finally freeing the
- // finger id
- std::size_t UpdateTouchInputEvent(const std::tuple<float, float, bool>& touch_input,
- std::size_t finger_id);
-
- struct Attributes {
- union {
- u32 raw{};
- BitField<0, 1, u32> start_touch;
- BitField<1, 1, u32> end_touch;
- };
- };
- static_assert(sizeof(Attributes) == 0x4, "Attributes is an invalid size");
-
- struct TouchState {
- u64_le delta_time;
- Attributes attribute;
- u32_le finger;
- Common::Point<u32_le> position;
- u32_le diameter_x;
- u32_le diameter_y;
- u32_le rotation_angle;
+ // This is nn::hid::TouchScreenState
+ struct TouchScreenState {
+ s64 sampling_number;
+ s32 entry_count;
+ INSERT_PADDING_BYTES(4); // Reserved
+ std::array<Core::HID::TouchState, MAX_FINGERS> states;
};
- static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
+ static_assert(sizeof(TouchScreenState) == 0x290, "TouchScreenState is an invalid size");
- struct TouchScreenEntry {
- s64_le sampling_number;
- s64_le sampling_number2;
- s32_le entry_count;
- std::array<TouchState, MAX_FINGERS> states;
- };
- static_assert(sizeof(TouchScreenEntry) == 0x298, "TouchScreenEntry is an invalid size");
-
- struct TouchScreenSharedMemory {
- CommonHeader header;
- std::array<TouchScreenEntry, 17> shared_memory_entries{};
- INSERT_PADDING_BYTES(0x3c8);
- };
- static_assert(sizeof(TouchScreenSharedMemory) == 0x3000,
- "TouchScreenSharedMemory is an invalid size");
-
- struct Finger {
- u64_le last_touch{};
- Common::Point<float> position;
- u32_le id{};
- bool pressed{};
- Attributes attribute;
- };
+ // This is nn::hid::detail::TouchScreenLifo
+ Lifo<TouchScreenState, hid_entry_count> touch_screen_lifo{};
+ static_assert(sizeof(touch_screen_lifo) == 0x2C38, "touch_screen_lifo is an invalid size");
+ TouchScreenState next_state{};
- TouchScreenSharedMemory shared_memory{};
- std::unique_ptr<Input::TouchDevice> touch_mouse_device;
- std::unique_ptr<Input::TouchDevice> touch_udp_device;
- std::unique_ptr<Input::TouchDevice> touch_btn_device;
- std::array<std::size_t, MAX_FINGERS> mouse_finger_id;
- std::array<std::size_t, MAX_FINGERS> keyboard_finger_id;
- std::array<std::size_t, MAX_FINGERS> udp_finger_id;
- std::array<Finger, MAX_FINGERS> fingers;
+ std::array<Core::HID::TouchFinger, MAX_FINGERS> fingers;
+ Core::HID::EmulatedConsole* console;
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/xpad.cpp b/src/core/hle/service/hid/controllers/xpad.cpp
index 41dc22cf9..e4da16466 100644
--- a/src/core/hle/service/hid/controllers/xpad.cpp
+++ b/src/core/hle/service/hid/controllers/xpad.cpp
@@ -5,12 +5,13 @@
#include <cstring>
#include "common/common_types.h"
#include "core/core_timing.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/hid/controllers/xpad.h"
namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C00;
-Controller_XPad::Controller_XPad(Core::System& system_) : ControllerBase{system_} {}
+Controller_XPad::Controller_XPad(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {}
Controller_XPad::~Controller_XPad() = default;
void Controller_XPad::OnInit() {}
@@ -19,28 +20,19 @@ void Controller_XPad::OnRelease() {}
void Controller_XPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
std::size_t size) {
- for (auto& xpad_entry : shared_memory.shared_memory_entries) {
- xpad_entry.header.timestamp = core_timing.GetCPUTicks();
- xpad_entry.header.total_entry_count = 17;
-
- if (!IsControllerActivated()) {
- xpad_entry.header.entry_count = 0;
- xpad_entry.header.last_entry_index = 0;
- return;
- }
- xpad_entry.header.entry_count = 16;
-
- const auto& last_entry = xpad_entry.pad_states[xpad_entry.header.last_entry_index];
- xpad_entry.header.last_entry_index = (xpad_entry.header.last_entry_index + 1) % 17;
- auto& cur_entry = xpad_entry.pad_states[xpad_entry.header.last_entry_index];
-
- cur_entry.sampling_number = last_entry.sampling_number + 1;
- cur_entry.sampling_number2 = cur_entry.sampling_number;
+ if (!IsControllerActivated()) {
+ basic_xpad_lifo.buffer_count = 0;
+ basic_xpad_lifo.buffer_tail = 0;
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &basic_xpad_lifo, sizeof(basic_xpad_lifo));
+ return;
}
+
+ const auto& last_entry = basic_xpad_lifo.ReadCurrentEntry().state;
+ next_state.sampling_number = last_entry.sampling_number + 1;
// TODO(ogniK): Update xpad states
- std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(SharedMemory));
+ basic_xpad_lifo.WriteNextEntry(next_state);
+ std::memcpy(data + SHARED_MEMORY_OFFSET, &basic_xpad_lifo, sizeof(basic_xpad_lifo));
}
-void Controller_XPad::OnLoadInputDevices() {}
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/xpad.h b/src/core/hle/service/hid/controllers/xpad.h
index f9ab5facf..ba8db8d9d 100644
--- a/src/core/hle/service/hid/controllers/xpad.h
+++ b/src/core/hle/service/hid/controllers/xpad.h
@@ -8,12 +8,14 @@
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/swap.h"
+#include "core/hid/hid_types.h"
#include "core/hle/service/hid/controllers/controller_base.h"
+#include "core/hle/service/hid/ring_lifo.h"
namespace Service::HID {
class Controller_XPad final : public ControllerBase {
public:
- explicit Controller_XPad(Core::System& system_);
+ explicit Controller_XPad(Core::HID::HIDCore& hid_core_);
~Controller_XPad() override;
// Called when the controller is initialized
@@ -25,13 +27,11 @@ public:
// When the controller is requesting an update for the shared memory
void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
- // Called when input devices should be loaded
- void OnLoadInputDevices() override;
-
private:
- struct Attributes {
+ // This is nn::hid::BasicXpadAttributeSet
+ struct BasicXpadAttributeSet {
union {
- u32_le raw{};
+ u32 raw{};
BitField<0, 1, u32> is_connected;
BitField<1, 1, u32> is_wired;
BitField<2, 1, u32> is_left_connected;
@@ -40,11 +40,12 @@ private:
BitField<5, 1, u32> is_right_wired;
};
};
- static_assert(sizeof(Attributes) == 4, "Attributes is an invalid size");
+ static_assert(sizeof(BasicXpadAttributeSet) == 4, "BasicXpadAttributeSet is an invalid size");
- struct Buttons {
+ // This is nn::hid::BasicXpadButtonSet
+ struct BasicXpadButtonSet {
union {
- u32_le raw{};
+ u32 raw{};
// Button states
BitField<0, 1, u32> a;
BitField<1, 1, u32> b;
@@ -88,35 +89,21 @@ private:
BitField<30, 1, u32> handheld_left_b;
};
};
- static_assert(sizeof(Buttons) == 4, "Buttons is an invalid size");
-
- struct AnalogStick {
- s32_le x;
- s32_le y;
- };
- static_assert(sizeof(AnalogStick) == 0x8, "AnalogStick is an invalid size");
-
- struct XPadState {
- s64_le sampling_number;
- s64_le sampling_number2;
- Attributes attributes;
- Buttons pad_states;
- AnalogStick l_stick;
- AnalogStick r_stick;
+ static_assert(sizeof(BasicXpadButtonSet) == 4, "BasicXpadButtonSet is an invalid size");
+
+ // This is nn::hid::detail::BasicXpadState
+ struct BasicXpadState {
+ s64 sampling_number;
+ BasicXpadAttributeSet attributes;
+ BasicXpadButtonSet pad_states;
+ Core::HID::AnalogStickState l_stick;
+ Core::HID::AnalogStickState r_stick;
};
- static_assert(sizeof(XPadState) == 0x28, "XPadState is an invalid size");
+ static_assert(sizeof(BasicXpadState) == 0x20, "BasicXpadState is an invalid size");
- struct XPadEntry {
- CommonHeader header;
- std::array<XPadState, 17> pad_states{};
- INSERT_PADDING_BYTES(0x138);
- };
- static_assert(sizeof(XPadEntry) == 0x400, "XPadEntry is an invalid size");
-
- struct SharedMemory {
- std::array<XPadEntry, 4> shared_memory_entries{};
- };
- static_assert(sizeof(SharedMemory) == 0x1000, "SharedMemory is an invalid size");
- SharedMemory shared_memory{};
+ // This is nn::hid::detail::BasicXpadLifo
+ Lifo<BasicXpadState, hid_entry_count> basic_xpad_lifo{};
+ static_assert(sizeof(basic_xpad_lifo) == 0x2C8, "basic_xpad_lifo is an invalid size");
+ BasicXpadState next_state{};
};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 10c64d41a..7163e1a4e 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -8,7 +8,7 @@
#include "common/settings.h"
#include "core/core.h"
#include "core/core_timing.h"
-#include "core/frontend/input.h"
+#include "core/hid/hid_core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/kernel/k_readable_event.h"
#include "core/hle/kernel/k_shared_memory.h"
@@ -34,10 +34,10 @@
namespace Service::HID {
// Updating period for each HID device.
-// HID is polled every 15ms, this value was derived from
-// https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering#joy-con-status-data-packet
-constexpr auto pad_update_ns = std::chrono::nanoseconds{1000 * 1000}; // (1ms, 1000Hz)
-constexpr auto motion_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000}; // (15ms, 66.666Hz)
+// Period time is obtained by measuring the number of samples in a second on HW using a homebrew
+constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz)
+constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz)
+constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
IAppletResource::IAppletResource(Core::System& system_,
@@ -79,17 +79,24 @@ IAppletResource::IAppletResource(Core::System& system_,
const auto guard = LockService();
UpdateControllers(user_data, ns_late);
});
+ mouse_keyboard_update_event = Core::Timing::CreateEvent(
+ "HID::UpdateMouseKeyboardCallback",
+ [this](std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
+ const auto guard = LockService();
+ UpdateMouseKeyboard(user_data, ns_late);
+ });
motion_update_event = Core::Timing::CreateEvent(
- "HID::MotionPadCallback",
+ "HID::UpdateMotionCallback",
[this](std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
const auto guard = LockService();
UpdateMotion(user_data, ns_late);
});
system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event);
+ system.CoreTiming().ScheduleEvent(mouse_keyboard_update_ns, mouse_keyboard_update_event);
system.CoreTiming().ScheduleEvent(motion_update_ns, motion_update_event);
- ReloadInputDevices();
+ system.HIDCore().ReloadInputDevices();
}
void IAppletResource::ActivateController(HidController controller) {
@@ -102,6 +109,7 @@ void IAppletResource::DeactivateController(HidController controller) {
IAppletResource::~IAppletResource() {
system.CoreTiming().UnscheduleEvent(pad_update_event, 0);
+ system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0);
system.CoreTiming().UnscheduleEvent(motion_update_event, 0);
}
@@ -117,23 +125,44 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data,
std::chrono::nanoseconds ns_late) {
auto& core_timing = system.CoreTiming();
- const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
for (const auto& controller : controllers) {
- if (should_reload) {
- controller->OnLoadInputDevices();
+ // Keyboard has it's own update event
+ if (controller == controllers[static_cast<size_t>(HidController::Keyboard)]) {
+ continue;
+ }
+ // Mouse has it's own update event
+ if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) {
+ continue;
}
controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(),
SHARED_MEMORY_SIZE);
}
// If ns_late is higher than the update rate ignore the delay
- if (ns_late > motion_update_ns) {
+ if (ns_late > pad_update_ns) {
ns_late = {};
}
core_timing.ScheduleEvent(pad_update_ns - ns_late, pad_update_event);
}
+void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data,
+ std::chrono::nanoseconds ns_late) {
+ auto& core_timing = system.CoreTiming();
+
+ controllers[static_cast<size_t>(HidController::Mouse)]->OnUpdate(
+ core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE);
+ controllers[static_cast<size_t>(HidController::Keyboard)]->OnUpdate(
+ core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE);
+
+ // If ns_late is higher than the update rate ignore the delay
+ if (ns_late > mouse_keyboard_update_ns) {
+ ns_late = {};
+ }
+
+ core_timing.ScheduleEvent(mouse_keyboard_update_ns - ns_late, mouse_keyboard_update_event);
+}
+
void IAppletResource::UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
auto& core_timing = system.CoreTiming();
@@ -166,7 +195,7 @@ public:
private:
void InitializeVibrationDevice(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()};
+ const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
if (applet_resource != nullptr) {
applet_resource->GetController<Controller_NPad>(HidController::NPad)
@@ -264,8 +293,8 @@ Hid::Hid(Core::System& system_)
{132, &Hid::EnableUnintendedHomeButtonInputProtection, "EnableUnintendedHomeButtonInputProtection"},
{133, nullptr, "SetNpadJoyAssignmentModeSingleWithDestination"},
{134, &Hid::SetNpadAnalogStickUseCenterClamp, "SetNpadAnalogStickUseCenterClamp"},
- {135, nullptr, "SetNpadCaptureButtonAssignment"},
- {136, nullptr, "ClearNpadCaptureButtonAssignment"},
+ {135, &Hid::SetNpadCaptureButtonAssignment, "SetNpadCaptureButtonAssignment"},
+ {136, &Hid::ClearNpadCaptureButtonAssignment, "ClearNpadCaptureButtonAssignment"},
{200, &Hid::GetVibrationDeviceInfo, "GetVibrationDeviceInfo"},
{201, &Hid::SendVibrationValue, "SendVibrationValue"},
{202, &Hid::GetActualVibrationValue, "GetActualVibrationValue"},
@@ -422,6 +451,7 @@ void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) {
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -448,19 +478,18 @@ void Hid::GetXpadIDs(Kernel::HLERequestContext& ctx) {
void Hid::ActivateSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ u32 basic_xpad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(true);
+ // This function does nothing on 10.0.0+
- LOG_DEBUG(Service_HID,
- "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_WARNING(Service_HID, "(STUBBED) called, basic_xpad_id={}, applet_resource_user_id={}",
+ parameters.basic_xpad_id, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -469,19 +498,18 @@ void Hid::ActivateSixAxisSensor(Kernel::HLERequestContext& ctx) {
void Hid::DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ u32 basic_xpad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(false);
+ // This function does nothing on 10.0.0+
- LOG_DEBUG(Service_HID,
- "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_WARNING(Service_HID, "(STUBBED) called, basic_xpad_id={}, applet_resource_user_id={}",
+ parameters.basic_xpad_id, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -490,14 +518,16 @@ void Hid::DeactivateSixAxisSensor(Kernel::HLERequestContext& ctx) {
void Hid::StartSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(true);
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
+ .SetSixAxisEnabled(parameters.sixaxis_handle, true);
LOG_DEBUG(Service_HID,
"called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
@@ -511,14 +541,16 @@ void Hid::StartSixAxisSensor(Kernel::HLERequestContext& ctx) {
void Hid::StopSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- applet_resource->GetController<Controller_NPad>(HidController::NPad).SetSixAxisEnabled(false);
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
+ .SetSixAxisEnabled(parameters.sixaxis_handle, false);
LOG_DEBUG(Service_HID,
"called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
@@ -534,19 +566,23 @@ void Hid::EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx) {
struct Parameters {
bool enable_sixaxis_sensor_fusion;
INSERT_PADDING_BYTES_NOINIT(3);
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
u64 applet_resource_user_id;
};
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- LOG_WARNING(Service_HID,
- "(STUBBED) called, enable_sixaxis_sensor_fusion={}, npad_type={}, npad_id={}, "
- "device_index={}, applet_resource_user_id={}",
- parameters.enable_sixaxis_sensor_fusion, parameters.sixaxis_handle.npad_type,
- parameters.sixaxis_handle.npad_id, parameters.sixaxis_handle.device_index,
- parameters.applet_resource_user_id);
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
+ .SetSixAxisFusionEnabled(parameters.sixaxis_handle,
+ parameters.enable_sixaxis_sensor_fusion);
+
+ LOG_DEBUG(Service_HID,
+ "called, enable_sixaxis_sensor_fusion={}, npad_type={}, npad_id={}, "
+ "device_index={}, applet_resource_user_id={}",
+ parameters.enable_sixaxis_sensor_fusion, parameters.sixaxis_handle.npad_type,
+ parameters.sixaxis_handle.npad_id, parameters.sixaxis_handle.device_index,
+ parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -555,9 +591,9 @@ void Hid::EnableSixAxisSensorFusion(Kernel::HLERequestContext& ctx) {
void Hid::SetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
- f32 parameter1;
- f32 parameter2;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
+ Core::HID::SixAxisSensorFusionParameters sixaxis_fusion;
+ INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
@@ -565,14 +601,14 @@ void Hid::SetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetSixAxisFusionParameters(parameters.parameter1, parameters.parameter2);
+ .SetSixAxisFusionParameters(parameters.sixaxis_handle, parameters.sixaxis_fusion);
- LOG_WARNING(Service_HID,
- "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, parameter1={}, "
- "parameter2={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.parameter1,
- parameters.parameter2, parameters.applet_resource_user_id);
+ LOG_DEBUG(Service_HID,
+ "called, npad_type={}, npad_id={}, device_index={}, parameter1={}, "
+ "parameter2={}, applet_resource_user_id={}",
+ parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
+ parameters.sixaxis_handle.device_index, parameters.sixaxis_fusion.parameter1,
+ parameters.sixaxis_fusion.parameter2, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -581,35 +617,33 @@ void Hid::SetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
void Hid::GetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
+ INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
- f32 parameter1 = 0;
- f32 parameter2 = 0;
const auto parameters{rp.PopRaw<Parameters>()};
- std::tie(parameter1, parameter2) =
+ const auto sixaxis_fusion_parameters =
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .GetSixAxisFusionParameters();
+ .GetSixAxisFusionParameters(parameters.sixaxis_handle);
- LOG_WARNING(
- Service_HID,
- "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_DEBUG(Service_HID,
+ "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
+ parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
+ parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
- rb.Push(parameter1);
- rb.Push(parameter2);
+ rb.PushRaw(sixaxis_fusion_parameters);
}
void Hid::ResetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
+ INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
@@ -617,13 +651,12 @@ void Hid::ResetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .ResetSixAxisFusionParameters();
+ .ResetSixAxisFusionParameters(parameters.sixaxis_handle);
- LOG_WARNING(
- Service_HID,
- "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_DEBUG(Service_HID,
+ "called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
+ parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
+ parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -631,12 +664,12 @@ void Hid::ResetSixAxisSensorFusionParameters(Kernel::HLERequestContext& ctx) {
void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto sixaxis_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()};
+ const auto sixaxis_handle{rp.PopRaw<Core::HID::SixAxisSensorHandle>()};
const auto drift_mode{rp.PopEnum<Controller_NPad::GyroscopeZeroDriftMode>()};
const auto applet_resource_user_id{rp.Pop<u64>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetGyroscopeZeroDriftMode(drift_mode);
+ .SetGyroscopeZeroDriftMode(sixaxis_handle, drift_mode);
LOG_DEBUG(Service_HID,
"called, npad_type={}, npad_id={}, device_index={}, drift_mode={}, "
@@ -651,10 +684,11 @@ void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
void Hid::GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -666,21 +700,23 @@ void Hid::GetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.PushEnum(applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .GetGyroscopeZeroDriftMode());
+ .GetGyroscopeZeroDriftMode(parameters.sixaxis_handle));
}
void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
+ const auto drift_mode{Controller_NPad::GyroscopeZeroDriftMode::Standard};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetGyroscopeZeroDriftMode(Controller_NPad::GyroscopeZeroDriftMode::Standard);
+ .SetGyroscopeZeroDriftMode(parameters.sixaxis_handle, drift_mode);
LOG_DEBUG(Service_HID,
"called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
@@ -694,10 +730,11 @@ void Hid::ResetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
void Hid::IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -709,16 +746,17 @@ void Hid::IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .IsSixAxisSensorAtRest());
+ .IsSixAxisSensorAtRest(parameters.sixaxis_handle));
}
void Hid::IsFirmwareUpdateAvailableForSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::SixAxisSensorHandle sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -740,13 +778,14 @@ void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->ActivateController(HidController::Gesture);
- LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", parameters.unknown,
- parameters.applet_resource_user_id);
+ LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}, applet_resource_user_id={}",
+ parameters.unknown, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -754,12 +793,20 @@ void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
void Hid::SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto supported_styleset{rp.Pop<u32>()};
+ struct Parameters {
+ Core::HID::NpadStyleSet supported_styleset;
+ INSERT_PADDING_WORDS_NOINIT(1);
+ u64 applet_resource_user_id;
+ };
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
+
+ const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetSupportedStyleSet({supported_styleset});
+ .SetSupportedStyleSet({parameters.supported_styleset});
- LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset);
+ LOG_DEBUG(Service_HID, "called, supported_styleset={}, applet_resource_user_id={}",
+ parameters.supported_styleset, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -773,9 +820,9 @@ void Hid::GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
- rb.Push(applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .GetSupportedStyleSet()
- .raw);
+ rb.PushEnum(applet_resource->GetController<Controller_NPad>(HidController::NPad)
+ .GetSupportedStyleSet()
+ .raw);
}
void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
@@ -818,11 +865,12 @@ void Hid::DeactivateNpad(Kernel::HLERequestContext& ctx) {
void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
u64 unknown;
};
+ static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -838,10 +886,11 @@ void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -857,7 +906,7 @@ void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) {
void Hid::GetPlayerLedPattern(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto npad_id{rp.Pop<u32>()};
+ const auto npad_id{rp.PopEnum<Core::HID::NpadIdType>()};
LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
@@ -872,16 +921,17 @@ void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
// Should have no effect with how our npad sets up the data
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 unknown;
+ s32 revision;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->ActivateController(HidController::NPad);
- LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", parameters.unknown,
+ LOG_DEBUG(Service_HID, "called, revision={}, applet_resource_user_id={}", parameters.revision,
parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
@@ -891,7 +941,7 @@ void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto applet_resource_user_id{rp.Pop<u64>()};
- const auto hold_type{rp.PopEnum<Controller_NPad::NpadHoldType>()};
+ const auto hold_type{rp.PopEnum<Controller_NPad::NpadJoyHoldType>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad).SetHoldType(hold_type);
@@ -916,42 +966,44 @@ void Hid::GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Single);
+ .SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyDeviceType::Left,
+ Controller_NPad::NpadJoyAssignmentMode::Single);
- LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
- parameters.npad_id, parameters.applet_resource_user_id);
+ LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
+ parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) {
- // TODO: Check the differences between this and SetNpadJoyAssignmentModeSingleByDefault
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
- u64 npad_joy_device_type;
+ Controller_NPad::NpadJoyDeviceType npad_joy_device_type;
};
+ static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Single);
+ .SetNpadMode(parameters.npad_id, parameters.npad_joy_device_type,
+ Controller_NPad::NpadJoyAssignmentMode::Single);
- LOG_WARNING(Service_HID,
- "(STUBBED) called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
- parameters.npad_id, parameters.applet_resource_user_id,
- parameters.npad_joy_device_type);
+ LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
+ parameters.npad_id, parameters.applet_resource_user_id,
+ parameters.npad_joy_device_type);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -960,18 +1012,19 @@ void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) {
void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
- .SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Dual);
+ .SetNpadMode(parameters.npad_id, {}, Controller_NPad::NpadJoyAssignmentMode::Dual);
- LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
- parameters.npad_id, parameters.applet_resource_user_id);
+ LOG_INFO(Service_HID, "called, npad_id={}, applet_resource_user_id={}", parameters.npad_id,
+ parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -979,8 +1032,8 @@ void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto npad_id_1{rp.Pop<u32>()};
- const auto npad_id_2{rp.Pop<u32>()};
+ const auto npad_id_1{rp.PopEnum<Core::HID::NpadIdType>()};
+ const auto npad_id_2{rp.PopEnum<Core::HID::NpadIdType>()};
const auto applet_resource_user_id{rp.Pop<u64>()};
applet_resource->GetController<Controller_NPad>(HidController::NPad)
@@ -1046,8 +1099,8 @@ void Hid::GetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) {
void Hid::SwapNpadAssignment(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto npad_id_1{rp.Pop<u32>()};
- const auto npad_id_2{rp.Pop<u32>()};
+ const auto npad_id_1{rp.PopEnum<Core::HID::NpadIdType>()};
+ const auto npad_id_2{rp.PopEnum<Core::HID::NpadIdType>()};
const auto applet_resource_user_id{rp.Pop<u64>()};
const bool res = applet_resource->GetController<Controller_NPad>(HidController::NPad)
@@ -1068,10 +1121,11 @@ void Hid::SwapNpadAssignment(Kernel::HLERequestContext& ctx) {
void Hid::IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -1089,9 +1143,10 @@ void Hid::EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& c
struct Parameters {
bool unintended_home_button_input_protection;
INSERT_PADDING_BYTES_NOINIT(3);
- u32 npad_id;
+ Core::HID::NpadIdType npad_id;
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -1113,6 +1168,7 @@ void Hid::SetNpadAnalogStickUseCenterClamp(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
bool analog_stick_use_center_clamp;
+ INSERT_PADDING_BYTES_NOINIT(7);
u64 applet_resource_user_id;
};
static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
@@ -1130,40 +1186,71 @@ void Hid::SetNpadAnalogStickUseCenterClamp(Kernel::HLERequestContext& ctx) {
rb.Push(ResultSuccess);
}
+void Hid::SetNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ struct Parameters {
+ Core::HID::NpadStyleSet npad_styleset;
+ INSERT_PADDING_WORDS_NOINIT(1);
+ u64 applet_resource_user_id;
+ Core::HID::NpadButton button;
+ };
+ static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
+
+ const auto parameters{rp.PopRaw<Parameters>()};
+
+ LOG_WARNING(Service_HID,
+ "(STUBBED) called, npad_styleset={}, applet_resource_user_id={}, button={}",
+ parameters.npad_styleset, parameters.applet_resource_user_id, parameters.button);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
+void Hid::ClearNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto applet_resource_user_id{rp.Pop<u64>()};
+
+ LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
+ applet_resource_user_id);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+}
+
void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()};
+ const auto vibration_device_handle{rp.PopRaw<Core::HID::VibrationDeviceHandle>()};
- VibrationDeviceInfo vibration_device_info;
+ Core::HID::VibrationDeviceInfo vibration_device_info;
switch (vibration_device_handle.npad_type) {
- case Controller_NPad::NpadType::ProController:
- case Controller_NPad::NpadType::Handheld:
- case Controller_NPad::NpadType::JoyconDual:
- case Controller_NPad::NpadType::JoyconLeft:
- case Controller_NPad::NpadType::JoyconRight:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::Handheld:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ case Core::HID::NpadStyleIndex::JoyconRight:
default:
- vibration_device_info.type = VibrationDeviceType::LinearResonantActuator;
+ vibration_device_info.type = Core::HID::VibrationDeviceType::LinearResonantActuator;
break;
- case Controller_NPad::NpadType::GameCube:
- vibration_device_info.type = VibrationDeviceType::GcErm;
+ case Core::HID::NpadStyleIndex::GameCube:
+ vibration_device_info.type = Core::HID::VibrationDeviceType::GcErm;
break;
- case Controller_NPad::NpadType::Pokeball:
- vibration_device_info.type = VibrationDeviceType::Unknown;
+ case Core::HID::NpadStyleIndex::Pokeball:
+ vibration_device_info.type = Core::HID::VibrationDeviceType::Unknown;
break;
}
switch (vibration_device_handle.device_index) {
- case Controller_NPad::DeviceIndex::Left:
- vibration_device_info.position = VibrationDevicePosition::Left;
+ case Core::HID::DeviceIndex::Left:
+ vibration_device_info.position = Core::HID::VibrationDevicePosition::Left;
break;
- case Controller_NPad::DeviceIndex::Right:
- vibration_device_info.position = VibrationDevicePosition::Right;
+ case Core::HID::DeviceIndex::Right:
+ vibration_device_info.position = Core::HID::VibrationDevicePosition::Right;
break;
- case Controller_NPad::DeviceIndex::None:
+ case Core::HID::DeviceIndex::None:
default:
UNREACHABLE_MSG("DeviceIndex should never be None!");
- vibration_device_info.position = VibrationDevicePosition::None;
+ vibration_device_info.position = Core::HID::VibrationDevicePosition::None;
break;
}
@@ -1178,11 +1265,12 @@ void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle vibration_device_handle;
- Controller_NPad::VibrationValue vibration_value;
+ Core::HID::VibrationDeviceHandle vibration_device_handle;
+ Core::HID::VibrationValue vibration_value;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x20, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -1202,10 +1290,11 @@ void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) {
void Hid::GetActualVibrationValue(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle vibration_device_handle;
+ Core::HID::VibrationDeviceHandle vibration_device_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -1256,10 +1345,10 @@ void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
const auto handles = ctx.ReadBuffer(0);
const auto vibrations = ctx.ReadBuffer(1);
- std::vector<Controller_NPad::DeviceHandle> vibration_device_handles(
- handles.size() / sizeof(Controller_NPad::DeviceHandle));
- std::vector<Controller_NPad::VibrationValue> vibration_values(
- vibrations.size() / sizeof(Controller_NPad::VibrationValue));
+ std::vector<Core::HID::VibrationDeviceHandle> vibration_device_handles(
+ handles.size() / sizeof(Core::HID::VibrationDeviceHandle));
+ std::vector<Core::HID::VibrationValue> vibration_values(vibrations.size() /
+ sizeof(Core::HID::VibrationValue));
std::memcpy(vibration_device_handles.data(), handles.data(), handles.size());
std::memcpy(vibration_values.data(), vibrations.data(), vibrations.size());
@@ -1276,9 +1365,10 @@ void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
void Hid::SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle vibration_device_handle;
+ Core::HID::VibrationDeviceHandle vibration_device_handle;
+ INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
- VibrationGcErmCommand gc_erm_command;
+ Core::HID::VibrationGcErmCommand gc_erm_command;
};
static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
@@ -1292,26 +1382,26 @@ void Hid::SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
*/
const auto vibration_value = [parameters] {
switch (parameters.gc_erm_command) {
- case VibrationGcErmCommand::Stop:
- return Controller_NPad::VibrationValue{
- .amp_low = 0.0f,
- .freq_low = 160.0f,
- .amp_high = 0.0f,
- .freq_high = 320.0f,
+ case Core::HID::VibrationGcErmCommand::Stop:
+ return Core::HID::VibrationValue{
+ .low_amplitude = 0.0f,
+ .low_frequency = 160.0f,
+ .high_amplitude = 0.0f,
+ .high_frequency = 320.0f,
};
- case VibrationGcErmCommand::Start:
- return Controller_NPad::VibrationValue{
- .amp_low = 1.0f,
- .freq_low = 160.0f,
- .amp_high = 1.0f,
- .freq_high = 320.0f,
+ case Core::HID::VibrationGcErmCommand::Start:
+ return Core::HID::VibrationValue{
+ .low_amplitude = 1.0f,
+ .low_frequency = 160.0f,
+ .high_amplitude = 1.0f,
+ .high_frequency = 320.0f,
};
- case VibrationGcErmCommand::StopHard:
- return Controller_NPad::VibrationValue{
- .amp_low = 0.0f,
- .freq_low = 0.0f,
- .amp_high = 0.0f,
- .freq_high = 0.0f,
+ case Core::HID::VibrationGcErmCommand::StopHard:
+ return Core::HID::VibrationValue{
+ .low_amplitude = 0.0f,
+ .low_frequency = 0.0f,
+ .high_amplitude = 0.0f,
+ .high_frequency = 0.0f,
};
default:
return Controller_NPad::DEFAULT_VIBRATION_VALUE;
@@ -1336,7 +1426,7 @@ void Hid::SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
void Hid::GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle vibration_device_handle;
+ Core::HID::VibrationDeviceHandle vibration_device_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
@@ -1347,8 +1437,8 @@ void Hid::GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
.GetLastVibration(parameters.vibration_device_handle);
const auto gc_erm_command = [last_vibration] {
- if (last_vibration.amp_low != 0.0f || last_vibration.amp_high != 0.0f) {
- return VibrationGcErmCommand::Start;
+ if (last_vibration.low_amplitude != 0.0f || last_vibration.high_amplitude != 0.0f) {
+ return Core::HID::VibrationGcErmCommand::Start;
}
/**
@@ -1357,11 +1447,11 @@ void Hid::GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
* SendVibrationGcErmCommand, in order to differentiate between Stop and StopHard commands.
* This is done to reuse the controller vibration functions made for regular controllers.
*/
- if (last_vibration.freq_low == 0.0f && last_vibration.freq_high == 0.0f) {
- return VibrationGcErmCommand::StopHard;
+ if (last_vibration.low_frequency == 0.0f && last_vibration.high_frequency == 0.0f) {
+ return Core::HID::VibrationGcErmCommand::StopHard;
}
- return VibrationGcErmCommand::Stop;
+ return Core::HID::VibrationGcErmCommand::Stop;
}();
LOG_DEBUG(Service_HID,
@@ -1401,10 +1491,11 @@ void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) {
void Hid::IsVibrationDeviceMounted(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle vibration_device_handle;
+ Core::HID::VibrationDeviceHandle vibration_device_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
@@ -1435,18 +1526,18 @@ void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
void Hid::StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- LOG_WARNING(
- Service_HID,
- "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_WARNING(Service_HID,
+ "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
+ parameters.console_sixaxis_handle.unknown_1,
+ parameters.console_sixaxis_handle.unknown_2, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -1455,18 +1546,18 @@ void Hid::StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
void Hid::StopConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
struct Parameters {
- Controller_NPad::DeviceHandle sixaxis_handle;
+ Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle;
INSERT_PADDING_WORDS_NOINIT(1);
u64 applet_resource_user_id;
};
+ static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size.");
const auto parameters{rp.PopRaw<Parameters>()};
- LOG_WARNING(
- Service_HID,
- "(STUBBED) called, npad_type={}, npad_id={}, device_index={}, applet_resource_user_id={}",
- parameters.sixaxis_handle.npad_type, parameters.sixaxis_handle.npad_id,
- parameters.sixaxis_handle.device_index, parameters.applet_resource_user_id);
+ LOG_WARNING(Service_HID,
+ "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
+ parameters.console_sixaxis_handle.unknown_1,
+ parameters.console_sixaxis_handle.unknown_2, parameters.applet_resource_user_id);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
@@ -1620,10 +1711,8 @@ void Hid::SetNpadCommunicationMode(Kernel::HLERequestContext& ctx) {
void Hid::GetNpadCommunicationMode(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto applet_resource_user_id{rp.Pop<u64>()};
- LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
- applet_resource_user_id);
+ LOG_WARNING(Service_HID, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 4};
rb.Push(ResultSuccess);
@@ -1825,7 +1914,7 @@ public:
{317, nullptr, "GetNpadLeftRightInterfaceType"},
{318, nullptr, "HasBattery"},
{319, nullptr, "HasLeftRightBattery"},
- {321, nullptr, "GetUniquePadsFromNpad"},
+ {321, &HidSys::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
{322, nullptr, "GetIrSensorState"},
{323, nullptr, "GetXcdHandleForNpadWithIrSensor"},
{324, nullptr, "GetUniquePadButtonSet"},
@@ -1996,6 +2085,18 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ void GetUniquePadsFromNpad(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
+
+ const s64 total_entries = 0;
+ LOG_WARNING(Service_HID, "(STUBBED) called, npad_id_type={}", npad_id_type);
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(total_entries);
+ }
};
class HidTmp final : public ServiceFramework<HidTmp> {
@@ -2037,10 +2138,6 @@ public:
}
};
-void ReloadInputDevices() {
- Settings::values.is_device_reload_pending.store(true);
-}
-
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<Hid>(system)->InstallAsService(service_manager);
std::make_shared<HidBus>(system)->InstallAsService(service_manager);
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index b1fe75e94..d290df161 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -60,21 +60,23 @@ public:
private:
template <typename T>
void MakeController(HidController controller) {
- controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(system);
+ controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(system.HIDCore());
}
template <typename T>
void MakeControllerWithServiceContext(HidController controller) {
controllers[static_cast<std::size_t>(controller)] =
- std::make_unique<T>(system, service_context);
+ std::make_unique<T>(system.HIDCore(), service_context);
}
void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
+ void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
KernelHelpers::ServiceContext& service_context;
std::shared_ptr<Core::Timing::EventType> pad_update_event;
+ std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
std::shared_ptr<Core::Timing::EventType> motion_update_event;
std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
@@ -134,6 +136,8 @@ private:
void IsUnintendedHomeButtonInputProtectionEnabled(Kernel::HLERequestContext& ctx);
void EnableUnintendedHomeButtonInputProtection(Kernel::HLERequestContext& ctx);
void SetNpadAnalogStickUseCenterClamp(Kernel::HLERequestContext& ctx);
+ void SetNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx);
+ void ClearNpadCaptureButtonAssignment(Kernel::HLERequestContext& ctx);
void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx);
void SendVibrationValue(Kernel::HLERequestContext& ctx);
void GetActualVibrationValue(Kernel::HLERequestContext& ctx);
@@ -161,38 +165,11 @@ private:
void GetNpadCommunicationMode(Kernel::HLERequestContext& ctx);
void SetTouchScreenConfiguration(Kernel::HLERequestContext& ctx);
- enum class VibrationDeviceType : u32 {
- Unknown = 0,
- LinearResonantActuator = 1,
- GcErm = 2,
- };
-
- enum class VibrationDevicePosition : u32 {
- None = 0,
- Left = 1,
- Right = 2,
- };
-
- enum class VibrationGcErmCommand : u64 {
- Stop = 0,
- Start = 1,
- StopHard = 2,
- };
-
- struct VibrationDeviceInfo {
- VibrationDeviceType type{};
- VibrationDevicePosition position{};
- };
- static_assert(sizeof(VibrationDeviceInfo) == 0x8, "VibrationDeviceInfo has incorrect size.");
-
std::shared_ptr<IAppletResource> applet_resource;
KernelHelpers::ServiceContext service_context;
};
-/// Reload input devices. Used when input configuration changed
-void ReloadInputDevices();
-
/// Registers all HID services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
diff --git a/src/core/hle/service/hid/ring_lifo.h b/src/core/hle/service/hid/ring_lifo.h
new file mode 100644
index 000000000..44c20d967
--- /dev/null
+++ b/src/core/hle/service/hid/ring_lifo.h
@@ -0,0 +1,54 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include <array>
+
+#include "common/common_types.h"
+
+namespace Service::HID {
+
+template <typename State>
+struct AtomicStorage {
+ s64 sampling_number;
+ State state;
+};
+
+template <typename State, std::size_t max_buffer_size>
+struct Lifo {
+ s64 timestamp{};
+ s64 total_buffer_count = static_cast<s64>(max_buffer_size);
+ s64 buffer_tail{};
+ s64 buffer_count{};
+ std::array<AtomicStorage<State>, max_buffer_size> entries{};
+
+ const AtomicStorage<State>& ReadCurrentEntry() const {
+ return entries[buffer_tail];
+ }
+
+ const AtomicStorage<State>& ReadPreviousEntry() const {
+ return entries[GetPreviousEntryIndex()];
+ }
+
+ std::size_t GetPreviousEntryIndex() const {
+ return static_cast<size_t>((buffer_tail + total_buffer_count - 1) % total_buffer_count);
+ }
+
+ std::size_t GetNextEntryIndex() const {
+ return static_cast<size_t>((buffer_tail + 1) % total_buffer_count);
+ }
+
+ void WriteNextEntry(const State& new_state) {
+ if (buffer_count < total_buffer_count - 1) {
+ buffer_count++;
+ }
+ buffer_tail = GetNextEntryIndex();
+ const auto& previous_entry = ReadPreviousEntry();
+ entries[buffer_tail].sampling_number = previous_entry.sampling_number + 1;
+ entries[buffer_tail].state = new_state;
+ }
+};
+
+} // namespace Service::HID
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index 32eff3b2a..3782703d2 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -396,12 +396,12 @@ public:
CopyCode(nro_addr + nro_header.segment_headers[DATA_INDEX].memory_offset, data_start,
nro_header.segment_headers[DATA_INDEX].memory_size);
- CASCADE_CODE(process->PageTable().SetCodeMemoryPermission(
+ CASCADE_CODE(process->PageTable().SetProcessMemoryPermission(
text_start, ro_start - text_start, Kernel::KMemoryPermission::ReadAndExecute));
- CASCADE_CODE(process->PageTable().SetCodeMemoryPermission(ro_start, data_start - ro_start,
- Kernel::KMemoryPermission::Read));
+ CASCADE_CODE(process->PageTable().SetProcessMemoryPermission(
+ ro_start, data_start - ro_start, Kernel::KMemoryPermission::Read));
- return process->PageTable().SetCodeMemoryPermission(
+ return process->PageTable().SetProcessMemoryPermission(
data_start, bss_end_addr - data_start, Kernel::KMemoryPermission::ReadAndWrite);
}
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index 64ffc8572..382ddcae5 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -12,6 +12,7 @@
#include "core/hle/service/ns/errors.h"
#include "core/hle/service/ns/language.h"
#include "core/hle/service/ns/ns.h"
+#include "core/hle/service/ns/pdm_qry.h"
#include "core/hle/service/ns/pl_u.h"
#include "core/hle/service/set/set.h"
@@ -570,11 +571,29 @@ IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
IFactoryResetInterface::~IFactoryResetInterface() = default;
+IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface(
+ Core::System& system_)
+ : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "GetApplicationControlData"},
+ {1, nullptr, "GetApplicationDesiredLanguage"},
+ {2, nullptr, "ConvertApplicationLanguageToLanguageCode"},
+ {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+ {4, nullptr, "SelectApplicationDesiredLanguage"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default;
+
NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
// clang-format off
static const FunctionInfo functions[] = {
{7988, nullptr, "GetDynamicRightsInterface"},
- {7989, nullptr, "GetReadOnlyApplicationControlDataInterface"},
+ {7989, &NS::PushInterface<IReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
{7991, nullptr, "GetReadOnlyApplicationRecordInterface"},
{7992, &NS::PushInterface<IECommerceInterface>, "GetECommerceInterface"},
{7993, &NS::PushInterface<IApplicationVersionInterface>, "GetApplicationVersionInterface"},
@@ -738,6 +757,8 @@ void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system
std::make_shared<NS_SU>(system)->InstallAsService(service_manager);
std::make_shared<NS_VM>(system)->InstallAsService(service_manager);
+ std::make_shared<PDM_QRY>(system)->InstallAsService(service_manager);
+
std::make_shared<PL_U>(system)->InstallAsService(service_manager);
}
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
index 218eec3ec..43540b0fb 100644
--- a/src/core/hle/service/ns/ns.h
+++ b/src/core/hle/service/ns/ns.h
@@ -74,6 +74,13 @@ public:
~IFactoryResetInterface() override;
};
+class IReadOnlyApplicationControlDataInterface final
+ : public ServiceFramework<IReadOnlyApplicationControlDataInterface> {
+public:
+ explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
+ ~IReadOnlyApplicationControlDataInterface() override;
+};
+
class NS final : public ServiceFramework<NS> {
public:
explicit NS(const char* name, Core::System& system_);
diff --git a/src/core/hle/service/ns/pdm_qry.cpp b/src/core/hle/service/ns/pdm_qry.cpp
new file mode 100644
index 000000000..e2fab5c3f
--- /dev/null
+++ b/src/core/hle/service/ns/pdm_qry.cpp
@@ -0,0 +1,69 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include <memory>
+
+#include "common/logging/log.h"
+#include "common/uuid.h"
+#include "core/hle/ipc_helpers.h"
+#include "core/hle/service/ns/pdm_qry.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/sm/sm.h"
+
+namespace Service::NS {
+
+PDM_QRY::PDM_QRY(Core::System& system_) : ServiceFramework{system_, "pdm:qry"} {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, nullptr, "QueryAppletEvent"},
+ {1, nullptr, "QueryPlayStatistics"},
+ {2, nullptr, "QueryPlayStatisticsByUserAccountId"},
+ {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
+ {4, nullptr, "QueryPlayStatisticsByApplicationId"},
+ {5, &PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
+ {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
+ {7, nullptr, "QueryLastPlayTimeV0"},
+ {8, nullptr, "QueryPlayEvent"},
+ {9, nullptr, "GetAvailablePlayEventRange"},
+ {10, nullptr, "QueryAccountEvent"},
+ {11, nullptr, "QueryAccountPlayEvent"},
+ {12, nullptr, "GetAvailableAccountPlayEventRange"},
+ {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
+ {14, nullptr, "QueryRecentlyPlayedApplication"},
+ {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
+ {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
+ {17, nullptr, "QueryLastPlayTime"},
+ {18, nullptr, "QueryApplicationPlayStatisticsForSystem"},
+ {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+PDM_QRY::~PDM_QRY() = default;
+
+void PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto unknown = rp.Pop<bool>();
+ rp.Pop<u8>(); // Padding
+ const auto application_id = rp.Pop<u64>();
+ const auto user_account_uid = rp.PopRaw<Common::UUID>();
+
+ // TODO(German77): Read statistics of the game
+ PlayStatistics statistics{
+ .application_id = application_id,
+ .total_launches = 1,
+ };
+
+ LOG_WARNING(Service_NS,
+ "(STUBBED) called. unknown={}. application_id=0x{:016X}, user_account_uid=0x{}",
+ unknown, application_id, user_account_uid.Format());
+
+ IPC::ResponseBuilder rb{ctx, 12};
+ rb.Push(ResultSuccess);
+ rb.PushRaw(statistics);
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/pdm_qry.h b/src/core/hle/service/ns/pdm_qry.h
new file mode 100644
index 000000000..516136314
--- /dev/null
+++ b/src/core/hle/service/ns/pdm_qry.h
@@ -0,0 +1,33 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+struct PlayStatistics {
+ u64 application_id{};
+ u32 first_entry_index{};
+ u32 first_timestamp_user{};
+ u32 first_timestamp_network{};
+ u32 last_entry_index{};
+ u32 last_timestamp_user{};
+ u32 last_timestamp_network{};
+ u32 play_time_in_minutes{};
+ u32 total_launches{};
+};
+static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size");
+
+class PDM_QRY final : public ServiceFramework<PDM_QRY> {
+public:
+ explicit PDM_QRY(Core::System& system_);
+ ~PDM_QRY() override;
+
+private:
+ void QueryPlayStatisticsByApplicationIdAndUserAccountId(Kernel::HLERequestContext& ctx);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
index 0d7d4ad03..8314d1ec2 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
@@ -20,8 +20,12 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>&
switch (command.group) {
case 0x0:
switch (command.cmd) {
- case 0x1:
- return Submit(input, output);
+ case 0x1: {
+ if (!fd_to_id.contains(fd)) {
+ fd_to_id[fd] = next_id++;
+ }
+ return Submit(fd, input, output);
+ }
case 0x2:
return GetSyncpoint(input, output);
case 0x3:
@@ -66,7 +70,10 @@ void nvhost_nvdec::OnOpen(DeviceFD fd) {}
void nvhost_nvdec::OnClose(DeviceFD fd) {
LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
- system.GPU().ClearCdmaInstance();
+ const auto iter = fd_to_id.find(fd);
+ if (iter != fd_to_id.end()) {
+ system.GPU().ClearCdmaInstance(iter->second);
+ }
}
} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
index 523d96e3a..a507c4d0a 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h
@@ -24,6 +24,9 @@ public:
void OnOpen(DeviceFD fd) override;
void OnClose(DeviceFD fd) override;
+
+private:
+ u32 next_id{};
};
} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp
index e61261f98..8a05f0668 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp
@@ -59,7 +59,8 @@ NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) {
return NvResult::Success;
}
-NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u8>& output) {
+NvResult nvhost_nvdec_common::Submit(DeviceFD fd, const std::vector<u8>& input,
+ std::vector<u8>& output) {
IoctlSubmit params{};
std::memcpy(&params, input.data(), sizeof(IoctlSubmit));
LOG_DEBUG(Service_NVDRV, "called NVDEC Submit, cmd_buffer_count={}", params.cmd_buffer_count);
@@ -93,7 +94,7 @@ NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u
Tegra::ChCommandHeaderList cmdlist(cmd_buffer.word_count);
system.Memory().ReadBlock(object->addr + cmd_buffer.offset, cmdlist.data(),
cmdlist.size() * sizeof(u32));
- gpu.PushCommandBuffer(cmdlist);
+ gpu.PushCommandBuffer(fd_to_id[fd], cmdlist);
}
std::memcpy(output.data(), &params, sizeof(IoctlSubmit));
// Some games expect command_buffers to be written back
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
index 351625c17..e28c54df6 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h
@@ -104,13 +104,14 @@ protected:
/// Ioctl command implementations
NvResult SetNVMAPfd(const std::vector<u8>& input);
- NvResult Submit(const std::vector<u8>& input, std::vector<u8>& output);
+ NvResult Submit(DeviceFD fd, const std::vector<u8>& input, std::vector<u8>& output);
NvResult GetSyncpoint(const std::vector<u8>& input, std::vector<u8>& output);
NvResult GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output);
NvResult MapBuffer(const std::vector<u8>& input, std::vector<u8>& output);
NvResult UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& output);
NvResult SetSubmitTimeout(const std::vector<u8>& input, std::vector<u8>& output);
+ std::unordered_map<DeviceFD, u32> fd_to_id{};
s32_le nvmap_fd{};
u32_le submit_timeout{};
std::shared_ptr<nvmap> nvmap_dev;
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
index eac4dd530..76b39806f 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp
@@ -21,7 +21,10 @@ NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& i
case 0x0:
switch (command.cmd) {
case 0x1:
- return Submit(input, output);
+ if (!fd_to_id.contains(fd)) {
+ fd_to_id[fd] = next_id++;
+ }
+ return Submit(fd, input, output);
case 0x2:
return GetSyncpoint(input, output);
case 0x3:
@@ -65,7 +68,10 @@ NvResult nvhost_vic::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& i
void nvhost_vic::OnOpen(DeviceFD fd) {}
void nvhost_vic::OnClose(DeviceFD fd) {
- system.GPU().ClearCdmaInstance();
+ const auto iter = fd_to_id.find(fd);
+ if (iter != fd_to_id.end()) {
+ system.GPU().ClearCdmaInstance(iter->second);
+ }
}
} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h
index 6d7fda9d1..c9732c037 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.h
@@ -23,5 +23,8 @@ public:
void OnOpen(DeviceFD fd) override;
void OnClose(DeviceFD fd) override;
+
+private:
+ u32 next_id{};
};
} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvdrv/nvdata.h b/src/core/hle/service/nvdrv/nvdata.h
index 3294bc0e7..5ab221fc1 100644
--- a/src/core/hle/service/nvdrv/nvdata.h
+++ b/src/core/hle/service/nvdrv/nvdata.h
@@ -1,3 +1,7 @@
+// Copyright 2019 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
#pragma once
#include <array>
diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp
index 88fc5b5cc..277abc17a 100644
--- a/src/core/hle/service/pm/pm.cpp
+++ b/src/core/hle/service/pm/pm.cpp
@@ -13,7 +13,12 @@ namespace Service::PM {
namespace {
-constexpr ResultCode ERROR_PROCESS_NOT_FOUND{ErrorModule::PM, 1};
+constexpr ResultCode ResultProcessNotFound{ErrorModule::PM, 1};
+[[maybe_unused]] constexpr ResultCode ResultAlreadyStarted{ErrorModule::PM, 2};
+[[maybe_unused]] constexpr ResultCode ResultNotTerminated{ErrorModule::PM, 3};
+[[maybe_unused]] constexpr ResultCode ResultDebugHookInUse{ErrorModule::PM, 4};
+[[maybe_unused]] constexpr ResultCode ResultApplicationRunning{ErrorModule::PM, 5};
+[[maybe_unused]] constexpr ResultCode ResultInvalidSize{ErrorModule::PM, 6};
constexpr u64 NO_PROCESS_FOUND_PID{0};
@@ -95,18 +100,18 @@ public:
private:
void GetProcessId(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
- const auto title_id = rp.PopRaw<u64>();
+ const auto program_id = rp.PopRaw<u64>();
- LOG_DEBUG(Service_PM, "called, title_id={:016X}", title_id);
+ LOG_DEBUG(Service_PM, "called, program_id={:016X}", program_id);
const auto process =
- SearchProcessList(kernel.GetProcessList(), [title_id](const auto& proc) {
- return proc->GetProgramID() == title_id;
+ SearchProcessList(kernel.GetProcessList(), [program_id](const auto& proc) {
+ return proc->GetProgramID() == program_id;
});
if (!process.has_value()) {
IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ERROR_PROCESS_NOT_FOUND);
+ rb.Push(ResultProcessNotFound);
return;
}
@@ -128,13 +133,16 @@ public:
explicit Info(Core::System& system_, const std::vector<Kernel::KProcess*>& process_list_)
: ServiceFramework{system_, "pm:info"}, process_list{process_list_} {
static const FunctionInfo functions[] = {
- {0, &Info::GetTitleId, "GetTitleId"},
+ {0, &Info::GetProgramId, "GetProgramId"},
+ {65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"},
+ {65001, nullptr, "AtmosphereHasLaunchedProgram"},
+ {65002, nullptr, "AtmosphereGetProcessInfo"},
};
RegisterHandlers(functions);
}
private:
- void GetTitleId(Kernel::HLERequestContext& ctx) {
+ void GetProgramId(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
const auto process_id = rp.PopRaw<u64>();
@@ -146,7 +154,7 @@ private:
if (!process.has_value()) {
IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ERROR_PROCESS_NOT_FOUND);
+ rb.Push(ResultProcessNotFound);
return;
}
@@ -155,6 +163,27 @@ private:
rb.Push((*process)->GetProgramID());
}
+ void AtmosphereGetProcessId(Kernel::HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto program_id = rp.PopRaw<u64>();
+
+ LOG_DEBUG(Service_PM, "called, program_id={:016X}", program_id);
+
+ const auto process = SearchProcessList(process_list, [program_id](const auto& proc) {
+ return proc->GetProgramID() == program_id;
+ });
+
+ if (!process.has_value()) {
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultProcessNotFound);
+ return;
+ }
+
+ IPC::ResponseBuilder rb{ctx, 4};
+ rb.Push(ResultSuccess);
+ rb.Push((*process)->GetProcessID());
+ }
+
const std::vector<Kernel::KProcess*>& process_list;
};
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 1b5aca65d..b47e3bf69 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -125,8 +125,9 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
}
metadata.Print();
- const auto static_modules = {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
- "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"};
+ const auto static_modules = {"rtld", "main", "subsdk0", "subsdk1", "subsdk2",
+ "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7",
+ "subsdk8", "subsdk9", "sdk"};
// Use the NSO module loader to figure out the code layout
std::size_t code_size{};
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp
index 20f0e90f5..12446c9ac 100644
--- a/src/core/memory/cheat_engine.cpp
+++ b/src/core/memory/cheat_engine.cpp
@@ -19,7 +19,6 @@
namespace Core::Memory {
namespace {
constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12};
-constexpr u32 KEYPAD_BITMASK = 0x3FFFFFF;
std::string_view ExtractName(std::string_view data, std::size_t start_index, char match) {
auto end_index = start_index;
@@ -61,7 +60,7 @@ u64 StandardVmCallbacks::HidKeysDown() {
applet_resource
->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)
.GetAndResetPressState();
- return press_state & KEYPAD_BITMASK;
+ return static_cast<u64>(press_state & HID::NpadButton::All);
}
void StandardVmCallbacks::DebugLog(u8 id, u64 value) {
diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h
index a2541906f..816202588 100644
--- a/src/core/perf_stats.h
+++ b/src/core/perf_stats.h
@@ -33,7 +33,7 @@ public:
explicit PerfStats(u64 title_id_);
~PerfStats();
- using Clock = std::chrono::high_resolution_clock;
+ using Clock = std::chrono::steady_clock;
void BeginSystemFrame();
void EndSystemFrame();
@@ -87,7 +87,7 @@ private:
class SpeedLimiter {
public:
- using Clock = std::chrono::high_resolution_clock;
+ using Clock = std::chrono::steady_clock;
void DoSpeedLimiting(std::chrono::microseconds current_system_time_us);
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index dd13d948f..d4fa69a77 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -1,36 +1,32 @@
add_library(input_common STATIC
- analog_from_button.cpp
- analog_from_button.h
- keyboard.cpp
- keyboard.h
+ drivers/gc_adapter.cpp
+ drivers/gc_adapter.h
+ drivers/keyboard.cpp
+ drivers/keyboard.h
+ drivers/mouse.cpp
+ drivers/mouse.h
+ drivers/sdl_driver.cpp
+ drivers/sdl_driver.h
+ drivers/tas_input.cpp
+ drivers/tas_input.h
+ drivers/touch_screen.cpp
+ drivers/touch_screen.h
+ drivers/udp_client.cpp
+ drivers/udp_client.h
+ helpers/stick_from_buttons.cpp
+ helpers/stick_from_buttons.h
+ helpers/touch_from_buttons.cpp
+ helpers/touch_from_buttons.h
+ helpers/udp_protocol.cpp
+ helpers/udp_protocol.h
+ input_engine.cpp
+ input_engine.h
+ input_mapping.cpp
+ input_mapping.h
+ input_poller.cpp
+ input_poller.h
main.cpp
main.h
- motion_from_button.cpp
- motion_from_button.h
- motion_input.cpp
- motion_input.h
- touch_from_button.cpp
- touch_from_button.h
- gcadapter/gc_adapter.cpp
- gcadapter/gc_adapter.h
- gcadapter/gc_poller.cpp
- gcadapter/gc_poller.h
- mouse/mouse_input.cpp
- mouse/mouse_input.h
- mouse/mouse_poller.cpp
- mouse/mouse_poller.h
- sdl/sdl.cpp
- sdl/sdl.h
- tas/tas_input.cpp
- tas/tas_input.h
- tas/tas_poller.cpp
- tas/tas_poller.h
- udp/client.cpp
- udp/client.h
- udp/protocol.cpp
- udp/protocol.h
- udp/udp.cpp
- udp/udp.h
)
if (MSVC)
@@ -57,8 +53,8 @@ endif()
if (ENABLE_SDL2)
target_sources(input_common PRIVATE
- sdl/sdl_impl.cpp
- sdl/sdl_impl.h
+ drivers/sdl_driver.cpp
+ drivers/sdl_driver.h
)
target_link_libraries(input_common PRIVATE SDL2)
target_compile_definitions(input_common PRIVATE HAVE_SDL2)
diff --git a/src/input_common/analog_from_button.cpp b/src/input_common/analog_from_button.cpp
deleted file mode 100755
index 2fafd077f..000000000
--- a/src/input_common/analog_from_button.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2017 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <atomic>
-#include <chrono>
-#include <cmath>
-#include <thread>
-#include "common/math_util.h"
-#include "common/settings.h"
-#include "input_common/analog_from_button.h"
-
-namespace InputCommon {
-
-class Analog final : public Input::AnalogDevice {
-public:
- using Button = std::unique_ptr<Input::ButtonDevice>;
-
- Analog(Button up_, Button down_, Button left_, Button right_, Button modifier_,
- float modifier_scale_, float modifier_angle_)
- : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
- right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_),
- modifier_angle(modifier_angle_) {
- Input::InputCallback<bool> callbacks{
- [this]([[maybe_unused]] bool status) { UpdateStatus(); }};
- up->SetCallback(callbacks);
- down->SetCallback(callbacks);
- left->SetCallback(callbacks);
- right->SetCallback(callbacks);
- modifier->SetCallback(callbacks);
- }
-
- bool IsAngleGreater(float old_angle, float new_angle) const {
- constexpr float TAU = Common::PI * 2.0f;
- // Use wider angle to ease the transition.
- constexpr float aperture = TAU * 0.15f;
- const float top_limit = new_angle + aperture;
- return (old_angle > new_angle && old_angle <= top_limit) ||
- (old_angle + TAU > new_angle && old_angle + TAU <= top_limit);
- }
-
- bool IsAngleSmaller(float old_angle, float new_angle) const {
- constexpr float TAU = Common::PI * 2.0f;
- // Use wider angle to ease the transition.
- constexpr float aperture = TAU * 0.15f;
- const float bottom_limit = new_angle - aperture;
- return (old_angle >= bottom_limit && old_angle < new_angle) ||
- (old_angle - TAU >= bottom_limit && old_angle - TAU < new_angle);
- }
-
- float GetAngle(std::chrono::time_point<std::chrono::steady_clock> now) const {
- constexpr float TAU = Common::PI * 2.0f;
- float new_angle = angle;
-
- auto time_difference = static_cast<float>(
- std::chrono::duration_cast<std::chrono::microseconds>(now - last_update).count());
- time_difference /= 1000.0f * 1000.0f;
- if (time_difference > 0.5f) {
- time_difference = 0.5f;
- }
-
- if (IsAngleGreater(new_angle, goal_angle)) {
- new_angle -= modifier_angle * time_difference;
- if (new_angle < 0) {
- new_angle += TAU;
- }
- if (!IsAngleGreater(new_angle, goal_angle)) {
- return goal_angle;
- }
- } else if (IsAngleSmaller(new_angle, goal_angle)) {
- new_angle += modifier_angle * time_difference;
- if (new_angle >= TAU) {
- new_angle -= TAU;
- }
- if (!IsAngleSmaller(new_angle, goal_angle)) {
- return goal_angle;
- }
- } else {
- return goal_angle;
- }
- return new_angle;
- }
-
- void SetGoalAngle(bool r, bool l, bool u, bool d) {
- // Move to the right
- if (r && !u && !d) {
- goal_angle = 0.0f;
- }
-
- // Move to the upper right
- if (r && u && !d) {
- goal_angle = Common::PI * 0.25f;
- }
-
- // Move up
- if (u && !l && !r) {
- goal_angle = Common::PI * 0.5f;
- }
-
- // Move to the upper left
- if (l && u && !d) {
- goal_angle = Common::PI * 0.75f;
- }
-
- // Move to the left
- if (l && !u && !d) {
- goal_angle = Common::PI;
- }
-
- // Move to the bottom left
- if (l && !u && d) {
- goal_angle = Common::PI * 1.25f;
- }
-
- // Move down
- if (d && !l && !r) {
- goal_angle = Common::PI * 1.5f;
- }
-
- // Move to the bottom right
- if (r && !u && d) {
- goal_angle = Common::PI * 1.75f;
- }
- }
-
- void UpdateStatus() {
- const float coef = modifier->GetStatus() ? modifier_scale : 1.0f;
-
- bool r = right->GetStatus();
- bool l = left->GetStatus();
- bool u = up->GetStatus();
- bool d = down->GetStatus();
-
- // Eliminate contradictory movements
- if (r && l) {
- r = false;
- l = false;
- }
- if (u && d) {
- u = false;
- d = false;
- }
-
- // Move if a key is pressed
- if (r || l || u || d) {
- amplitude = coef;
- } else {
- amplitude = 0;
- }
-
- const auto now = std::chrono::steady_clock::now();
- const auto time_difference = static_cast<u64>(
- std::chrono::duration_cast<std::chrono::milliseconds>(now - last_update).count());
-
- if (time_difference < 10) {
- // Disable analog mode if inputs are too fast
- SetGoalAngle(r, l, u, d);
- angle = goal_angle;
- } else {
- angle = GetAngle(now);
- SetGoalAngle(r, l, u, d);
- }
-
- last_update = now;
- }
-
- std::tuple<float, float> GetStatus() const override {
- if (Settings::values.emulate_analog_keyboard) {
- const auto now = std::chrono::steady_clock::now();
- float angle_ = GetAngle(now);
- return std::make_tuple(std::cos(angle_) * amplitude, std::sin(angle_) * amplitude);
- }
- constexpr float SQRT_HALF = 0.707106781f;
- int x = 0, y = 0;
- if (right->GetStatus()) {
- ++x;
- }
- if (left->GetStatus()) {
- --x;
- }
- if (up->GetStatus()) {
- ++y;
- }
- if (down->GetStatus()) {
- --y;
- }
- const float coef = modifier->GetStatus() ? modifier_scale : 1.0f;
- return std::make_tuple(static_cast<float>(x) * coef * (y == 0 ? 1.0f : SQRT_HALF),
- static_cast<float>(y) * coef * (x == 0 ? 1.0f : SQRT_HALF));
- }
-
- Input::AnalogProperties GetAnalogProperties() const override {
- return {modifier_scale, 1.0f, 0.5f};
- }
-
- bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override {
- switch (direction) {
- case Input::AnalogDirection::RIGHT:
- return right->GetStatus();
- case Input::AnalogDirection::LEFT:
- return left->GetStatus();
- case Input::AnalogDirection::UP:
- return up->GetStatus();
- case Input::AnalogDirection::DOWN:
- return down->GetStatus();
- }
- return false;
- }
-
-private:
- Button up;
- Button down;
- Button left;
- Button right;
- Button modifier;
- float modifier_scale;
- float modifier_angle;
- float angle{};
- float goal_angle{};
- float amplitude{};
- std::chrono::time_point<std::chrono::steady_clock> last_update;
-};
-
-std::unique_ptr<Input::AnalogDevice> AnalogFromButton::Create(const Common::ParamPackage& params) {
- const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
- auto up = Input::CreateDevice<Input::ButtonDevice>(params.Get("up", null_engine));
- auto down = Input::CreateDevice<Input::ButtonDevice>(params.Get("down", null_engine));
- auto left = Input::CreateDevice<Input::ButtonDevice>(params.Get("left", null_engine));
- auto right = Input::CreateDevice<Input::ButtonDevice>(params.Get("right", null_engine));
- auto modifier = Input::CreateDevice<Input::ButtonDevice>(params.Get("modifier", null_engine));
- auto modifier_scale = params.Get("modifier_scale", 0.5f);
- auto modifier_angle = params.Get("modifier_angle", 5.5f);
- return std::make_unique<Analog>(std::move(up), std::move(down), std::move(left),
- std::move(right), std::move(modifier), modifier_scale,
- modifier_angle);
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/gcadapter/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp
index a2f1bb67c..7ab4540a8 100644
--- a/src/input_common/gcadapter/gc_adapter.cpp
+++ b/src/input_common/drivers/gc_adapter.cpp
@@ -2,47 +2,103 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
-#include <chrono>
-#include <thread>
-
+#include <fmt/format.h>
#include <libusb.h>
#include "common/logging/log.h"
#include "common/param_package.h"
#include "common/settings_input.h"
-#include "input_common/gcadapter/gc_adapter.h"
+#include "common/thread.h"
+#include "input_common/drivers/gc_adapter.h"
+
+namespace InputCommon {
+
+class LibUSBContext {
+public:
+ explicit LibUSBContext() {
+ init_result = libusb_init(&ctx);
+ }
+
+ ~LibUSBContext() {
+ libusb_exit(ctx);
+ }
+
+ LibUSBContext& operator=(const LibUSBContext&) = delete;
+ LibUSBContext(const LibUSBContext&) = delete;
+
+ LibUSBContext& operator=(LibUSBContext&&) noexcept = delete;
+ LibUSBContext(LibUSBContext&&) noexcept = delete;
+
+ [[nodiscard]] int InitResult() const noexcept {
+ return init_result;
+ }
+
+ [[nodiscard]] libusb_context* get() noexcept {
+ return ctx;
+ }
+
+private:
+ libusb_context* ctx;
+ int init_result{};
+};
+
+class LibUSBDeviceHandle {
+public:
+ explicit LibUSBDeviceHandle(libusb_context* ctx, uint16_t vid, uint16_t pid) noexcept {
+ handle = libusb_open_device_with_vid_pid(ctx, vid, pid);
+ }
+
+ ~LibUSBDeviceHandle() noexcept {
+ if (handle) {
+ libusb_release_interface(handle, 1);
+ libusb_close(handle);
+ }
+ }
-namespace GCAdapter {
+ LibUSBDeviceHandle& operator=(const LibUSBDeviceHandle&) = delete;
+ LibUSBDeviceHandle(const LibUSBDeviceHandle&) = delete;
-Adapter::Adapter() {
- if (usb_adapter_handle != nullptr) {
+ LibUSBDeviceHandle& operator=(LibUSBDeviceHandle&&) noexcept = delete;
+ LibUSBDeviceHandle(LibUSBDeviceHandle&&) noexcept = delete;
+
+ [[nodiscard]] libusb_device_handle* get() noexcept {
+ return handle;
+ }
+
+private:
+ libusb_device_handle* handle{};
+};
+
+GCAdapter::GCAdapter(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ if (usb_adapter_handle) {
return;
}
- LOG_INFO(Input, "GC Adapter Initialization started");
+ LOG_DEBUG(Input, "Initialization started");
- const int init_res = libusb_init(&libusb_ctx);
+ libusb_ctx = std::make_unique<LibUSBContext>();
+ const int init_res = libusb_ctx->InitResult();
if (init_res == LIBUSB_SUCCESS) {
- adapter_scan_thread = std::thread(&Adapter::AdapterScanThread, this);
+ adapter_scan_thread =
+ std::jthread([this](std::stop_token stop_token) { AdapterScanThread(stop_token); });
} else {
LOG_ERROR(Input, "libusb could not be initialized. failed with error = {}", init_res);
}
}
-Adapter::~Adapter() {
+GCAdapter::~GCAdapter() {
Reset();
}
-void Adapter::AdapterInputThread() {
- LOG_DEBUG(Input, "GC Adapter input thread started");
+void GCAdapter::AdapterInputThread(std::stop_token stop_token) {
+ LOG_DEBUG(Input, "Input thread started");
+ Common::SetCurrentThreadName("yuzu:input:GCAdapter");
s32 payload_size{};
AdapterPayload adapter_payload{};
- if (adapter_scan_thread.joinable()) {
- adapter_scan_thread.join();
- }
+ adapter_scan_thread = {};
- while (adapter_input_thread_running) {
- libusb_interrupt_transfer(usb_adapter_handle, input_endpoint, adapter_payload.data(),
+ while (!stop_token.stop_requested()) {
+ libusb_interrupt_transfer(usb_adapter_handle->get(), input_endpoint, adapter_payload.data(),
static_cast<s32>(adapter_payload.size()), &payload_size, 16);
if (IsPayloadCorrect(adapter_payload, payload_size)) {
UpdateControllers(adapter_payload);
@@ -52,19 +108,20 @@ void Adapter::AdapterInputThread() {
}
if (restart_scan_thread) {
- adapter_scan_thread = std::thread(&Adapter::AdapterScanThread, this);
+ adapter_scan_thread =
+ std::jthread([this](std::stop_token token) { AdapterScanThread(token); });
restart_scan_thread = false;
}
}
-bool Adapter::IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payload_size) {
+bool GCAdapter::IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payload_size) {
if (payload_size != static_cast<s32>(adapter_payload.size()) ||
adapter_payload[0] != LIBUSB_DT_HID) {
LOG_DEBUG(Input, "Error reading payload (size: {}, type: {:02x})", payload_size,
adapter_payload[0]);
if (input_error_counter++ > 20) {
- LOG_ERROR(Input, "GC adapter timeout, Is the adapter connected?");
- adapter_input_thread_running = false;
+ LOG_ERROR(Input, "Timeout, Is the adapter connected?");
+ adapter_input_thread.request_stop();
restart_scan_thread = true;
}
return false;
@@ -74,7 +131,7 @@ bool Adapter::IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payloa
return true;
}
-void Adapter::UpdateControllers(const AdapterPayload& adapter_payload) {
+void GCAdapter::UpdateControllers(const AdapterPayload& adapter_payload) {
for (std::size_t port = 0; port < pads.size(); ++port) {
const std::size_t offset = 1 + (9 * port);
const auto type = static_cast<ControllerTypes>(adapter_payload[offset] >> 4);
@@ -84,23 +141,24 @@ void Adapter::UpdateControllers(const AdapterPayload& adapter_payload) {
const u8 b2 = adapter_payload[offset + 2];
UpdateStateButtons(port, b1, b2);
UpdateStateAxes(port, adapter_payload);
- if (configuring) {
- UpdateYuzuSettings(port);
- }
}
}
}
-void Adapter::UpdatePadType(std::size_t port, ControllerTypes pad_type) {
+void GCAdapter::UpdatePadType(std::size_t port, ControllerTypes pad_type) {
if (pads[port].type == pad_type) {
return;
}
// Device changed reset device and set new type
- ResetDevice(port);
+ pads[port].axis_origin = {};
+ pads[port].reset_origin_counter = {};
+ pads[port].enable_vibration = {};
+ pads[port].rumble_amplitude = {};
pads[port].type = pad_type;
}
-void Adapter::UpdateStateButtons(std::size_t port, u8 b1, u8 b2) {
+void GCAdapter::UpdateStateButtons(std::size_t port, [[maybe_unused]] u8 b1,
+ [[maybe_unused]] u8 b2) {
if (port >= pads.size()) {
return;
}
@@ -116,25 +174,21 @@ void Adapter::UpdateStateButtons(std::size_t port, u8 b1, u8 b2) {
PadButton::TriggerR,
PadButton::TriggerL,
};
- pads[port].buttons = 0;
+
for (std::size_t i = 0; i < b1_buttons.size(); ++i) {
- if ((b1 & (1U << i)) != 0) {
- pads[port].buttons =
- static_cast<u16>(pads[port].buttons | static_cast<u16>(b1_buttons[i]));
- pads[port].last_button = b1_buttons[i];
- }
+ const bool button_status = (b1 & (1U << i)) != 0;
+ const int button = static_cast<int>(b1_buttons[i]);
+ SetButton(pads[port].identifier, button, button_status);
}
for (std::size_t j = 0; j < b2_buttons.size(); ++j) {
- if ((b2 & (1U << j)) != 0) {
- pads[port].buttons =
- static_cast<u16>(pads[port].buttons | static_cast<u16>(b2_buttons[j]));
- pads[port].last_button = b2_buttons[j];
- }
+ const bool button_status = (b2 & (1U << j)) != 0;
+ const int button = static_cast<int>(b2_buttons[j]);
+ SetButton(pads[port].identifier, button, button_status);
}
}
-void Adapter::UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_payload) {
+void GCAdapter::UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_payload) {
if (port >= pads.size()) {
return;
}
@@ -155,134 +209,63 @@ void Adapter::UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_pa
pads[port].axis_origin[index] = axis_value;
pads[port].reset_origin_counter++;
}
- pads[port].axis_values[index] =
- static_cast<s16>(axis_value - pads[port].axis_origin[index]);
- }
-}
-
-void Adapter::UpdateYuzuSettings(std::size_t port) {
- if (port >= pads.size()) {
- return;
- }
-
- constexpr u8 axis_threshold = 50;
- GCPadStatus pad_status = {.port = port};
-
- if (pads[port].buttons != 0) {
- pad_status.button = pads[port].last_button;
- pad_queue.Push(pad_status);
- }
-
- // Accounting for a threshold here to ensure an intentional press
- for (std::size_t i = 0; i < pads[port].axis_values.size(); ++i) {
- const s16 value = pads[port].axis_values[i];
-
- if (value > axis_threshold || value < -axis_threshold) {
- pad_status.axis = static_cast<PadAxes>(i);
- pad_status.axis_value = value;
- pad_status.axis_threshold = axis_threshold;
- pad_queue.Push(pad_status);
- }
- }
-}
-
-void Adapter::UpdateVibrations() {
- // Use 8 states to keep the switching between on/off fast enough for
- // a human to not notice the difference between switching from on/off
- // More states = more rumble strengths = slower update time
- constexpr u8 vibration_states = 8;
-
- vibration_counter = (vibration_counter + 1) % vibration_states;
-
- for (GCController& pad : pads) {
- const bool vibrate = pad.rumble_amplitude > vibration_counter;
- vibration_changed |= vibrate != pad.enable_vibration;
- pad.enable_vibration = vibrate;
- }
- SendVibrations();
-}
-
-void Adapter::SendVibrations() {
- if (!rumble_enabled || !vibration_changed) {
- return;
- }
- s32 size{};
- constexpr u8 rumble_command = 0x11;
- const u8 p1 = pads[0].enable_vibration;
- const u8 p2 = pads[1].enable_vibration;
- const u8 p3 = pads[2].enable_vibration;
- const u8 p4 = pads[3].enable_vibration;
- std::array<u8, 5> payload = {rumble_command, p1, p2, p3, p4};
- const int err = libusb_interrupt_transfer(usb_adapter_handle, output_endpoint, payload.data(),
- static_cast<s32>(payload.size()), &size, 16);
- if (err) {
- LOG_DEBUG(Input, "Adapter libusb write failed: {}", libusb_error_name(err));
- if (output_error_counter++ > 5) {
- LOG_ERROR(Input, "GC adapter output timeout, Rumble disabled");
- rumble_enabled = false;
- }
- return;
+ const f32 axis_status = (axis_value - pads[port].axis_origin[index]) / 100.0f;
+ SetAxis(pads[port].identifier, static_cast<int>(index), axis_status);
}
- output_error_counter = 0;
- vibration_changed = false;
}
-bool Adapter::RumblePlay(std::size_t port, u8 amplitude) {
- pads[port].rumble_amplitude = amplitude;
-
- return rumble_enabled;
-}
-
-void Adapter::AdapterScanThread() {
- adapter_scan_thread_running = true;
- adapter_input_thread_running = false;
- if (adapter_input_thread.joinable()) {
- adapter_input_thread.join();
- }
- ClearLibusbHandle();
- ResetDevices();
- while (adapter_scan_thread_running && !adapter_input_thread_running) {
- Setup();
- std::this_thread::sleep_for(std::chrono::seconds(1));
+void GCAdapter::AdapterScanThread(std::stop_token stop_token) {
+ Common::SetCurrentThreadName("yuzu:input:ScanGCAdapter");
+ usb_adapter_handle = nullptr;
+ pads = {};
+ while (!stop_token.stop_requested() && !Setup()) {
+ std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
-void Adapter::Setup() {
- usb_adapter_handle = libusb_open_device_with_vid_pid(libusb_ctx, 0x057e, 0x0337);
-
- if (usb_adapter_handle == NULL) {
- return;
+bool GCAdapter::Setup() {
+ constexpr u16 nintendo_vid = 0x057e;
+ constexpr u16 gc_adapter_pid = 0x0337;
+ usb_adapter_handle =
+ std::make_unique<LibUSBDeviceHandle>(libusb_ctx->get(), nintendo_vid, gc_adapter_pid);
+ if (!usb_adapter_handle->get()) {
+ return false;
}
if (!CheckDeviceAccess()) {
- ClearLibusbHandle();
- return;
+ usb_adapter_handle = nullptr;
+ return false;
}
- libusb_device* device = libusb_get_device(usb_adapter_handle);
+ libusb_device* const device = libusb_get_device(usb_adapter_handle->get());
LOG_INFO(Input, "GC adapter is now connected");
// GC Adapter found and accessible, registering it
if (GetGCEndpoint(device)) {
- adapter_scan_thread_running = false;
- adapter_input_thread_running = true;
rumble_enabled = true;
input_error_counter = 0;
output_error_counter = 0;
- adapter_input_thread = std::thread(&Adapter::AdapterInputThread, this);
- }
-}
-bool Adapter::CheckDeviceAccess() {
- // This fixes payload problems from offbrand GCAdapters
- const s32 control_transfer_error =
- libusb_control_transfer(usb_adapter_handle, 0x21, 11, 0x0001, 0, nullptr, 0, 1000);
- if (control_transfer_error < 0) {
- LOG_ERROR(Input, "libusb_control_transfer failed with error= {}", control_transfer_error);
+ std::size_t port = 0;
+ for (GCController& pad : pads) {
+ pad.identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = port++,
+ .pad = 0,
+ };
+ PreSetController(pad.identifier);
+ }
+
+ adapter_input_thread =
+ std::jthread([this](std::stop_token stop_token) { AdapterInputThread(stop_token); });
+ return true;
}
+ return false;
+}
- s32 kernel_driver_error = libusb_kernel_driver_active(usb_adapter_handle, 0);
+bool GCAdapter::CheckDeviceAccess() {
+ s32 kernel_driver_error = libusb_kernel_driver_active(usb_adapter_handle->get(), 0);
if (kernel_driver_error == 1) {
- kernel_driver_error = libusb_detach_kernel_driver(usb_adapter_handle, 0);
+ kernel_driver_error = libusb_detach_kernel_driver(usb_adapter_handle->get(), 0);
if (kernel_driver_error != 0 && kernel_driver_error != LIBUSB_ERROR_NOT_SUPPORTED) {
LOG_ERROR(Input, "libusb_detach_kernel_driver failed with error = {}",
kernel_driver_error);
@@ -290,23 +273,28 @@ bool Adapter::CheckDeviceAccess() {
}
if (kernel_driver_error && kernel_driver_error != LIBUSB_ERROR_NOT_SUPPORTED) {
- libusb_close(usb_adapter_handle);
usb_adapter_handle = nullptr;
return false;
}
- const int interface_claim_error = libusb_claim_interface(usb_adapter_handle, 0);
+ const int interface_claim_error = libusb_claim_interface(usb_adapter_handle->get(), 0);
if (interface_claim_error) {
LOG_ERROR(Input, "libusb_claim_interface failed with error = {}", interface_claim_error);
- libusb_close(usb_adapter_handle);
usb_adapter_handle = nullptr;
return false;
}
+ // This fixes payload problems from offbrand GCAdapters
+ const s32 control_transfer_error =
+ libusb_control_transfer(usb_adapter_handle->get(), 0x21, 11, 0x0001, 0, nullptr, 0, 1000);
+ if (control_transfer_error < 0) {
+ LOG_ERROR(Input, "libusb_control_transfer failed with error= {}", control_transfer_error);
+ }
+
return true;
}
-bool Adapter::GetGCEndpoint(libusb_device* device) {
+bool GCAdapter::GetGCEndpoint(libusb_device* device) {
libusb_config_descriptor* config = nullptr;
const int config_descriptor_return = libusb_get_config_descriptor(device, 0, &config);
if (config_descriptor_return != LIBUSB_SUCCESS) {
@@ -332,77 +320,95 @@ bool Adapter::GetGCEndpoint(libusb_device* device) {
// This transfer seems to be responsible for clearing the state of the adapter
// Used to clear the "busy" state of when the device is unexpectedly unplugged
unsigned char clear_payload = 0x13;
- libusb_interrupt_transfer(usb_adapter_handle, output_endpoint, &clear_payload,
+ libusb_interrupt_transfer(usb_adapter_handle->get(), output_endpoint, &clear_payload,
sizeof(clear_payload), nullptr, 16);
return true;
}
-void Adapter::JoinThreads() {
- restart_scan_thread = false;
- adapter_input_thread_running = false;
- adapter_scan_thread_running = false;
+Common::Input::VibrationError GCAdapter::SetRumble(
+ const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) {
+ const auto mean_amplitude = (vibration.low_amplitude + vibration.high_amplitude) * 0.5f;
+ const auto processed_amplitude =
+ static_cast<u8>((mean_amplitude + std::pow(mean_amplitude, 0.3f)) * 0.5f * 0x8);
- if (adapter_scan_thread.joinable()) {
- adapter_scan_thread.join();
- }
+ pads[identifier.port].rumble_amplitude = processed_amplitude;
- if (adapter_input_thread.joinable()) {
- adapter_input_thread.join();
+ if (!rumble_enabled) {
+ return Common::Input::VibrationError::Disabled;
}
+ return Common::Input::VibrationError::None;
}
-void Adapter::ClearLibusbHandle() {
- if (usb_adapter_handle) {
- libusb_release_interface(usb_adapter_handle, 1);
- libusb_close(usb_adapter_handle);
- usb_adapter_handle = nullptr;
+void GCAdapter::UpdateVibrations() {
+ // Use 8 states to keep the switching between on/off fast enough for
+ // a human to feel different vibration strenght
+ // More states == more rumble strengths == slower update time
+ constexpr u8 vibration_states = 8;
+
+ vibration_counter = (vibration_counter + 1) % vibration_states;
+
+ for (GCController& pad : pads) {
+ const bool vibrate = pad.rumble_amplitude > vibration_counter;
+ vibration_changed |= vibrate != pad.enable_vibration;
+ pad.enable_vibration = vibrate;
}
+ SendVibrations();
}
-void Adapter::ResetDevices() {
- for (std::size_t i = 0; i < pads.size(); ++i) {
- ResetDevice(i);
+void GCAdapter::SendVibrations() {
+ if (!rumble_enabled || !vibration_changed) {
+ return;
+ }
+ s32 size{};
+ constexpr u8 rumble_command = 0x11;
+ const u8 p1 = pads[0].enable_vibration;
+ const u8 p2 = pads[1].enable_vibration;
+ const u8 p3 = pads[2].enable_vibration;
+ const u8 p4 = pads[3].enable_vibration;
+ std::array<u8, 5> payload = {rumble_command, p1, p2, p3, p4};
+ const int err =
+ libusb_interrupt_transfer(usb_adapter_handle->get(), output_endpoint, payload.data(),
+ static_cast<s32>(payload.size()), &size, 16);
+ if (err) {
+ LOG_DEBUG(Input, "Libusb write failed: {}", libusb_error_name(err));
+ if (output_error_counter++ > 5) {
+ LOG_ERROR(Input, "Output timeout, Rumble disabled");
+ rumble_enabled = false;
+ }
+ return;
}
+ output_error_counter = 0;
+ vibration_changed = false;
}
-void Adapter::ResetDevice(std::size_t port) {
- pads[port].type = ControllerTypes::None;
- pads[port].enable_vibration = false;
- pads[port].rumble_amplitude = 0;
- pads[port].buttons = 0;
- pads[port].last_button = PadButton::Undefined;
- pads[port].axis_values.fill(0);
- pads[port].reset_origin_counter = 0;
+bool GCAdapter::DeviceConnected(std::size_t port) const {
+ return pads[port].type != ControllerTypes::None;
}
-void Adapter::Reset() {
- JoinThreads();
- ClearLibusbHandle();
- ResetDevices();
-
- if (libusb_ctx) {
- libusb_exit(libusb_ctx);
- }
+void GCAdapter::Reset() {
+ adapter_scan_thread = {};
+ adapter_input_thread = {};
+ usb_adapter_handle = nullptr;
+ pads = {};
+ libusb_ctx = nullptr;
}
-std::vector<Common::ParamPackage> Adapter::GetInputDevices() const {
+std::vector<Common::ParamPackage> GCAdapter::GetInputDevices() const {
std::vector<Common::ParamPackage> devices;
for (std::size_t port = 0; port < pads.size(); ++port) {
if (!DeviceConnected(port)) {
continue;
}
- std::string name = fmt::format("Gamecube Controller {}", port + 1);
- devices.emplace_back(Common::ParamPackage{
- {"class", "gcpad"},
- {"display", std::move(name)},
- {"port", std::to_string(port)},
- });
+ Common::ParamPackage identifier{};
+ identifier.Set("engine", GetEngineName());
+ identifier.Set("display", fmt::format("Gamecube Controller {}", port + 1));
+ identifier.Set("port", static_cast<int>(port));
+ devices.emplace_back(identifier);
}
return devices;
}
-InputCommon::ButtonMapping Adapter::GetButtonMappingForDevice(
- const Common::ParamPackage& params) const {
+ButtonMapping GCAdapter::GetButtonMappingForDevice(const Common::ParamPackage& params) {
// This list is missing ZL/ZR since those are not considered buttons.
// We will add those afterwards
// This list also excludes any button that can't be really mapped
@@ -425,47 +431,49 @@ InputCommon::ButtonMapping Adapter::GetButtonMappingForDevice(
return {};
}
- InputCommon::ButtonMapping mapping{};
+ ButtonMapping mapping{};
for (const auto& [switch_button, gcadapter_button] : switch_to_gcadapter_button) {
- Common::ParamPackage button_params({{"engine", "gcpad"}});
+ Common::ParamPackage button_params{};
+ button_params.Set("engine", GetEngineName());
button_params.Set("port", params.Get("port", 0));
button_params.Set("button", static_cast<int>(gcadapter_button));
mapping.insert_or_assign(switch_button, std::move(button_params));
}
// Add the missing bindings for ZL/ZR
- static constexpr std::array<std::pair<Settings::NativeButton::Values, PadAxes>, 2>
+ static constexpr std::array<std::tuple<Settings::NativeButton::Values, PadButton, PadAxes>, 2>
switch_to_gcadapter_axis = {
- std::pair{Settings::NativeButton::ZL, PadAxes::TriggerLeft},
- {Settings::NativeButton::ZR, PadAxes::TriggerRight},
+ std::tuple{Settings::NativeButton::ZL, PadButton::TriggerL, PadAxes::TriggerLeft},
+ {Settings::NativeButton::ZR, PadButton::TriggerR, PadAxes::TriggerRight},
};
- for (const auto& [switch_button, gcadapter_axis] : switch_to_gcadapter_axis) {
- Common::ParamPackage button_params({{"engine", "gcpad"}});
+ for (const auto& [switch_button, gcadapter_buton, gcadapter_axis] : switch_to_gcadapter_axis) {
+ Common::ParamPackage button_params{};
+ button_params.Set("engine", GetEngineName());
button_params.Set("port", params.Get("port", 0));
- button_params.Set("button", static_cast<s32>(PadButton::Stick));
+ button_params.Set("button", static_cast<s32>(gcadapter_buton));
button_params.Set("axis", static_cast<s32>(gcadapter_axis));
button_params.Set("threshold", 0.5f);
+ button_params.Set("range", 1.9f);
button_params.Set("direction", "+");
mapping.insert_or_assign(switch_button, std::move(button_params));
}
return mapping;
}
-InputCommon::AnalogMapping Adapter::GetAnalogMappingForDevice(
- const Common::ParamPackage& params) const {
+AnalogMapping GCAdapter::GetAnalogMappingForDevice(const Common::ParamPackage& params) {
if (!params.Has("port")) {
return {};
}
- InputCommon::AnalogMapping mapping = {};
+ AnalogMapping mapping = {};
Common::ParamPackage left_analog_params;
- left_analog_params.Set("engine", "gcpad");
+ left_analog_params.Set("engine", GetEngineName());
left_analog_params.Set("port", params.Get("port", 0));
left_analog_params.Set("axis_x", static_cast<int>(PadAxes::StickX));
left_analog_params.Set("axis_y", static_cast<int>(PadAxes::StickY));
mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params));
Common::ParamPackage right_analog_params;
- right_analog_params.Set("engine", "gcpad");
+ right_analog_params.Set("engine", GetEngineName());
right_analog_params.Set("port", params.Get("port", 0));
right_analog_params.Set("axis_x", static_cast<int>(PadAxes::SubstickX));
right_analog_params.Set("axis_y", static_cast<int>(PadAxes::SubstickY));
@@ -473,34 +481,47 @@ InputCommon::AnalogMapping Adapter::GetAnalogMappingForDevice(
return mapping;
}
-bool Adapter::DeviceConnected(std::size_t port) const {
- return pads[port].type != ControllerTypes::None;
-}
-
-void Adapter::BeginConfiguration() {
- pad_queue.Clear();
- configuring = true;
-}
-
-void Adapter::EndConfiguration() {
- pad_queue.Clear();
- configuring = false;
-}
-
-Common::SPSCQueue<GCPadStatus>& Adapter::GetPadQueue() {
- return pad_queue;
-}
-
-const Common::SPSCQueue<GCPadStatus>& Adapter::GetPadQueue() const {
- return pad_queue;
+Common::Input::ButtonNames GCAdapter::GetUIButtonName(const Common::ParamPackage& params) const {
+ PadButton button = static_cast<PadButton>(params.Get("button", 0));
+ switch (button) {
+ case PadButton::ButtonLeft:
+ return Common::Input::ButtonNames::ButtonLeft;
+ case PadButton::ButtonRight:
+ return Common::Input::ButtonNames::ButtonRight;
+ case PadButton::ButtonDown:
+ return Common::Input::ButtonNames::ButtonDown;
+ case PadButton::ButtonUp:
+ return Common::Input::ButtonNames::ButtonUp;
+ case PadButton::TriggerZ:
+ return Common::Input::ButtonNames::TriggerZ;
+ case PadButton::TriggerR:
+ return Common::Input::ButtonNames::TriggerR;
+ case PadButton::TriggerL:
+ return Common::Input::ButtonNames::TriggerL;
+ case PadButton::ButtonA:
+ return Common::Input::ButtonNames::ButtonA;
+ case PadButton::ButtonB:
+ return Common::Input::ButtonNames::ButtonB;
+ case PadButton::ButtonX:
+ return Common::Input::ButtonNames::ButtonX;
+ case PadButton::ButtonY:
+ return Common::Input::ButtonNames::ButtonY;
+ case PadButton::ButtonStart:
+ return Common::Input::ButtonNames::ButtonStart;
+ default:
+ return Common::Input::ButtonNames::Undefined;
+ }
}
-GCController& Adapter::GetPadState(std::size_t port) {
- return pads.at(port);
-}
+Common::Input::ButtonNames GCAdapter::GetUIName(const Common::ParamPackage& params) const {
+ if (params.Has("button")) {
+ return GetUIButtonName(params);
+ }
+ if (params.Has("axis")) {
+ return Common::Input::ButtonNames::Value;
+ }
-const GCController& Adapter::GetPadState(std::size_t port) const {
- return pads.at(port);
+ return Common::Input::ButtonNames::Invalid;
}
-} // namespace GCAdapter
+} // namespace InputCommon
diff --git a/src/input_common/drivers/gc_adapter.h b/src/input_common/drivers/gc_adapter.h
new file mode 100644
index 000000000..7ce1912a3
--- /dev/null
+++ b/src/input_common/drivers/gc_adapter.h
@@ -0,0 +1,135 @@
+// Copyright 2014 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include <memory>
+#include <mutex>
+#include <stop_token>
+#include <string>
+#include <thread>
+
+#include "input_common/input_engine.h"
+
+struct libusb_context;
+struct libusb_device;
+struct libusb_device_handle;
+
+namespace InputCommon {
+
+class LibUSBContext;
+class LibUSBDeviceHandle;
+
+class GCAdapter : public InputEngine {
+public:
+ explicit GCAdapter(std::string input_engine_);
+ ~GCAdapter() override;
+
+ Common::Input::VibrationError SetRumble(
+ const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override;
+
+ /// Used for automapping features
+ std::vector<Common::ParamPackage> GetInputDevices() const override;
+ ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override;
+ AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override;
+ Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
+
+private:
+ enum class PadButton {
+ Undefined = 0x0000,
+ ButtonLeft = 0x0001,
+ ButtonRight = 0x0002,
+ ButtonDown = 0x0004,
+ ButtonUp = 0x0008,
+ TriggerZ = 0x0010,
+ TriggerR = 0x0020,
+ TriggerL = 0x0040,
+ ButtonA = 0x0100,
+ ButtonB = 0x0200,
+ ButtonX = 0x0400,
+ ButtonY = 0x0800,
+ ButtonStart = 0x1000,
+ };
+
+ enum class PadAxes : u8 {
+ StickX,
+ StickY,
+ SubstickX,
+ SubstickY,
+ TriggerLeft,
+ TriggerRight,
+ Undefined,
+ };
+
+ enum class ControllerTypes {
+ None,
+ Wired,
+ Wireless,
+ };
+
+ struct GCController {
+ ControllerTypes type = ControllerTypes::None;
+ PadIdentifier identifier{};
+ bool enable_vibration = false;
+ u8 rumble_amplitude{};
+ std::array<u8, 6> axis_origin{};
+ u8 reset_origin_counter{};
+ };
+
+ using AdapterPayload = std::array<u8, 37>;
+
+ void UpdatePadType(std::size_t port, ControllerTypes pad_type);
+ void UpdateControllers(const AdapterPayload& adapter_payload);
+ void UpdateStateButtons(std::size_t port, u8 b1, u8 b2);
+ void UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_payload);
+
+ void AdapterInputThread(std::stop_token stop_token);
+
+ void AdapterScanThread(std::stop_token stop_token);
+
+ bool IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payload_size);
+
+ /// For use in initialization, querying devices to find the adapter
+ bool Setup();
+
+ /// Returns true if we successfully gain access to GC Adapter
+ bool CheckDeviceAccess();
+
+ /// Captures GC Adapter endpoint address
+ /// Returns true if the endpoint was set correctly
+ bool GetGCEndpoint(libusb_device* device);
+
+ /// Returns true if there is a device connected to port
+ bool DeviceConnected(std::size_t port) const;
+
+ /// For shutting down, clear all data, join all threads, release usb
+ void Reset();
+
+ void UpdateVibrations();
+
+ /// Updates vibration state of all controllers
+ void SendVibrations();
+
+ Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const;
+
+ std::unique_ptr<LibUSBDeviceHandle> usb_adapter_handle;
+ std::array<GCController, 4> pads;
+
+ std::jthread adapter_input_thread;
+ std::jthread adapter_scan_thread;
+ bool restart_scan_thread{};
+
+ std::unique_ptr<LibUSBContext> libusb_ctx;
+
+ u8 input_endpoint{0};
+ u8 output_endpoint{0};
+ u8 input_error_counter{0};
+ u8 output_error_counter{0};
+ int vibration_counter{0};
+
+ bool rumble_enabled{true};
+ bool vibration_changed{true};
+};
+} // namespace InputCommon
diff --git a/src/input_common/drivers/keyboard.cpp b/src/input_common/drivers/keyboard.cpp
new file mode 100644
index 000000000..4c1e5bbec
--- /dev/null
+++ b/src/input_common/drivers/keyboard.cpp
@@ -0,0 +1,112 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/param_package.h"
+#include "common/settings_input.h"
+#include "input_common/drivers/keyboard.h"
+
+namespace InputCommon {
+
+constexpr PadIdentifier key_identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = 0,
+ .pad = 0,
+};
+constexpr PadIdentifier keyboard_key_identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = 1,
+ .pad = 0,
+};
+constexpr PadIdentifier keyboard_modifier_identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = 1,
+ .pad = 1,
+};
+
+Keyboard::Keyboard(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ // Keyboard is broken into 3 diferent sets:
+ // key: Unfiltered intended for controllers.
+ // keyboard_key: Allows only Settings::NativeKeyboard::Keys intended for keyboard emulation.
+ // keyboard_modifier: Allows only Settings::NativeKeyboard::Modifiers intended for keyboard
+ // emulation.
+ PreSetController(key_identifier);
+ PreSetController(keyboard_key_identifier);
+ PreSetController(keyboard_modifier_identifier);
+}
+
+void Keyboard::PressKey(int key_code) {
+ SetButton(key_identifier, key_code, true);
+}
+
+void Keyboard::ReleaseKey(int key_code) {
+ SetButton(key_identifier, key_code, false);
+}
+
+void Keyboard::PressKeyboardKey(int key_index) {
+ if (key_index == Settings::NativeKeyboard::None) {
+ return;
+ }
+ SetButton(keyboard_key_identifier, key_index, true);
+}
+
+void Keyboard::ReleaseKeyboardKey(int key_index) {
+ if (key_index == Settings::NativeKeyboard::None) {
+ return;
+ }
+ SetButton(keyboard_key_identifier, key_index, false);
+}
+
+void Keyboard::SetKeyboardModifiers(int key_modifiers) {
+ for (int i = 0; i < 32; ++i) {
+ bool key_value = ((key_modifiers >> i) & 0x1) != 0;
+ SetButton(keyboard_modifier_identifier, i, key_value);
+ // Use the modifier to press the key button equivalent
+ switch (i) {
+ case Settings::NativeKeyboard::LeftControl:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftControlKey, key_value);
+ break;
+ case Settings::NativeKeyboard::LeftShift:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftShiftKey, key_value);
+ break;
+ case Settings::NativeKeyboard::LeftAlt:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftAltKey, key_value);
+ break;
+ case Settings::NativeKeyboard::LeftMeta:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftMetaKey, key_value);
+ break;
+ case Settings::NativeKeyboard::RightControl:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightControlKey,
+ key_value);
+ break;
+ case Settings::NativeKeyboard::RightShift:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightShiftKey, key_value);
+ break;
+ case Settings::NativeKeyboard::RightAlt:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightAltKey, key_value);
+ break;
+ case Settings::NativeKeyboard::RightMeta:
+ SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightMetaKey, key_value);
+ break;
+ default:
+ // Other modifier keys should be pressed with PressKey since they stay enabled until
+ // next press
+ break;
+ }
+ }
+}
+
+void Keyboard::ReleaseAllKeys() {
+ ResetButtonState();
+}
+
+std::vector<Common::ParamPackage> Keyboard::GetInputDevices() const {
+ std::vector<Common::ParamPackage> devices;
+ devices.emplace_back(Common::ParamPackage{
+ {"engine", GetEngineName()},
+ {"display", "Keyboard Only"},
+ });
+ return devices;
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/keyboard.h b/src/input_common/drivers/keyboard.h
new file mode 100644
index 000000000..3856c882c
--- /dev/null
+++ b/src/input_common/drivers/keyboard.h
@@ -0,0 +1,56 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include "input_common/input_engine.h"
+
+namespace InputCommon {
+
+/**
+ * A button device factory representing a keyboard. It receives keyboard events and forward them
+ * to all button devices it created.
+ */
+class Keyboard final : public InputEngine {
+public:
+ explicit Keyboard(std::string input_engine_);
+
+ /**
+ * Sets the status of all buttons bound with the key to pressed
+ * @param key_code the code of the key to press
+ */
+ void PressKey(int key_code);
+
+ /**
+ * Sets the status of all buttons bound with the key to released
+ * @param key_code the code of the key to release
+ */
+ void ReleaseKey(int key_code);
+
+ /**
+ * Sets the status of the keyboard key to pressed
+ * @param key_index index of the key to press
+ */
+ void PressKeyboardKey(int key_index);
+
+ /**
+ * Sets the status of the keyboard key to released
+ * @param key_index index of the key to release
+ */
+ void ReleaseKeyboardKey(int key_index);
+
+ /**
+ * Sets the status of all keyboard modifier keys
+ * @param key_modifiers the code of the key to release
+ */
+ void SetKeyboardModifiers(int key_modifiers);
+
+ /// Sets all keys to the non pressed state
+ void ReleaseAllKeys();
+
+ /// Used for automapping features
+ std::vector<Common::ParamPackage> GetInputDevices() const override;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/mouse.cpp b/src/input_common/drivers/mouse.cpp
new file mode 100644
index 000000000..aa69216c8
--- /dev/null
+++ b/src/input_common/drivers/mouse.cpp
@@ -0,0 +1,185 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include <stop_token>
+#include <thread>
+#include <fmt/format.h>
+
+#include "common/param_package.h"
+#include "common/settings.h"
+#include "common/thread.h"
+#include "input_common/drivers/mouse.h"
+
+namespace InputCommon {
+constexpr int mouse_axis_x = 0;
+constexpr int mouse_axis_y = 1;
+constexpr int wheel_axis_x = 2;
+constexpr int wheel_axis_y = 3;
+constexpr int touch_axis_x = 10;
+constexpr int touch_axis_y = 11;
+constexpr PadIdentifier identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = 0,
+ .pad = 0,
+};
+
+Mouse::Mouse(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ PreSetController(identifier);
+ PreSetAxis(identifier, mouse_axis_x);
+ PreSetAxis(identifier, mouse_axis_y);
+ PreSetAxis(identifier, wheel_axis_x);
+ PreSetAxis(identifier, wheel_axis_y);
+ PreSetAxis(identifier, touch_axis_x);
+ PreSetAxis(identifier, touch_axis_x);
+ update_thread = std::jthread([this](std::stop_token stop_token) { UpdateThread(stop_token); });
+}
+
+void Mouse::UpdateThread(std::stop_token stop_token) {
+ Common::SetCurrentThreadName("yuzu:input:Mouse");
+ constexpr int update_time = 10;
+ while (!stop_token.stop_requested()) {
+ if (Settings::values.mouse_panning && !Settings::values.mouse_enabled) {
+ // Slow movement by 4%
+ last_mouse_change *= 0.96f;
+ const float sensitivity =
+ Settings::values.mouse_panning_sensitivity.GetValue() * 0.022f;
+ SetAxis(identifier, mouse_axis_x, last_mouse_change.x * sensitivity);
+ SetAxis(identifier, mouse_axis_y, -last_mouse_change.y * sensitivity);
+ }
+
+ if (mouse_panning_timout++ > 20) {
+ StopPanning();
+ }
+ std::this_thread::sleep_for(std::chrono::milliseconds(update_time));
+ }
+}
+
+void Mouse::MouseMove(int x, int y, f32 touch_x, f32 touch_y, int center_x, int center_y) {
+ // If native mouse is enabled just set the screen coordinates
+ if (Settings::values.mouse_enabled) {
+ SetAxis(identifier, mouse_axis_x, touch_x);
+ SetAxis(identifier, mouse_axis_y, touch_y);
+ return;
+ }
+
+ SetAxis(identifier, touch_axis_x, touch_x);
+ SetAxis(identifier, touch_axis_y, touch_y);
+
+ if (Settings::values.mouse_panning) {
+ auto mouse_change =
+ (Common::MakeVec(x, y) - Common::MakeVec(center_x, center_y)).Cast<float>();
+ mouse_panning_timout = 0;
+
+ const auto move_distance = mouse_change.Length();
+ if (move_distance == 0) {
+ return;
+ }
+
+ // Make slow movements at least 3 units on lenght
+ if (move_distance < 3.0f) {
+ // Normalize value
+ mouse_change /= move_distance;
+ mouse_change *= 3.0f;
+ }
+
+ // Average mouse movements
+ last_mouse_change = (last_mouse_change * 0.91f) + (mouse_change * 0.09f);
+
+ const auto last_move_distance = last_mouse_change.Length();
+
+ // Make fast movements clamp to 8 units on lenght
+ if (last_move_distance > 8.0f) {
+ // Normalize value
+ last_mouse_change /= last_move_distance;
+ last_mouse_change *= 8.0f;
+ }
+
+ // Ignore average if it's less than 1 unit and use current movement value
+ if (last_move_distance < 1.0f) {
+ last_mouse_change = mouse_change / mouse_change.Length();
+ }
+
+ return;
+ }
+
+ if (button_pressed) {
+ const auto mouse_move = Common::MakeVec<int>(x, y) - mouse_origin;
+ const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue() * 0.0012f;
+ SetAxis(identifier, mouse_axis_x, static_cast<float>(mouse_move.x) * sensitivity);
+ SetAxis(identifier, mouse_axis_y, static_cast<float>(-mouse_move.y) * sensitivity);
+ }
+}
+
+void Mouse::PressButton(int x, int y, f32 touch_x, f32 touch_y, MouseButton button) {
+ SetAxis(identifier, touch_axis_x, touch_x);
+ SetAxis(identifier, touch_axis_y, touch_y);
+ SetButton(identifier, static_cast<int>(button), true);
+ // Set initial analog parameters
+ mouse_origin = {x, y};
+ last_mouse_position = {x, y};
+ button_pressed = true;
+}
+
+void Mouse::ReleaseButton(MouseButton button) {
+ SetButton(identifier, static_cast<int>(button), false);
+
+ if (!Settings::values.mouse_panning && !Settings::values.mouse_enabled) {
+ SetAxis(identifier, mouse_axis_x, 0);
+ SetAxis(identifier, mouse_axis_y, 0);
+ }
+ button_pressed = false;
+}
+
+void Mouse::MouseWheelChange(int x, int y) {
+ wheel_position.x += x;
+ wheel_position.y += y;
+ SetAxis(identifier, wheel_axis_x, static_cast<f32>(wheel_position.x));
+ SetAxis(identifier, wheel_axis_y, static_cast<f32>(wheel_position.y));
+}
+
+void Mouse::ReleaseAllButtons() {
+ ResetButtonState();
+ button_pressed = false;
+}
+
+void Mouse::StopPanning() {
+ last_mouse_change = {};
+}
+
+std::vector<Common::ParamPackage> Mouse::GetInputDevices() const {
+ std::vector<Common::ParamPackage> devices;
+ devices.emplace_back(Common::ParamPackage{
+ {"engine", GetEngineName()},
+ {"display", "Keyboard/Mouse"},
+ });
+ return devices;
+}
+
+AnalogMapping Mouse::GetAnalogMappingForDevice(
+ [[maybe_unused]] const Common::ParamPackage& params) {
+ // Only overwrite different buttons from default
+ AnalogMapping mapping = {};
+ Common::ParamPackage right_analog_params;
+ right_analog_params.Set("engine", GetEngineName());
+ right_analog_params.Set("axis_x", 0);
+ right_analog_params.Set("axis_y", 1);
+ right_analog_params.Set("threshold", 0.5f);
+ right_analog_params.Set("range", 1.0f);
+ right_analog_params.Set("deadzone", 0.0f);
+ mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params));
+ return mapping;
+}
+
+Common::Input::ButtonNames Mouse::GetUIName(const Common::ParamPackage& params) const {
+ if (params.Has("button")) {
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("axis")) {
+ return Common::Input::ButtonNames::Value;
+ }
+
+ return Common::Input::ButtonNames::Invalid;
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/mouse.h b/src/input_common/drivers/mouse.h
new file mode 100644
index 000000000..040446178
--- /dev/null
+++ b/src/input_common/drivers/mouse.h
@@ -0,0 +1,81 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include <stop_token>
+#include <thread>
+
+#include "common/vector_math.h"
+#include "input_common/input_engine.h"
+
+namespace InputCommon {
+
+enum class MouseButton {
+ Left,
+ Right,
+ Wheel,
+ Backward,
+ Forward,
+ Task,
+ Extra,
+ Undefined,
+};
+
+/**
+ * A button device factory representing a keyboard. It receives keyboard events and forward them
+ * to all button devices it created.
+ */
+class Mouse final : public InputEngine {
+public:
+ explicit Mouse(std::string input_engine_);
+
+ /**
+ * Signals that mouse has moved.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ * @param center_x the x-coordinate of the middle of the screen
+ * @param center_y the y-coordinate of the middle of the screen
+ */
+ void MouseMove(int x, int y, f32 touch_x, f32 touch_y, int center_x, int center_y);
+
+ /**
+ * Sets the status of all buttons bound with the key to pressed
+ * @param key_code the code of the key to press
+ */
+ void PressButton(int x, int y, f32 touch_x, f32 touch_y, MouseButton button);
+
+ /**
+ * Sets the status of all buttons bound with the key to released
+ * @param key_code the code of the key to release
+ */
+ void ReleaseButton(MouseButton button);
+
+ /**
+ * Sets the status of the mouse wheel
+ * @param x delta movement in the x direction
+ * @param y delta movement in the y direction
+ */
+ void MouseWheelChange(int x, int y);
+
+ void ReleaseAllButtons();
+
+ std::vector<Common::ParamPackage> GetInputDevices() const override;
+ AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override;
+ Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
+
+private:
+ void UpdateThread(std::stop_token stop_token);
+ void StopPanning();
+
+ Common::Vec2<int> mouse_origin;
+ Common::Vec2<int> last_mouse_position;
+ Common::Vec2<float> last_mouse_change;
+ Common::Vec2<int> wheel_position;
+ bool button_pressed;
+ int mouse_panning_timout{};
+ std::jthread update_thread;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp
new file mode 100644
index 000000000..0cda9df62
--- /dev/null
+++ b/src/input_common/drivers/sdl_driver.cpp
@@ -0,0 +1,926 @@
+// Copyright 2018 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "common/logging/log.h"
+#include "common/math_util.h"
+#include "common/param_package.h"
+#include "common/settings.h"
+#include "common/thread.h"
+#include "common/vector_math.h"
+#include "input_common/drivers/sdl_driver.h"
+
+namespace InputCommon {
+
+namespace {
+std::string GetGUID(SDL_Joystick* joystick) {
+ const SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick);
+ char guid_str[33];
+ SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str));
+ return guid_str;
+}
+} // Anonymous namespace
+
+static int SDLEventWatcher(void* user_data, SDL_Event* event) {
+ auto* const sdl_state = static_cast<SDLDriver*>(user_data);
+
+ sdl_state->HandleGameControllerEvent(*event);
+
+ return 0;
+}
+
+class SDLJoystick {
+public:
+ SDLJoystick(std::string guid_, int port_, SDL_Joystick* joystick,
+ SDL_GameController* game_controller)
+ : guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose},
+ sdl_controller{game_controller, &SDL_GameControllerClose} {
+ EnableMotion();
+ }
+
+ void EnableMotion() {
+ if (sdl_controller) {
+ SDL_GameController* controller = sdl_controller.get();
+ if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) && !has_accel) {
+ SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE);
+ has_accel = true;
+ }
+ if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) && !has_gyro) {
+ SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE);
+ has_gyro = true;
+ }
+ }
+ }
+
+ bool HasGyro() const {
+ return has_gyro;
+ }
+
+ bool HasAccel() const {
+ return has_accel;
+ }
+
+ bool UpdateMotion(SDL_ControllerSensorEvent event) {
+ constexpr float gravity_constant = 9.80665f;
+ std::lock_guard lock{mutex};
+ const u64 time_difference = event.timestamp - last_motion_update;
+ last_motion_update = event.timestamp;
+ switch (event.sensor) {
+ case SDL_SENSOR_ACCEL: {
+ motion.accel_x = -event.data[0] / gravity_constant;
+ motion.accel_y = event.data[2] / gravity_constant;
+ motion.accel_z = -event.data[1] / gravity_constant;
+ break;
+ }
+ case SDL_SENSOR_GYRO: {
+ motion.gyro_x = event.data[0] / (Common::PI * 2);
+ motion.gyro_y = -event.data[2] / (Common::PI * 2);
+ motion.gyro_z = event.data[1] / (Common::PI * 2);
+ break;
+ }
+ }
+
+ // Ignore duplicated timestamps
+ if (time_difference == 0) {
+ return false;
+ }
+ motion.delta_timestamp = time_difference * 1000;
+ return true;
+ }
+
+ const BasicMotion& GetMotion() const {
+ return motion;
+ }
+
+ bool RumblePlay(const Common::Input::VibrationStatus vibration) {
+ constexpr u32 rumble_max_duration_ms = 1000;
+ if (sdl_controller) {
+ return SDL_GameControllerRumble(
+ sdl_controller.get(), static_cast<u16>(vibration.low_amplitude),
+ static_cast<u16>(vibration.high_amplitude), rumble_max_duration_ms) != -1;
+ } else if (sdl_joystick) {
+ return SDL_JoystickRumble(sdl_joystick.get(), static_cast<u16>(vibration.low_amplitude),
+ static_cast<u16>(vibration.high_amplitude),
+ rumble_max_duration_ms) != -1;
+ }
+
+ return false;
+ }
+
+ bool HasHDRumble() const {
+ if (sdl_controller) {
+ return (SDL_GameControllerGetType(sdl_controller.get()) ==
+ SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO);
+ }
+ return false;
+ }
+ /**
+ * The Pad identifier of the joystick
+ */
+ const PadIdentifier GetPadIdentifier() const {
+ return {
+ .guid = Common::UUID{guid},
+ .port = static_cast<std::size_t>(port),
+ .pad = 0,
+ };
+ }
+
+ /**
+ * The guid of the joystick
+ */
+ const std::string& GetGUID() const {
+ return guid;
+ }
+
+ /**
+ * The number of joystick from the same type that were connected before this joystick
+ */
+ int GetPort() const {
+ return port;
+ }
+
+ SDL_Joystick* GetSDLJoystick() const {
+ return sdl_joystick.get();
+ }
+
+ SDL_GameController* GetSDLGameController() const {
+ return sdl_controller.get();
+ }
+
+ void SetSDLJoystick(SDL_Joystick* joystick, SDL_GameController* controller) {
+ sdl_joystick.reset(joystick);
+ sdl_controller.reset(controller);
+ }
+
+ bool IsJoyconLeft() const {
+ const std::string controller_name = GetControllerName();
+ if (std::strstr(controller_name.c_str(), "Joy-Con Left") != nullptr) {
+ return true;
+ }
+ if (std::strstr(controller_name.c_str(), "Joy-Con (L)") != nullptr) {
+ return true;
+ }
+ return false;
+ }
+
+ bool IsJoyconRight() const {
+ const std::string controller_name = GetControllerName();
+ if (std::strstr(controller_name.c_str(), "Joy-Con Right") != nullptr) {
+ return true;
+ }
+ if (std::strstr(controller_name.c_str(), "Joy-Con (R)") != nullptr) {
+ return true;
+ }
+ return false;
+ }
+
+ BatteryLevel GetBatteryLevel() {
+ const auto level = SDL_JoystickCurrentPowerLevel(sdl_joystick.get());
+ switch (level) {
+ case SDL_JOYSTICK_POWER_EMPTY:
+ return BatteryLevel::Empty;
+ case SDL_JOYSTICK_POWER_LOW:
+ return BatteryLevel::Critical;
+ case SDL_JOYSTICK_POWER_MEDIUM:
+ return BatteryLevel::Low;
+ case SDL_JOYSTICK_POWER_FULL:
+ return BatteryLevel::Medium;
+ case SDL_JOYSTICK_POWER_MAX:
+ return BatteryLevel::Full;
+ case SDL_JOYSTICK_POWER_UNKNOWN:
+ case SDL_JOYSTICK_POWER_WIRED:
+ default:
+ return BatteryLevel::Charging;
+ }
+ }
+
+ std::string GetControllerName() const {
+ if (sdl_controller) {
+ switch (SDL_GameControllerGetType(sdl_controller.get())) {
+ case SDL_CONTROLLER_TYPE_XBOX360:
+ return "XBox 360 Controller";
+ case SDL_CONTROLLER_TYPE_XBOXONE:
+ return "XBox One Controller";
+ default:
+ break;
+ }
+ const auto name = SDL_GameControllerName(sdl_controller.get());
+ if (name) {
+ return name;
+ }
+ }
+
+ if (sdl_joystick) {
+ const auto name = SDL_JoystickName(sdl_joystick.get());
+ if (name) {
+ return name;
+ }
+ }
+
+ return "Unknown";
+ }
+
+private:
+ std::string guid;
+ int port;
+ std::unique_ptr<SDL_Joystick, decltype(&SDL_JoystickClose)> sdl_joystick;
+ std::unique_ptr<SDL_GameController, decltype(&SDL_GameControllerClose)> sdl_controller;
+ mutable std::mutex mutex;
+
+ u64 last_motion_update{};
+ bool has_gyro{false};
+ bool has_accel{false};
+ BasicMotion motion;
+};
+
+std::shared_ptr<SDLJoystick> SDLDriver::GetSDLJoystickByGUID(const std::string& guid, int port) {
+ std::lock_guard lock{joystick_map_mutex};
+ const auto it = joystick_map.find(guid);
+
+ if (it != joystick_map.end()) {
+ while (it->second.size() <= static_cast<std::size_t>(port)) {
+ auto joystick = std::make_shared<SDLJoystick>(guid, static_cast<int>(it->second.size()),
+ nullptr, nullptr);
+ it->second.emplace_back(std::move(joystick));
+ }
+
+ return it->second[static_cast<std::size_t>(port)];
+ }
+
+ auto joystick = std::make_shared<SDLJoystick>(guid, 0, nullptr, nullptr);
+
+ return joystick_map[guid].emplace_back(std::move(joystick));
+}
+
+std::shared_ptr<SDLJoystick> SDLDriver::GetSDLJoystickBySDLID(SDL_JoystickID sdl_id) {
+ auto sdl_joystick = SDL_JoystickFromInstanceID(sdl_id);
+ const std::string guid = GetGUID(sdl_joystick);
+
+ std::lock_guard lock{joystick_map_mutex};
+ const auto map_it = joystick_map.find(guid);
+
+ if (map_it == joystick_map.end()) {
+ return nullptr;
+ }
+
+ const auto vec_it = std::find_if(map_it->second.begin(), map_it->second.end(),
+ [&sdl_joystick](const auto& joystick) {
+ return joystick->GetSDLJoystick() == sdl_joystick;
+ });
+
+ if (vec_it == map_it->second.end()) {
+ return nullptr;
+ }
+
+ return *vec_it;
+}
+
+void SDLDriver::InitJoystick(int joystick_index) {
+ SDL_Joystick* sdl_joystick = SDL_JoystickOpen(joystick_index);
+ SDL_GameController* sdl_gamecontroller = nullptr;
+
+ if (SDL_IsGameController(joystick_index)) {
+ sdl_gamecontroller = SDL_GameControllerOpen(joystick_index);
+ }
+
+ if (!sdl_joystick) {
+ LOG_ERROR(Input, "Failed to open joystick {}", joystick_index);
+ return;
+ }
+
+ const std::string guid = GetGUID(sdl_joystick);
+
+ std::lock_guard lock{joystick_map_mutex};
+ if (joystick_map.find(guid) == joystick_map.end()) {
+ auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller);
+ PreSetController(joystick->GetPadIdentifier());
+ SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
+ joystick_map[guid].emplace_back(std::move(joystick));
+ return;
+ }
+
+ auto& joystick_guid_list = joystick_map[guid];
+ const auto joystick_it =
+ std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
+ [](const auto& joystick) { return !joystick->GetSDLJoystick(); });
+
+ if (joystick_it != joystick_guid_list.end()) {
+ (*joystick_it)->SetSDLJoystick(sdl_joystick, sdl_gamecontroller);
+ return;
+ }
+
+ const int port = static_cast<int>(joystick_guid_list.size());
+ auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller);
+ PreSetController(joystick->GetPadIdentifier());
+ SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
+ joystick_guid_list.emplace_back(std::move(joystick));
+}
+
+void SDLDriver::CloseJoystick(SDL_Joystick* sdl_joystick) {
+ const std::string guid = GetGUID(sdl_joystick);
+
+ std::lock_guard lock{joystick_map_mutex};
+ // This call to guid is safe since the joystick is guaranteed to be in the map
+ const auto& joystick_guid_list = joystick_map[guid];
+ const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
+ [&sdl_joystick](const auto& joystick) {
+ return joystick->GetSDLJoystick() == sdl_joystick;
+ });
+
+ if (joystick_it != joystick_guid_list.end()) {
+ (*joystick_it)->SetSDLJoystick(nullptr, nullptr);
+ }
+}
+
+void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) {
+ switch (event.type) {
+ case SDL_JOYBUTTONUP: {
+ if (const auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) {
+ const PadIdentifier identifier = joystick->GetPadIdentifier();
+ SetButton(identifier, event.jbutton.button, false);
+ }
+ break;
+ }
+ case SDL_JOYBUTTONDOWN: {
+ if (const auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) {
+ const PadIdentifier identifier = joystick->GetPadIdentifier();
+ SetButton(identifier, event.jbutton.button, true);
+ }
+ break;
+ }
+ case SDL_JOYHATMOTION: {
+ if (const auto joystick = GetSDLJoystickBySDLID(event.jhat.which)) {
+ const PadIdentifier identifier = joystick->GetPadIdentifier();
+ SetHatButton(identifier, event.jhat.hat, event.jhat.value);
+ }
+ break;
+ }
+ case SDL_JOYAXISMOTION: {
+ if (const auto joystick = GetSDLJoystickBySDLID(event.jaxis.which)) {
+ const PadIdentifier identifier = joystick->GetPadIdentifier();
+ SetAxis(identifier, event.jaxis.axis, event.jaxis.value / 32767.0f);
+ }
+ break;
+ }
+ case SDL_CONTROLLERSENSORUPDATE: {
+ if (auto joystick = GetSDLJoystickBySDLID(event.csensor.which)) {
+ if (joystick->UpdateMotion(event.csensor)) {
+ const PadIdentifier identifier = joystick->GetPadIdentifier();
+ SetMotion(identifier, 0, joystick->GetMotion());
+ }
+ }
+ break;
+ }
+ case SDL_JOYDEVICEREMOVED:
+ LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which);
+ CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which));
+ break;
+ case SDL_JOYDEVICEADDED:
+ LOG_DEBUG(Input, "Controller connected with device index {}", event.jdevice.which);
+ InitJoystick(event.jdevice.which);
+ break;
+ }
+}
+
+void SDLDriver::CloseJoysticks() {
+ std::lock_guard lock{joystick_map_mutex};
+ joystick_map.clear();
+}
+
+SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ if (!Settings::values.enable_raw_input) {
+ // Disable raw input. When enabled this setting causes SDL to die when a web applet opens
+ SDL_SetHint(SDL_HINT_JOYSTICK_RAWINPUT, "0");
+ }
+
+ // Prevent SDL from adding undesired axis
+ SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0");
+
+ // Enable HIDAPI rumble. This prevents SDL from disabling motion on PS4 and PS5 controllers
+ SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, "1");
+ SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, "1");
+ SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1");
+
+ // Use hidapi driver for joycons. This will allow joycons to be detected as a GameController and
+ // not a generic one
+ SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1");
+
+ // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native
+ // driver on Linux.
+ SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0");
+
+ // If the frontend is going to manage the event loop, then we don't start one here
+ start_thread = SDL_WasInit(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) == 0;
+ if (start_thread && SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0) {
+ LOG_CRITICAL(Input, "SDL_Init failed with: {}", SDL_GetError());
+ return;
+ }
+
+ SDL_AddEventWatch(&SDLEventWatcher, this);
+
+ initialized = true;
+ if (start_thread) {
+ poll_thread = std::thread([this] {
+ Common::SetCurrentThreadName("yuzu:input:SDL");
+ using namespace std::chrono_literals;
+ while (initialized) {
+ SDL_PumpEvents();
+ std::this_thread::sleep_for(1ms);
+ }
+ });
+ }
+ // Because the events for joystick connection happens before we have our event watcher added, we
+ // can just open all the joysticks right here
+ for (int i = 0; i < SDL_NumJoysticks(); ++i) {
+ InitJoystick(i);
+ }
+}
+
+SDLDriver::~SDLDriver() {
+ CloseJoysticks();
+ SDL_DelEventWatch(&SDLEventWatcher, this);
+
+ initialized = false;
+ if (start_thread) {
+ poll_thread.join();
+ SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
+ }
+}
+
+std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
+ std::vector<Common::ParamPackage> devices;
+ std::unordered_map<int, std::shared_ptr<SDLJoystick>> joycon_pairs;
+ for (const auto& [key, value] : joystick_map) {
+ for (const auto& joystick : value) {
+ if (!joystick->GetSDLJoystick()) {
+ continue;
+ }
+ const std::string name =
+ fmt::format("{} {}", joystick->GetControllerName(), joystick->GetPort());
+ devices.emplace_back(Common::ParamPackage{
+ {"engine", GetEngineName()},
+ {"display", std::move(name)},
+ {"guid", joystick->GetGUID()},
+ {"port", std::to_string(joystick->GetPort())},
+ });
+ if (joystick->IsJoyconLeft()) {
+ joycon_pairs.insert_or_assign(joystick->GetPort(), joystick);
+ }
+ }
+ }
+
+ // Add dual controllers
+ for (const auto& [key, value] : joystick_map) {
+ for (const auto& joystick : value) {
+ if (joystick->IsJoyconRight()) {
+ if (!joycon_pairs.contains(joystick->GetPort())) {
+ continue;
+ }
+ const auto joystick2 = joycon_pairs.at(joystick->GetPort());
+
+ const std::string name =
+ fmt::format("{} {}", "Nintendo Dual Joy-Con", joystick->GetPort());
+ devices.emplace_back(Common::ParamPackage{
+ {"engine", GetEngineName()},
+ {"display", std::move(name)},
+ {"guid", joystick->GetGUID()},
+ {"guid2", joystick2->GetGUID()},
+ {"port", std::to_string(joystick->GetPort())},
+ });
+ }
+ }
+ }
+ return devices;
+}
+
+Common::Input::VibrationError SDLDriver::SetRumble(
+ const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) {
+ const auto joystick =
+ GetSDLJoystickByGUID(identifier.guid.Format(), static_cast<int>(identifier.port));
+ const auto process_amplitude_exp = [](f32 amplitude, f32 factor) {
+ return (amplitude + std::pow(amplitude, factor)) * 0.5f * 0xFFFF;
+ };
+
+ // Default exponential curve for rumble
+ f32 factor = 0.35f;
+
+ // If vibration is set as a linear output use a flatter value
+ if (vibration.type == Common::Input::VibrationAmplificationType::Linear) {
+ factor = 0.5f;
+ }
+
+ // Amplitude for HD rumble needs no modification
+ if (joystick->HasHDRumble()) {
+ factor = 1.0f;
+ }
+
+ const Common::Input::VibrationStatus new_vibration{
+ .low_amplitude = process_amplitude_exp(vibration.low_amplitude, factor),
+ .low_frequency = vibration.low_frequency,
+ .high_amplitude = process_amplitude_exp(vibration.high_amplitude, factor),
+ .high_frequency = vibration.high_frequency,
+ .type = Common::Input::VibrationAmplificationType::Exponential,
+ };
+
+ if (!joystick->RumblePlay(new_vibration)) {
+ return Common::Input::VibrationError::Unknown;
+ }
+
+ return Common::Input::VibrationError::None;
+}
+
+Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, std::string guid,
+ s32 axis, float value) const {
+ Common::ParamPackage params{};
+ params.Set("engine", GetEngineName());
+ params.Set("port", port);
+ params.Set("guid", std::move(guid));
+ params.Set("axis", axis);
+ params.Set("threshold", "0.5");
+ params.Set("invert", value < 0 ? "-" : "+");
+ return params;
+}
+
+Common::ParamPackage SDLDriver::BuildButtonParamPackageForButton(int port, std::string guid,
+ s32 button) const {
+ Common::ParamPackage params{};
+ params.Set("engine", GetEngineName());
+ params.Set("port", port);
+ params.Set("guid", std::move(guid));
+ params.Set("button", button);
+ return params;
+}
+
+Common::ParamPackage SDLDriver::BuildHatParamPackageForButton(int port, std::string guid, s32 hat,
+ u8 value) const {
+ Common::ParamPackage params{};
+ params.Set("engine", GetEngineName());
+ params.Set("port", port);
+ params.Set("guid", std::move(guid));
+ params.Set("hat", hat);
+ params.Set("direction", GetHatButtonName(value));
+ return params;
+}
+
+Common::ParamPackage SDLDriver::BuildMotionParam(int port, std::string guid) const {
+ Common::ParamPackage params{};
+ params.Set("engine", GetEngineName());
+ params.Set("motion", 0);
+ params.Set("port", port);
+ params.Set("guid", std::move(guid));
+ return params;
+}
+
+Common::ParamPackage SDLDriver::BuildParamPackageForBinding(
+ int port, const std::string& guid, const SDL_GameControllerButtonBind& binding) const {
+ switch (binding.bindType) {
+ case SDL_CONTROLLER_BINDTYPE_NONE:
+ break;
+ case SDL_CONTROLLER_BINDTYPE_AXIS:
+ return BuildAnalogParamPackageForButton(port, guid, binding.value.axis);
+ case SDL_CONTROLLER_BINDTYPE_BUTTON:
+ return BuildButtonParamPackageForButton(port, guid, binding.value.button);
+ case SDL_CONTROLLER_BINDTYPE_HAT:
+ return BuildHatParamPackageForButton(port, guid, binding.value.hat.hat,
+ static_cast<u8>(binding.value.hat.hat_mask));
+ }
+ return {};
+}
+
+Common::ParamPackage SDLDriver::BuildParamPackageForAnalog(PadIdentifier identifier, int axis_x,
+ int axis_y, float offset_x,
+ float offset_y) const {
+ Common::ParamPackage params;
+ params.Set("engine", GetEngineName());
+ params.Set("port", static_cast<int>(identifier.port));
+ params.Set("guid", identifier.guid.Format());
+ params.Set("axis_x", axis_x);
+ params.Set("axis_y", axis_y);
+ params.Set("offset_x", offset_x);
+ params.Set("offset_y", offset_y);
+ params.Set("invert_x", "+");
+ params.Set("invert_y", "+");
+ return params;
+}
+
+ButtonMapping SDLDriver::GetButtonMappingForDevice(const Common::ParamPackage& params) {
+ if (!params.Has("guid") || !params.Has("port")) {
+ return {};
+ }
+ const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
+
+ auto* controller = joystick->GetSDLGameController();
+ if (controller == nullptr) {
+ return {};
+ }
+
+ // This list is missing ZL/ZR since those are not considered buttons in SDL GameController.
+ // We will add those afterwards
+ // This list also excludes Screenshot since theres not really a mapping for that
+ ButtonBindings switch_to_sdl_button;
+
+ if (SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) {
+ switch_to_sdl_button = GetNintendoButtonBinding(joystick);
+ } else {
+ switch_to_sdl_button = GetDefaultButtonBinding();
+ }
+
+ // Add the missing bindings for ZL/ZR
+ static constexpr ZButtonBindings switch_to_sdl_axis{{
+ {Settings::NativeButton::ZL, SDL_CONTROLLER_AXIS_TRIGGERLEFT},
+ {Settings::NativeButton::ZR, SDL_CONTROLLER_AXIS_TRIGGERRIGHT},
+ }};
+
+ // Parameters contain two joysticks return dual
+ if (params.Has("guid2")) {
+ const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
+
+ if (joystick2->GetSDLGameController() != nullptr) {
+ return GetDualControllerMapping(joystick, joystick2, switch_to_sdl_button,
+ switch_to_sdl_axis);
+ }
+ }
+
+ return GetSingleControllerMapping(joystick, switch_to_sdl_button, switch_to_sdl_axis);
+}
+
+ButtonBindings SDLDriver::GetDefaultButtonBinding() const {
+ return {
+ std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_B},
+ {Settings::NativeButton::B, SDL_CONTROLLER_BUTTON_A},
+ {Settings::NativeButton::X, SDL_CONTROLLER_BUTTON_Y},
+ {Settings::NativeButton::Y, SDL_CONTROLLER_BUTTON_X},
+ {Settings::NativeButton::LStick, SDL_CONTROLLER_BUTTON_LEFTSTICK},
+ {Settings::NativeButton::RStick, SDL_CONTROLLER_BUTTON_RIGHTSTICK},
+ {Settings::NativeButton::L, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
+ {Settings::NativeButton::R, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
+ {Settings::NativeButton::Plus, SDL_CONTROLLER_BUTTON_START},
+ {Settings::NativeButton::Minus, SDL_CONTROLLER_BUTTON_BACK},
+ {Settings::NativeButton::DLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT},
+ {Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
+ {Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
+ {Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
+ {Settings::NativeButton::SL, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
+ {Settings::NativeButton::SR, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
+ {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
+ };
+}
+
+ButtonBindings SDLDriver::GetNintendoButtonBinding(
+ const std::shared_ptr<SDLJoystick>& joystick) const {
+ // Default SL/SR mapping for pro controllers
+ auto sl_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;
+ auto sr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
+
+ if (joystick->IsJoyconLeft()) {
+ sl_button = SDL_CONTROLLER_BUTTON_PADDLE2;
+ sr_button = SDL_CONTROLLER_BUTTON_PADDLE4;
+ }
+ if (joystick->IsJoyconRight()) {
+ sl_button = SDL_CONTROLLER_BUTTON_PADDLE3;
+ sr_button = SDL_CONTROLLER_BUTTON_PADDLE1;
+ }
+
+ return {
+ std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_A},
+ {Settings::NativeButton::B, SDL_CONTROLLER_BUTTON_B},
+ {Settings::NativeButton::X, SDL_CONTROLLER_BUTTON_X},
+ {Settings::NativeButton::Y, SDL_CONTROLLER_BUTTON_Y},
+ {Settings::NativeButton::LStick, SDL_CONTROLLER_BUTTON_LEFTSTICK},
+ {Settings::NativeButton::RStick, SDL_CONTROLLER_BUTTON_RIGHTSTICK},
+ {Settings::NativeButton::L, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
+ {Settings::NativeButton::R, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
+ {Settings::NativeButton::Plus, SDL_CONTROLLER_BUTTON_START},
+ {Settings::NativeButton::Minus, SDL_CONTROLLER_BUTTON_BACK},
+ {Settings::NativeButton::DLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT},
+ {Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
+ {Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
+ {Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
+ {Settings::NativeButton::SL, sl_button},
+ {Settings::NativeButton::SR, sr_button},
+ {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
+ };
+}
+
+ButtonMapping SDLDriver::GetSingleControllerMapping(
+ const std::shared_ptr<SDLJoystick>& joystick, const ButtonBindings& switch_to_sdl_button,
+ const ZButtonBindings& switch_to_sdl_axis) const {
+ ButtonMapping mapping;
+ mapping.reserve(switch_to_sdl_button.size() + switch_to_sdl_axis.size());
+ auto* controller = joystick->GetSDLGameController();
+
+ for (const auto& [switch_button, sdl_button] : switch_to_sdl_button) {
+ const auto& binding = SDL_GameControllerGetBindForButton(controller, sdl_button);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
+ }
+ for (const auto& [switch_button, sdl_axis] : switch_to_sdl_axis) {
+ const auto& binding = SDL_GameControllerGetBindForAxis(controller, sdl_axis);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
+ }
+
+ return mapping;
+}
+
+ButtonMapping SDLDriver::GetDualControllerMapping(const std::shared_ptr<SDLJoystick>& joystick,
+ const std::shared_ptr<SDLJoystick>& joystick2,
+ const ButtonBindings& switch_to_sdl_button,
+ const ZButtonBindings& switch_to_sdl_axis) const {
+ ButtonMapping mapping;
+ mapping.reserve(switch_to_sdl_button.size() + switch_to_sdl_axis.size());
+ auto* controller = joystick->GetSDLGameController();
+ auto* controller2 = joystick2->GetSDLGameController();
+
+ for (const auto& [switch_button, sdl_button] : switch_to_sdl_button) {
+ if (IsButtonOnLeftSide(switch_button)) {
+ const auto& binding = SDL_GameControllerGetBindForButton(controller2, sdl_button);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick2->GetPort(), joystick2->GetGUID(), binding));
+ continue;
+ }
+ const auto& binding = SDL_GameControllerGetBindForButton(controller, sdl_button);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
+ }
+ for (const auto& [switch_button, sdl_axis] : switch_to_sdl_axis) {
+ if (IsButtonOnLeftSide(switch_button)) {
+ const auto& binding = SDL_GameControllerGetBindForAxis(controller2, sdl_axis);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick2->GetPort(), joystick2->GetGUID(), binding));
+ continue;
+ }
+ const auto& binding = SDL_GameControllerGetBindForAxis(controller, sdl_axis);
+ mapping.insert_or_assign(
+ switch_button,
+ BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
+ }
+
+ return mapping;
+}
+
+bool SDLDriver::IsButtonOnLeftSide(Settings::NativeButton::Values button) const {
+ switch (button) {
+ case Settings::NativeButton::DDown:
+ case Settings::NativeButton::DLeft:
+ case Settings::NativeButton::DRight:
+ case Settings::NativeButton::DUp:
+ case Settings::NativeButton::L:
+ case Settings::NativeButton::LStick:
+ case Settings::NativeButton::Minus:
+ case Settings::NativeButton::Screenshot:
+ case Settings::NativeButton::ZL:
+ return true;
+ default:
+ return false;
+ }
+}
+
+AnalogMapping SDLDriver::GetAnalogMappingForDevice(const Common::ParamPackage& params) {
+ if (!params.Has("guid") || !params.Has("port")) {
+ return {};
+ }
+ const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
+ const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
+ auto* controller = joystick->GetSDLGameController();
+ if (controller == nullptr) {
+ return {};
+ }
+
+ AnalogMapping mapping = {};
+ const auto& binding_left_x =
+ SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTX);
+ const auto& binding_left_y =
+ SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTY);
+ if (params.Has("guid2")) {
+ const auto identifier = joystick2->GetPadIdentifier();
+ PreSetController(identifier);
+ PreSetAxis(identifier, binding_left_x.value.axis);
+ PreSetAxis(identifier, binding_left_y.value.axis);
+ const auto left_offset_x = -GetAxis(identifier, binding_left_x.value.axis);
+ const auto left_offset_y = -GetAxis(identifier, binding_left_y.value.axis);
+ mapping.insert_or_assign(Settings::NativeAnalog::LStick,
+ BuildParamPackageForAnalog(identifier, binding_left_x.value.axis,
+ binding_left_y.value.axis,
+ left_offset_x, left_offset_y));
+ } else {
+ const auto identifier = joystick->GetPadIdentifier();
+ PreSetController(identifier);
+ PreSetAxis(identifier, binding_left_x.value.axis);
+ PreSetAxis(identifier, binding_left_y.value.axis);
+ const auto left_offset_x = -GetAxis(identifier, binding_left_x.value.axis);
+ const auto left_offset_y = -GetAxis(identifier, binding_left_y.value.axis);
+ mapping.insert_or_assign(Settings::NativeAnalog::LStick,
+ BuildParamPackageForAnalog(identifier, binding_left_x.value.axis,
+ binding_left_y.value.axis,
+ left_offset_x, left_offset_y));
+ }
+ const auto& binding_right_x =
+ SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTX);
+ const auto& binding_right_y =
+ SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTY);
+ const auto identifier = joystick->GetPadIdentifier();
+ PreSetController(identifier);
+ PreSetAxis(identifier, binding_right_x.value.axis);
+ PreSetAxis(identifier, binding_right_y.value.axis);
+ const auto right_offset_x = -GetAxis(identifier, binding_right_x.value.axis);
+ const auto right_offset_y = -GetAxis(identifier, binding_right_y.value.axis);
+ mapping.insert_or_assign(Settings::NativeAnalog::RStick,
+ BuildParamPackageForAnalog(identifier, binding_right_x.value.axis,
+ binding_right_y.value.axis, right_offset_x,
+ right_offset_y));
+ return mapping;
+}
+
+MotionMapping SDLDriver::GetMotionMappingForDevice(const Common::ParamPackage& params) {
+ if (!params.Has("guid") || !params.Has("port")) {
+ return {};
+ }
+ const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
+ const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
+ auto* controller = joystick->GetSDLGameController();
+ if (controller == nullptr) {
+ return {};
+ }
+
+ MotionMapping mapping = {};
+ joystick->EnableMotion();
+
+ if (joystick->HasGyro() || joystick->HasAccel()) {
+ mapping.insert_or_assign(Settings::NativeMotion::MotionRight,
+ BuildMotionParam(joystick->GetPort(), joystick->GetGUID()));
+ }
+ if (params.Has("guid2")) {
+ joystick2->EnableMotion();
+ if (joystick2->HasGyro() || joystick2->HasAccel()) {
+ mapping.insert_or_assign(Settings::NativeMotion::MotionLeft,
+ BuildMotionParam(joystick2->GetPort(), joystick2->GetGUID()));
+ }
+ } else {
+ if (joystick->HasGyro() || joystick->HasAccel()) {
+ mapping.insert_or_assign(Settings::NativeMotion::MotionLeft,
+ BuildMotionParam(joystick->GetPort(), joystick->GetGUID()));
+ }
+ }
+
+ return mapping;
+}
+
+Common::Input::ButtonNames SDLDriver::GetUIName(const Common::ParamPackage& params) const {
+ if (params.Has("button")) {
+ // TODO(German77): Find how to substitue the values for real button names
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("hat")) {
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("axis")) {
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("axis_x") && params.Has("axis_y") && params.Has("axis_z")) {
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("motion")) {
+ return Common::Input::ButtonNames::Engine;
+ }
+
+ return Common::Input::ButtonNames::Invalid;
+}
+
+std::string SDLDriver::GetHatButtonName(u8 direction_value) const {
+ switch (direction_value) {
+ case SDL_HAT_UP:
+ return "up";
+ case SDL_HAT_DOWN:
+ return "down";
+ case SDL_HAT_LEFT:
+ return "left";
+ case SDL_HAT_RIGHT:
+ return "right";
+ default:
+ return {};
+ }
+}
+
+u8 SDLDriver::GetHatButtonId(const std::string& direction_name) const {
+ Uint8 direction;
+ if (direction_name == "up") {
+ direction = SDL_HAT_UP;
+ } else if (direction_name == "down") {
+ direction = SDL_HAT_DOWN;
+ } else if (direction_name == "left") {
+ direction = SDL_HAT_LEFT;
+ } else if (direction_name == "right") {
+ direction = SDL_HAT_RIGHT;
+ } else {
+ direction = 0;
+ }
+ return direction;
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/sdl/sdl_impl.h b/src/input_common/drivers/sdl_driver.h
index 7a9ad6346..e9a5d2e26 100644
--- a/src/input_common/sdl/sdl_impl.h
+++ b/src/input_common/drivers/sdl_driver.h
@@ -5,7 +5,6 @@
#pragma once
#include <atomic>
-#include <memory>
#include <mutex>
#include <thread>
#include <unordered_map>
@@ -13,34 +12,29 @@
#include <SDL.h>
#include "common/common_types.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/sdl/sdl.h"
+#include "input_common/input_engine.h"
union SDL_Event;
using SDL_GameController = struct _SDL_GameController;
using SDL_Joystick = struct _SDL_Joystick;
using SDL_JoystickID = s32;
+namespace InputCommon {
+
+class SDLJoystick;
+
using ButtonBindings =
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 17>;
using ZButtonBindings =
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>;
-namespace InputCommon::SDL {
-
-class SDLAnalogFactory;
-class SDLButtonFactory;
-class SDLMotionFactory;
-class SDLVibrationFactory;
-class SDLJoystick;
-
-class SDLState : public State {
+class SDLDriver : public InputEngine {
public:
/// Initializes and registers SDL device factories
- SDLState();
+ explicit SDLDriver(std::string input_engine_);
/// Unregisters SDL device factories and shut them down.
- ~SDLState() override;
+ ~SDLDriver() override;
/// Handle SDL_Events for joysticks from SDL_PollEvent
void HandleGameControllerEvent(const SDL_Event& event);
@@ -54,18 +48,18 @@ public:
*/
std::shared_ptr<SDLJoystick> GetSDLJoystickByGUID(const std::string& guid, int port);
- /// Get all DevicePoller that use the SDL backend for a specific device type
- Pollers GetPollers(Polling::DeviceType type) override;
-
- /// Used by the Pollers during config
- std::atomic<bool> polling = false;
- Common::SPSCQueue<SDL_Event> event_queue;
-
- std::vector<Common::ParamPackage> GetInputDevices() override;
+ std::vector<Common::ParamPackage> GetInputDevices() const override;
ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override;
AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override;
MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override;
+ Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
+
+ std::string GetHatButtonName(u8 direction_value) const override;
+ u8 GetHatButtonId(const std::string& direction_name) const override;
+
+ Common::Input::VibrationError SetRumble(
+ const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override;
private:
void InitJoystick(int joystick_index);
@@ -74,6 +68,23 @@ private:
/// Needs to be called before SDL_QuitSubSystem.
void CloseJoysticks();
+ Common::ParamPackage BuildAnalogParamPackageForButton(int port, std::string guid, s32 axis,
+ float value = 0.1f) const;
+ Common::ParamPackage BuildButtonParamPackageForButton(int port, std::string guid,
+ s32 button) const;
+
+ Common::ParamPackage BuildHatParamPackageForButton(int port, std::string guid, s32 hat,
+ u8 value) const;
+
+ Common::ParamPackage BuildMotionParam(int port, std::string guid) const;
+
+ Common::ParamPackage BuildParamPackageForBinding(
+ int port, const std::string& guid, const SDL_GameControllerButtonBind& binding) const;
+
+ Common::ParamPackage BuildParamPackageForAnalog(PadIdentifier identifier, int axis_x,
+ int axis_y, float offset_x,
+ float offset_y) const;
+
/// Returns the default button bindings list for generic controllers
ButtonBindings GetDefaultButtonBinding() const;
@@ -94,21 +105,13 @@ private:
/// Returns true if the button is on the left joycon
bool IsButtonOnLeftSide(Settings::NativeButton::Values button) const;
- // Set to true if SDL supports game controller subsystem
- bool has_gamecontroller = false;
-
/// Map of GUID of a list of corresponding virtual Joysticks
std::unordered_map<std::string, std::vector<std::shared_ptr<SDLJoystick>>> joystick_map;
std::mutex joystick_map_mutex;
- std::shared_ptr<SDLButtonFactory> button_factory;
- std::shared_ptr<SDLAnalogFactory> analog_factory;
- std::shared_ptr<SDLVibrationFactory> vibration_factory;
- std::shared_ptr<SDLMotionFactory> motion_factory;
-
bool start_thread = false;
std::atomic<bool> initialized = false;
std::thread poll_thread;
};
-} // namespace InputCommon::SDL
+} // namespace InputCommon
diff --git a/src/input_common/drivers/tas_input.cpp b/src/input_common/drivers/tas_input.cpp
new file mode 100644
index 000000000..5bdd5dac3
--- /dev/null
+++ b/src/input_common/drivers/tas_input.cpp
@@ -0,0 +1,320 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <cstring>
+#include <fmt/format.h>
+
+#include "common/fs/file.h"
+#include "common/fs/fs_types.h"
+#include "common/fs/path_util.h"
+#include "common/logging/log.h"
+#include "common/settings.h"
+#include "input_common/drivers/tas_input.h"
+
+namespace InputCommon::TasInput {
+
+enum class Tas::TasAxis : u8 {
+ StickX,
+ StickY,
+ SubstickX,
+ SubstickY,
+ Undefined,
+};
+
+// Supported keywords and buttons from a TAS file
+constexpr std::array<std::pair<std::string_view, TasButton>, 20> text_to_tas_button = {
+ std::pair{"KEY_A", TasButton::BUTTON_A},
+ {"KEY_B", TasButton::BUTTON_B},
+ {"KEY_X", TasButton::BUTTON_X},
+ {"KEY_Y", TasButton::BUTTON_Y},
+ {"KEY_LSTICK", TasButton::STICK_L},
+ {"KEY_RSTICK", TasButton::STICK_R},
+ {"KEY_L", TasButton::TRIGGER_L},
+ {"KEY_R", TasButton::TRIGGER_R},
+ {"KEY_PLUS", TasButton::BUTTON_PLUS},
+ {"KEY_MINUS", TasButton::BUTTON_MINUS},
+ {"KEY_DLEFT", TasButton::BUTTON_LEFT},
+ {"KEY_DUP", TasButton::BUTTON_UP},
+ {"KEY_DRIGHT", TasButton::BUTTON_RIGHT},
+ {"KEY_DDOWN", TasButton::BUTTON_DOWN},
+ {"KEY_SL", TasButton::BUTTON_SL},
+ {"KEY_SR", TasButton::BUTTON_SR},
+ {"KEY_CAPTURE", TasButton::BUTTON_CAPTURE},
+ {"KEY_HOME", TasButton::BUTTON_HOME},
+ {"KEY_ZL", TasButton::TRIGGER_ZL},
+ {"KEY_ZR", TasButton::TRIGGER_ZR},
+};
+
+Tas::Tas(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ for (size_t player_index = 0; player_index < PLAYER_NUMBER; player_index++) {
+ PadIdentifier identifier{
+ .guid = Common::UUID{},
+ .port = player_index,
+ .pad = 0,
+ };
+ PreSetController(identifier);
+ }
+ ClearInput();
+ if (!Settings::values.tas_enable) {
+ needs_reset = true;
+ return;
+ }
+ LoadTasFiles();
+}
+
+Tas::~Tas() {
+ Stop();
+}
+
+void Tas::LoadTasFiles() {
+ script_length = 0;
+ for (size_t i = 0; i < commands.size(); i++) {
+ LoadTasFile(i, 0);
+ if (commands[i].size() > script_length) {
+ script_length = commands[i].size();
+ }
+ }
+}
+
+void Tas::LoadTasFile(size_t player_index, size_t file_index) {
+ commands[player_index].clear();
+
+ std::string file = Common::FS::ReadStringFromFile(
+ Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) /
+ fmt::format("script{}-{}.txt", file_index, player_index + 1),
+ Common::FS::FileType::BinaryFile);
+ std::istringstream command_line(file);
+ std::string line;
+ int frame_no = 0;
+ while (std::getline(command_line, line, '\n')) {
+ if (line.empty()) {
+ continue;
+ }
+
+ std::vector<std::string> seg_list;
+ {
+ std::istringstream line_stream(line);
+ std::string segment;
+ while (std::getline(line_stream, segment, ' ')) {
+ seg_list.push_back(std::move(segment));
+ }
+ }
+
+ if (seg_list.size() < 4) {
+ continue;
+ }
+
+ const auto num_frames = std::stoi(seg_list[0]);
+ while (frame_no < num_frames) {
+ commands[player_index].emplace_back();
+ frame_no++;
+ }
+
+ TASCommand command = {
+ .buttons = ReadCommandButtons(seg_list[1]),
+ .l_axis = ReadCommandAxis(seg_list[2]),
+ .r_axis = ReadCommandAxis(seg_list[3]),
+ };
+ commands[player_index].push_back(command);
+ frame_no++;
+ }
+ LOG_INFO(Input, "TAS file loaded! {} frames", frame_no);
+}
+
+void Tas::WriteTasFile(std::u8string_view file_name) {
+ std::string output_text;
+ for (size_t frame = 0; frame < record_commands.size(); frame++) {
+ const TASCommand& line = record_commands[frame];
+ output_text += fmt::format("{} {} {} {}\n", frame, WriteCommandButtons(line.buttons),
+ WriteCommandAxis(line.l_axis), WriteCommandAxis(line.r_axis));
+ }
+
+ const auto tas_file_name = Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) / file_name;
+ const auto bytes_written =
+ Common::FS::WriteStringToFile(tas_file_name, Common::FS::FileType::TextFile, output_text);
+ if (bytes_written == output_text.size()) {
+ LOG_INFO(Input, "TAS file written to file!");
+ } else {
+ LOG_ERROR(Input, "Writing the TAS-file has failed! {} / {} bytes written", bytes_written,
+ output_text.size());
+ }
+}
+
+void Tas::RecordInput(u64 buttons, TasAnalog left_axis, TasAnalog right_axis) {
+ last_input = {
+ .buttons = buttons,
+ .l_axis = left_axis,
+ .r_axis = right_axis,
+ };
+}
+
+std::tuple<TasState, size_t, size_t> Tas::GetStatus() const {
+ TasState state;
+ if (is_recording) {
+ return {TasState::Recording, 0, record_commands.size()};
+ }
+
+ if (is_running) {
+ state = TasState::Running;
+ } else {
+ state = TasState::Stopped;
+ }
+
+ return {state, current_command, script_length};
+}
+
+void Tas::UpdateThread() {
+ if (!Settings::values.tas_enable) {
+ if (is_running) {
+ Stop();
+ }
+ return;
+ }
+
+ if (is_recording) {
+ record_commands.push_back(last_input);
+ }
+ if (needs_reset) {
+ current_command = 0;
+ needs_reset = false;
+ LoadTasFiles();
+ LOG_DEBUG(Input, "tas_reset done");
+ }
+
+ if (!is_running) {
+ ClearInput();
+ return;
+ }
+ if (current_command < script_length) {
+ LOG_DEBUG(Input, "Playing TAS {}/{}", current_command, script_length);
+ const size_t frame = current_command++;
+ for (size_t player_index = 0; player_index < commands.size(); player_index++) {
+ TASCommand command{};
+ if (frame < commands[player_index].size()) {
+ command = commands[player_index][frame];
+ }
+
+ PadIdentifier identifier{
+ .guid = Common::UUID{},
+ .port = player_index,
+ .pad = 0,
+ };
+ for (std::size_t i = 0; i < sizeof(command.buttons) * 8; ++i) {
+ const bool button_status = (command.buttons & (1LLU << i)) != 0;
+ const int button = static_cast<int>(i);
+ SetButton(identifier, button, button_status);
+ }
+ SetTasAxis(identifier, TasAxis::StickX, command.l_axis.x);
+ SetTasAxis(identifier, TasAxis::StickY, command.l_axis.y);
+ SetTasAxis(identifier, TasAxis::SubstickX, command.r_axis.x);
+ SetTasAxis(identifier, TasAxis::SubstickY, command.r_axis.y);
+ }
+ } else {
+ is_running = Settings::values.tas_loop.GetValue();
+ LoadTasFiles();
+ current_command = 0;
+ ClearInput();
+ }
+}
+
+void Tas::ClearInput() {
+ ResetButtonState();
+ ResetAnalogState();
+}
+
+TasAnalog Tas::ReadCommandAxis(const std::string& line) const {
+ std::vector<std::string> seg_list;
+ {
+ std::istringstream line_stream(line);
+ std::string segment;
+ while (std::getline(line_stream, segment, ';')) {
+ seg_list.push_back(std::move(segment));
+ }
+ }
+
+ const float x = std::stof(seg_list.at(0)) / 32767.0f;
+ const float y = std::stof(seg_list.at(1)) / 32767.0f;
+
+ return {x, y};
+}
+
+u64 Tas::ReadCommandButtons(const std::string& line) const {
+ std::istringstream button_text(line);
+ std::string button_line;
+ u64 buttons = 0;
+ while (std::getline(button_text, button_line, ';')) {
+ for (const auto& [text, tas_button] : text_to_tas_button) {
+ if (text == button_line) {
+ buttons |= static_cast<u64>(tas_button);
+ break;
+ }
+ }
+ }
+ return buttons;
+}
+
+std::string Tas::WriteCommandButtons(u64 buttons) const {
+ std::string returns;
+ for (const auto& [text_button, tas_button] : text_to_tas_button) {
+ if ((buttons & static_cast<u64>(tas_button)) != 0) {
+ returns += fmt::format("{};", text_button);
+ }
+ }
+ return returns.empty() ? "NONE" : returns;
+}
+
+std::string Tas::WriteCommandAxis(TasAnalog analog) const {
+ return fmt::format("{};{}", analog.x * 32767, analog.y * 32767);
+}
+
+void Tas::SetTasAxis(const PadIdentifier& identifier, TasAxis axis, f32 value) {
+ SetAxis(identifier, static_cast<int>(axis), value);
+}
+
+void Tas::StartStop() {
+ if (!Settings::values.tas_enable) {
+ return;
+ }
+ if (is_running) {
+ Stop();
+ } else {
+ is_running = true;
+ }
+}
+
+void Tas::Stop() {
+ is_running = false;
+}
+
+void Tas::Reset() {
+ if (!Settings::values.tas_enable) {
+ return;
+ }
+ needs_reset = true;
+}
+
+bool Tas::Record() {
+ if (!Settings::values.tas_enable) {
+ return true;
+ }
+ is_recording = !is_recording;
+ return is_recording;
+}
+
+void Tas::SaveRecording(bool overwrite_file) {
+ if (is_recording) {
+ return;
+ }
+ if (record_commands.empty()) {
+ return;
+ }
+ WriteTasFile(u8"record.txt");
+ if (overwrite_file) {
+ WriteTasFile(u8"script0-1.txt");
+ }
+ needs_reset = true;
+ record_commands.clear();
+}
+
+} // namespace InputCommon::TasInput
diff --git a/src/input_common/drivers/tas_input.h b/src/input_common/drivers/tas_input.h
new file mode 100644
index 000000000..4b4e6c417
--- /dev/null
+++ b/src/input_common/drivers/tas_input.h
@@ -0,0 +1,201 @@
+// Copyright 2020 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <array>
+#include <string>
+#include <vector>
+
+#include "common/common_types.h"
+#include "input_common/input_engine.h"
+
+/*
+To play back TAS scripts on Yuzu, select the folder with scripts in the configuration menu below
+Tools -> Configure TAS. The file itself has normal text format and has to be called script0-1.txt
+for controller 1, script0-2.txt for controller 2 and so forth (with max. 8 players).
+
+A script file has the same format as TAS-nx uses, so final files will look like this:
+
+1 KEY_B 0;0 0;0
+6 KEY_ZL 0;0 0;0
+41 KEY_ZL;KEY_Y 0;0 0;0
+43 KEY_X;KEY_A 32767;0 0;0
+44 KEY_A 32767;0 0;0
+45 KEY_A 32767;0 0;0
+46 KEY_A 32767;0 0;0
+47 KEY_A 32767;0 0;0
+
+After placing the file at the correct location, it can be read into Yuzu with the (default) hotkey
+CTRL+F6 (refresh). In the bottom left corner, it will display the amount of frames the script file
+has. Playback can be started or stopped using CTRL+F5.
+
+However, for playback to actually work, the correct input device has to be selected: In the Controls
+menu, select TAS from the device list for the controller that the script should be played on.
+
+Recording a new script file is really simple: Just make sure that the proper device (not TAS) is
+connected on P1, and press CTRL+F7 to start recording. When done, just press the same keystroke
+again (CTRL+F7). The new script will be saved at the location previously selected, as the filename
+record.txt.
+
+For debugging purposes, the common controller debugger can be used (View -> Debugging -> Controller
+P1).
+*/
+
+namespace InputCommon::TasInput {
+
+constexpr size_t PLAYER_NUMBER = 10;
+
+enum class TasButton : u64 {
+ BUTTON_A = 1U << 0,
+ BUTTON_B = 1U << 1,
+ BUTTON_X = 1U << 2,
+ BUTTON_Y = 1U << 3,
+ STICK_L = 1U << 4,
+ STICK_R = 1U << 5,
+ TRIGGER_L = 1U << 6,
+ TRIGGER_R = 1U << 7,
+ TRIGGER_ZL = 1U << 8,
+ TRIGGER_ZR = 1U << 9,
+ BUTTON_PLUS = 1U << 10,
+ BUTTON_MINUS = 1U << 11,
+ BUTTON_LEFT = 1U << 12,
+ BUTTON_UP = 1U << 13,
+ BUTTON_RIGHT = 1U << 14,
+ BUTTON_DOWN = 1U << 15,
+ BUTTON_SL = 1U << 16,
+ BUTTON_SR = 1U << 17,
+ BUTTON_HOME = 1U << 18,
+ BUTTON_CAPTURE = 1U << 19,
+};
+
+struct TasAnalog {
+ float x{};
+ float y{};
+};
+
+enum class TasState {
+ Running,
+ Recording,
+ Stopped,
+};
+
+class Tas final : public InputEngine {
+public:
+ explicit Tas(std::string input_engine_);
+ ~Tas() override;
+
+ /**
+ * Changes the input status that will be stored in each frame
+ * @param buttons Bitfield with the status of the buttons
+ * @param left_axis Value of the left axis
+ * @param right_axis Value of the right axis
+ */
+ void RecordInput(u64 buttons, TasAnalog left_axis, TasAnalog right_axis);
+
+ // Main loop that records or executes input
+ void UpdateThread();
+
+ // Sets the flag to start or stop the TAS command execution and swaps controllers profiles
+ void StartStop();
+
+ // Stop the TAS and reverts any controller profile
+ void Stop();
+
+ // Sets the flag to reload the file and start from the beginning in the next update
+ void Reset();
+
+ /**
+ * Sets the flag to enable or disable recording of inputs
+ * @returns true if the current recording status is enabled
+ */
+ bool Record();
+
+ /**
+ * Saves contents of record_commands on a file
+ * @param overwrite_file Indicates if player 1 should be overwritten
+ */
+ void SaveRecording(bool overwrite_file);
+
+ /**
+ * Returns the current status values of TAS playback/recording
+ * @returns A Tuple of
+ * TasState indicating the current state out of Running ;
+ * Current playback progress ;
+ * Total length of script file currently loaded or being recorded
+ */
+ std::tuple<TasState, size_t, size_t> GetStatus() const;
+
+private:
+ enum class TasAxis : u8;
+
+ struct TASCommand {
+ u64 buttons{};
+ TasAnalog l_axis{};
+ TasAnalog r_axis{};
+ };
+
+ /// Loads TAS files from all players
+ void LoadTasFiles();
+
+ /**
+ * Loads TAS file from the specified player
+ * @param player_index Player number to save the script
+ * @param file_index Script number of the file
+ */
+ void LoadTasFile(size_t player_index, size_t file_index);
+
+ /**
+ * Writes a TAS file from the recorded commands
+ * @param file_name Name of the file to be written
+ */
+ void WriteTasFile(std::u8string_view file_name);
+
+ /**
+ * Parses a string containing the axis values. X and Y have a range from -32767 to 32767
+ * @param line String containing axis values with the following format "x;y"
+ * @returns A TAS analog object with axis values with range from -1.0 to 1.0
+ */
+ TasAnalog ReadCommandAxis(const std::string& line) const;
+
+ /**
+ * Parses a string containing the button values. Each button is represented by it's text format
+ * specified in text_to_tas_button array
+ * @param line string containing button name with the following format "a;b;c;d..."
+ * @returns A u64 with each bit representing the status of a button
+ */
+ u64 ReadCommandButtons(const std::string& line) const;
+
+ /**
+ * Reset state of all players
+ */
+ void ClearInput();
+
+ /**
+ * Converts an u64 containing the button status into the text equivalent
+ * @param buttons Bitfield with the status of the buttons
+ * @returns A string with the name of the buttons to be written to the file
+ */
+ std::string WriteCommandButtons(u64 buttons) const;
+
+ /**
+ * Converts an TAS analog object containing the axis status into the text equivalent
+ * @param analog Value of the axis
+ * @returns A string with the value of the axis to be written to the file
+ */
+ std::string WriteCommandAxis(TasAnalog analog) const;
+
+ /// Sets an axis for a particular pad to the given value.
+ void SetTasAxis(const PadIdentifier& identifier, TasAxis axis, f32 value);
+
+ size_t script_length{0};
+ bool is_recording{false};
+ bool is_running{false};
+ bool needs_reset{false};
+ std::array<std::vector<TASCommand>, PLAYER_NUMBER> commands{};
+ std::vector<TASCommand> record_commands{};
+ size_t current_command{0};
+ TASCommand last_input{}; // only used for recording
+};
+} // namespace InputCommon::TasInput
diff --git a/src/input_common/drivers/touch_screen.cpp b/src/input_common/drivers/touch_screen.cpp
new file mode 100644
index 000000000..880781825
--- /dev/null
+++ b/src/input_common/drivers/touch_screen.cpp
@@ -0,0 +1,53 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/param_package.h"
+#include "input_common/drivers/touch_screen.h"
+
+namespace InputCommon {
+
+constexpr PadIdentifier identifier = {
+ .guid = Common::UUID{Common::INVALID_UUID},
+ .port = 0,
+ .pad = 0,
+};
+
+TouchScreen::TouchScreen(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ PreSetController(identifier);
+}
+
+void TouchScreen::TouchMoved(float x, float y, std::size_t finger) {
+ if (finger >= 16) {
+ return;
+ }
+ TouchPressed(x, y, finger);
+}
+
+void TouchScreen::TouchPressed(float x, float y, std::size_t finger) {
+ if (finger >= 16) {
+ return;
+ }
+ SetButton(identifier, static_cast<int>(finger), true);
+ SetAxis(identifier, static_cast<int>(finger * 2), x);
+ SetAxis(identifier, static_cast<int>(finger * 2 + 1), y);
+}
+
+void TouchScreen::TouchReleased(std::size_t finger) {
+ if (finger >= 16) {
+ return;
+ }
+ SetButton(identifier, static_cast<int>(finger), false);
+ SetAxis(identifier, static_cast<int>(finger * 2), 0.0f);
+ SetAxis(identifier, static_cast<int>(finger * 2 + 1), 0.0f);
+}
+
+void TouchScreen::ReleaseAllTouch() {
+ for (int index = 0; index < 16; ++index) {
+ SetButton(identifier, index, false);
+ SetAxis(identifier, index * 2, 0.0f);
+ SetAxis(identifier, index * 2 + 1, 0.0f);
+ }
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/touch_screen.h b/src/input_common/drivers/touch_screen.h
new file mode 100644
index 000000000..bf395c40b
--- /dev/null
+++ b/src/input_common/drivers/touch_screen.h
@@ -0,0 +1,44 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include "input_common/input_engine.h"
+
+namespace InputCommon {
+
+/**
+ * A button device factory representing a keyboard. It receives keyboard events and forward them
+ * to all button devices it created.
+ */
+class TouchScreen final : public InputEngine {
+public:
+ explicit TouchScreen(std::string input_engine_);
+
+ /**
+ * Signals that mouse has moved.
+ * @param x the x-coordinate of the cursor
+ * @param y the y-coordinate of the cursor
+ * @param center_x the x-coordinate of the middle of the screen
+ * @param center_y the y-coordinate of the middle of the screen
+ */
+ void TouchMoved(float x, float y, std::size_t finger);
+
+ /**
+ * Sets the status of all buttons bound with the key to pressed
+ * @param key_code the code of the key to press
+ */
+ void TouchPressed(float x, float y, std::size_t finger);
+
+ /**
+ * Sets the status of all buttons bound with the key to released
+ * @param key_code the code of the key to release
+ */
+ void TouchReleased(std::size_t finger);
+
+ /// Resets all inputs to their initial value
+ void ReleaseAllTouch();
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp
new file mode 100644
index 000000000..4ab991a7d
--- /dev/null
+++ b/src/input_common/drivers/udp_client.cpp
@@ -0,0 +1,591 @@
+// Copyright 2018 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <random>
+#include <boost/asio.hpp>
+#include <fmt/format.h>
+
+#include "common/logging/log.h"
+#include "common/param_package.h"
+#include "common/settings.h"
+#include "input_common/drivers/udp_client.h"
+#include "input_common/helpers/udp_protocol.h"
+
+using boost::asio::ip::udp;
+
+namespace InputCommon::CemuhookUDP {
+
+struct SocketCallback {
+ std::function<void(Response::Version)> version;
+ std::function<void(Response::PortInfo)> port_info;
+ std::function<void(Response::PadData)> pad_data;
+};
+
+class Socket {
+public:
+ using clock = std::chrono::system_clock;
+
+ explicit Socket(const std::string& host, u16 port, SocketCallback callback_)
+ : callback(std::move(callback_)), timer(io_service),
+ socket(io_service, udp::endpoint(udp::v4(), 0)), client_id(GenerateRandomClientId()) {
+ boost::system::error_code ec{};
+ auto ipv4 = boost::asio::ip::make_address_v4(host, ec);
+ if (ec.value() != boost::system::errc::success) {
+ LOG_ERROR(Input, "Invalid IPv4 address \"{}\" provided to socket", host);
+ ipv4 = boost::asio::ip::address_v4{};
+ }
+
+ send_endpoint = {udp::endpoint(ipv4, port)};
+ }
+
+ void Stop() {
+ io_service.stop();
+ }
+
+ void Loop() {
+ io_service.run();
+ }
+
+ void StartSend(const clock::time_point& from) {
+ timer.expires_at(from + std::chrono::seconds(3));
+ timer.async_wait([this](const boost::system::error_code& error) { HandleSend(error); });
+ }
+
+ void StartReceive() {
+ socket.async_receive_from(
+ boost::asio::buffer(receive_buffer), receive_endpoint,
+ [this](const boost::system::error_code& error, std::size_t bytes_transferred) {
+ HandleReceive(error, bytes_transferred);
+ });
+ }
+
+private:
+ u32 GenerateRandomClientId() const {
+ std::random_device device;
+ return device();
+ }
+
+ void HandleReceive(const boost::system::error_code&, std::size_t bytes_transferred) {
+ if (auto type = Response::Validate(receive_buffer.data(), bytes_transferred)) {
+ switch (*type) {
+ case Type::Version: {
+ Response::Version version;
+ std::memcpy(&version, &receive_buffer[sizeof(Header)], sizeof(Response::Version));
+ callback.version(std::move(version));
+ break;
+ }
+ case Type::PortInfo: {
+ Response::PortInfo port_info;
+ std::memcpy(&port_info, &receive_buffer[sizeof(Header)],
+ sizeof(Response::PortInfo));
+ callback.port_info(std::move(port_info));
+ break;
+ }
+ case Type::PadData: {
+ Response::PadData pad_data;
+ std::memcpy(&pad_data, &receive_buffer[sizeof(Header)], sizeof(Response::PadData));
+ callback.pad_data(std::move(pad_data));
+ break;
+ }
+ }
+ }
+ StartReceive();
+ }
+
+ void HandleSend(const boost::system::error_code&) {
+ boost::system::error_code _ignored{};
+ // Send a request for getting port info for the pad
+ const Request::PortInfo port_info{4, {0, 1, 2, 3}};
+ const auto port_message = Request::Create(port_info, client_id);
+ std::memcpy(&send_buffer1, &port_message, PORT_INFO_SIZE);
+ socket.send_to(boost::asio::buffer(send_buffer1), send_endpoint, {}, _ignored);
+
+ // Send a request for getting pad data for the pad
+ const Request::PadData pad_data{
+ Request::RegisterFlags::AllPads,
+ 0,
+ EMPTY_MAC_ADDRESS,
+ };
+ const auto pad_message = Request::Create(pad_data, client_id);
+ std::memcpy(send_buffer2.data(), &pad_message, PAD_DATA_SIZE);
+ socket.send_to(boost::asio::buffer(send_buffer2), send_endpoint, {}, _ignored);
+ StartSend(timer.expiry());
+ }
+
+ SocketCallback callback;
+ boost::asio::io_service io_service;
+ boost::asio::basic_waitable_timer<clock> timer;
+ udp::socket socket;
+
+ const u32 client_id;
+
+ static constexpr std::size_t PORT_INFO_SIZE = sizeof(Message<Request::PortInfo>);
+ static constexpr std::size_t PAD_DATA_SIZE = sizeof(Message<Request::PadData>);
+ std::array<u8, PORT_INFO_SIZE> send_buffer1;
+ std::array<u8, PAD_DATA_SIZE> send_buffer2;
+ udp::endpoint send_endpoint;
+
+ std::array<u8, MAX_PACKET_SIZE> receive_buffer;
+ udp::endpoint receive_endpoint;
+};
+
+static void SocketLoop(Socket* socket) {
+ socket->StartReceive();
+ socket->StartSend(Socket::clock::now());
+ socket->Loop();
+}
+
+UDPClient::UDPClient(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
+ LOG_INFO(Input, "Udp Initialization started");
+ ReloadSockets();
+}
+
+UDPClient::~UDPClient() {
+ Reset();
+}
+
+UDPClient::ClientConnection::ClientConnection() = default;
+
+UDPClient::ClientConnection::~ClientConnection() = default;
+
+void UDPClient::ReloadSockets() {
+ Reset();
+
+ std::stringstream servers_ss(Settings::values.udp_input_servers.GetValue());
+ std::string server_token;
+ std::size_t client = 0;
+ while (std::getline(servers_ss, server_token, ',')) {
+ if (client == MAX_UDP_CLIENTS) {
+ break;
+ }
+ std::stringstream server_ss(server_token);
+ std::string token;
+ std::getline(server_ss, token, ':');
+ std::string udp_input_address = token;
+ std::getline(server_ss, token, ':');
+ char* temp;
+ const u16 udp_input_port = static_cast<u16>(std::strtol(token.c_str(), &temp, 0));
+ if (*temp != '\0') {
+ LOG_ERROR(Input, "Port number is not valid {}", token);
+ continue;
+ }
+
+ const std::size_t client_number = GetClientNumber(udp_input_address, udp_input_port);
+ if (client_number != MAX_UDP_CLIENTS) {
+ LOG_ERROR(Input, "Duplicated UDP servers found");
+ continue;
+ }
+ StartCommunication(client++, udp_input_address, udp_input_port);
+ }
+}
+
+std::size_t UDPClient::GetClientNumber(std::string_view host, u16 port) const {
+ for (std::size_t client = 0; client < clients.size(); client++) {
+ if (clients[client].active == -1) {
+ continue;
+ }
+ if (clients[client].host == host && clients[client].port == port) {
+ return client;
+ }
+ }
+ return MAX_UDP_CLIENTS;
+}
+
+void UDPClient::OnVersion([[maybe_unused]] Response::Version data) {
+ LOG_TRACE(Input, "Version packet received: {}", data.version);
+}
+
+void UDPClient::OnPortInfo([[maybe_unused]] Response::PortInfo data) {
+ LOG_TRACE(Input, "PortInfo packet received: {}", data.model);
+}
+
+void UDPClient::OnPadData(Response::PadData data, std::size_t client) {
+ const std::size_t pad_index = (client * PADS_PER_CLIENT) + data.info.id;
+
+ if (pad_index >= pads.size()) {
+ LOG_ERROR(Input, "Invalid pad id {}", data.info.id);
+ return;
+ }
+
+ LOG_TRACE(Input, "PadData packet received");
+ if (data.packet_counter == pads[pad_index].packet_sequence) {
+ LOG_WARNING(
+ Input,
+ "PadData packet dropped because its stale info. Current count: {} Packet count: {}",
+ pads[pad_index].packet_sequence, data.packet_counter);
+ pads[pad_index].connected = false;
+ return;
+ }
+
+ clients[client].active = 1;
+ pads[pad_index].connected = true;
+ pads[pad_index].packet_sequence = data.packet_counter;
+
+ const auto now = std::chrono::steady_clock::now();
+ const auto time_difference = static_cast<u64>(
+ std::chrono::duration_cast<std::chrono::microseconds>(now - pads[pad_index].last_update)
+ .count());
+ pads[pad_index].last_update = now;
+
+ // Gyroscope values are not it the correct scale from better joy.
+ // Dividing by 312 allows us to make one full turn = 1 turn
+ // This must be a configurable valued called sensitivity
+ const float gyro_scale = 1.0f / 312.0f;
+
+ const BasicMotion motion{
+ .gyro_x = data.gyro.pitch * gyro_scale,
+ .gyro_y = data.gyro.roll * gyro_scale,
+ .gyro_z = -data.gyro.yaw * gyro_scale,
+ .accel_x = data.accel.x,
+ .accel_y = -data.accel.z,
+ .accel_z = data.accel.y,
+ .delta_timestamp = time_difference,
+ };
+ const PadIdentifier identifier = GetPadIdentifier(pad_index);
+ SetMotion(identifier, 0, motion);
+
+ for (std::size_t id = 0; id < data.touch.size(); ++id) {
+ const auto touch_pad = data.touch[id];
+ const auto touch_axis_x_id =
+ static_cast<int>(id == 0 ? PadAxes::Touch1X : PadAxes::Touch2X);
+ const auto touch_axis_y_id =
+ static_cast<int>(id == 0 ? PadAxes::Touch1Y : PadAxes::Touch2Y);
+ const auto touch_button_id =
+ static_cast<int>(id == 0 ? PadButton::Touch1 : PadButton::touch2);
+
+ // TODO: Use custom calibration per device
+ const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue());
+ const u16 min_x = static_cast<u16>(touch_param.Get("min_x", 100));
+ const u16 min_y = static_cast<u16>(touch_param.Get("min_y", 50));
+ const u16 max_x = static_cast<u16>(touch_param.Get("max_x", 1800));
+ const u16 max_y = static_cast<u16>(touch_param.Get("max_y", 850));
+
+ const f32 x =
+ static_cast<f32>(std::clamp(static_cast<u16>(touch_pad.x), min_x, max_x) - min_x) /
+ static_cast<f32>(max_x - min_x);
+ const f32 y =
+ static_cast<f32>(std::clamp(static_cast<u16>(touch_pad.y), min_y, max_y) - min_y) /
+ static_cast<f32>(max_y - min_y);
+
+ if (touch_pad.is_active) {
+ SetAxis(identifier, touch_axis_x_id, x);
+ SetAxis(identifier, touch_axis_y_id, y);
+ SetButton(identifier, touch_button_id, true);
+ continue;
+ }
+ SetAxis(identifier, touch_axis_x_id, 0);
+ SetAxis(identifier, touch_axis_y_id, 0);
+ SetButton(identifier, touch_button_id, false);
+ }
+
+ SetAxis(identifier, static_cast<int>(PadAxes::LeftStickX),
+ (data.left_stick_x - 127.0f) / 127.0f);
+ SetAxis(identifier, static_cast<int>(PadAxes::LeftStickY),
+ (data.left_stick_y - 127.0f) / 127.0f);
+ SetAxis(identifier, static_cast<int>(PadAxes::RightStickX),
+ (data.right_stick_x - 127.0f) / 127.0f);
+ SetAxis(identifier, static_cast<int>(PadAxes::RightStickY),
+ (data.right_stick_y - 127.0f) / 127.0f);
+
+ static constexpr std::array<PadButton, 16> buttons{
+ PadButton::Share, PadButton::L3, PadButton::R3, PadButton::Options,
+ PadButton::Up, PadButton::Right, PadButton::Down, PadButton::Left,
+ PadButton::L2, PadButton::R2, PadButton::L1, PadButton::R1,
+ PadButton::Triangle, PadButton::Circle, PadButton::Cross, PadButton::Square};
+
+ for (std::size_t i = 0; i < buttons.size(); ++i) {
+ const bool button_status = (data.digital_button & (1U << i)) != 0;
+ const int button = static_cast<int>(buttons[i]);
+ SetButton(identifier, button, button_status);
+ }
+}
+
+void UDPClient::StartCommunication(std::size_t client, const std::string& host, u16 port) {
+ SocketCallback callback{[this](Response::Version version) { OnVersion(version); },
+ [this](Response::PortInfo info) { OnPortInfo(info); },
+ [this, client](Response::PadData data) { OnPadData(data, client); }};
+ LOG_INFO(Input, "Starting communication with UDP input server on {}:{}", host, port);
+ clients[client].uuid = GetHostUUID(host);
+ clients[client].host = host;
+ clients[client].port = port;
+ clients[client].active = 0;
+ clients[client].socket = std::make_unique<Socket>(host, port, callback);
+ clients[client].thread = std::thread{SocketLoop, clients[client].socket.get()};
+ for (std::size_t index = 0; index < PADS_PER_CLIENT; ++index) {
+ const PadIdentifier identifier = GetPadIdentifier(client * PADS_PER_CLIENT + index);
+ PreSetController(identifier);
+ }
+}
+
+const PadIdentifier UDPClient::GetPadIdentifier(std::size_t pad_index) const {
+ const std::size_t client = pad_index / PADS_PER_CLIENT;
+ return {
+ .guid = clients[client].uuid,
+ .port = static_cast<std::size_t>(clients[client].port),
+ .pad = pad_index,
+ };
+}
+
+const Common::UUID UDPClient::GetHostUUID(const std::string host) const {
+ const auto ip = boost::asio::ip::address_v4::from_string(host);
+ const auto hex_host = fmt::format("{:06x}", ip.to_ulong());
+ return Common::UUID{hex_host};
+}
+
+void UDPClient::Reset() {
+ for (auto& client : clients) {
+ if (client.thread.joinable()) {
+ client.active = -1;
+ client.socket->Stop();
+ client.thread.join();
+ }
+ }
+}
+
+std::vector<Common::ParamPackage> UDPClient::GetInputDevices() const {
+ std::vector<Common::ParamPackage> devices;
+ if (!Settings::values.enable_udp_controller) {
+ return devices;
+ }
+ for (std::size_t client = 0; client < clients.size(); client++) {
+ if (clients[client].active != 1) {
+ continue;
+ }
+ for (std::size_t index = 0; index < PADS_PER_CLIENT; ++index) {
+ const std::size_t pad_index = client * PADS_PER_CLIENT + index;
+ if (!pads[pad_index].connected) {
+ continue;
+ }
+ const auto pad_identifier = GetPadIdentifier(pad_index);
+ Common::ParamPackage identifier{};
+ identifier.Set("engine", GetEngineName());
+ identifier.Set("display", fmt::format("UDP Controller {}", pad_identifier.pad));
+ identifier.Set("guid", pad_identifier.guid.Format());
+ identifier.Set("port", static_cast<int>(pad_identifier.port));
+ identifier.Set("pad", static_cast<int>(pad_identifier.pad));
+ devices.emplace_back(identifier);
+ }
+ }
+ return devices;
+}
+
+ButtonMapping UDPClient::GetButtonMappingForDevice(const Common::ParamPackage& params) {
+ // This list excludes any button that can't be really mapped
+ static constexpr std::array<std::pair<Settings::NativeButton::Values, PadButton>, 18>
+ switch_to_dsu_button = {
+ std::pair{Settings::NativeButton::A, PadButton::Circle},
+ {Settings::NativeButton::B, PadButton::Cross},
+ {Settings::NativeButton::X, PadButton::Triangle},
+ {Settings::NativeButton::Y, PadButton::Square},
+ {Settings::NativeButton::Plus, PadButton::Options},
+ {Settings::NativeButton::Minus, PadButton::Share},
+ {Settings::NativeButton::DLeft, PadButton::Left},
+ {Settings::NativeButton::DUp, PadButton::Up},
+ {Settings::NativeButton::DRight, PadButton::Right},
+ {Settings::NativeButton::DDown, PadButton::Down},
+ {Settings::NativeButton::L, PadButton::L1},
+ {Settings::NativeButton::R, PadButton::R1},
+ {Settings::NativeButton::ZL, PadButton::L2},
+ {Settings::NativeButton::ZR, PadButton::R2},
+ {Settings::NativeButton::SL, PadButton::L2},
+ {Settings::NativeButton::SR, PadButton::R2},
+ {Settings::NativeButton::LStick, PadButton::L3},
+ {Settings::NativeButton::RStick, PadButton::R3},
+ };
+ if (!params.Has("guid") || !params.Has("port") || !params.Has("pad")) {
+ return {};
+ }
+
+ ButtonMapping mapping{};
+ for (const auto& [switch_button, dsu_button] : switch_to_dsu_button) {
+ Common::ParamPackage button_params{};
+ button_params.Set("engine", GetEngineName());
+ button_params.Set("guid", params.Get("guid", ""));
+ button_params.Set("port", params.Get("port", 0));
+ button_params.Set("pad", params.Get("pad", 0));
+ button_params.Set("button", static_cast<int>(dsu_button));
+ mapping.insert_or_assign(switch_button, std::move(button_params));
+ }
+
+ return mapping;
+}
+
+AnalogMapping UDPClient::GetAnalogMappingForDevice(const Common::ParamPackage& params) {
+ if (!params.Has("guid") || !params.Has("port") || !params.Has("pad")) {
+ return {};
+ }
+
+ AnalogMapping mapping = {};
+ Common::ParamPackage left_analog_params;
+ left_analog_params.Set("engine", GetEngineName());
+ left_analog_params.Set("guid", params.Get("guid", ""));
+ left_analog_params.Set("port", params.Get("port", 0));
+ left_analog_params.Set("pad", params.Get("pad", 0));
+ left_analog_params.Set("axis_x", static_cast<int>(PadAxes::LeftStickX));
+ left_analog_params.Set("axis_y", static_cast<int>(PadAxes::LeftStickY));
+ mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params));
+ Common::ParamPackage right_analog_params;
+ right_analog_params.Set("engine", GetEngineName());
+ right_analog_params.Set("guid", params.Get("guid", ""));
+ right_analog_params.Set("port", params.Get("port", 0));
+ right_analog_params.Set("pad", params.Get("pad", 0));
+ right_analog_params.Set("axis_x", static_cast<int>(PadAxes::RightStickX));
+ right_analog_params.Set("axis_y", static_cast<int>(PadAxes::RightStickY));
+ mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params));
+ return mapping;
+}
+
+MotionMapping UDPClient::GetMotionMappingForDevice(const Common::ParamPackage& params) {
+ if (!params.Has("guid") || !params.Has("port") || !params.Has("pad")) {
+ return {};
+ }
+
+ MotionMapping mapping = {};
+ Common::ParamPackage motion_params;
+ motion_params.Set("engine", GetEngineName());
+ motion_params.Set("guid", params.Get("guid", ""));
+ motion_params.Set("port", params.Get("port", 0));
+ motion_params.Set("pad", params.Get("pad", 0));
+ motion_params.Set("motion", 0);
+ mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, std::move(motion_params));
+ mapping.insert_or_assign(Settings::NativeMotion::MotionRight, std::move(motion_params));
+ return mapping;
+}
+
+Common::Input::ButtonNames UDPClient::GetUIButtonName(const Common::ParamPackage& params) const {
+ PadButton button = static_cast<PadButton>(params.Get("button", 0));
+ switch (button) {
+ case PadButton::Left:
+ return Common::Input::ButtonNames::ButtonLeft;
+ case PadButton::Right:
+ return Common::Input::ButtonNames::ButtonRight;
+ case PadButton::Down:
+ return Common::Input::ButtonNames::ButtonDown;
+ case PadButton::Up:
+ return Common::Input::ButtonNames::ButtonUp;
+ case PadButton::L1:
+ return Common::Input::ButtonNames::L1;
+ case PadButton::L2:
+ return Common::Input::ButtonNames::L2;
+ case PadButton::L3:
+ return Common::Input::ButtonNames::L3;
+ case PadButton::R1:
+ return Common::Input::ButtonNames::R1;
+ case PadButton::R2:
+ return Common::Input::ButtonNames::R2;
+ case PadButton::R3:
+ return Common::Input::ButtonNames::R3;
+ case PadButton::Circle:
+ return Common::Input::ButtonNames::Circle;
+ case PadButton::Cross:
+ return Common::Input::ButtonNames::Cross;
+ case PadButton::Square:
+ return Common::Input::ButtonNames::Square;
+ case PadButton::Triangle:
+ return Common::Input::ButtonNames::Triangle;
+ case PadButton::Share:
+ return Common::Input::ButtonNames::Share;
+ case PadButton::Options:
+ return Common::Input::ButtonNames::Options;
+ default:
+ return Common::Input::ButtonNames::Undefined;
+ }
+}
+
+Common::Input::ButtonNames UDPClient::GetUIName(const Common::ParamPackage& params) const {
+ if (params.Has("button")) {
+ return GetUIButtonName(params);
+ }
+ if (params.Has("axis")) {
+ return Common::Input::ButtonNames::Value;
+ }
+ if (params.Has("motion")) {
+ return Common::Input::ButtonNames::Engine;
+ }
+
+ return Common::Input::ButtonNames::Invalid;
+}
+
+void TestCommunication(const std::string& host, u16 port,
+ const std::function<void()>& success_callback,
+ const std::function<void()>& failure_callback) {
+ std::thread([=] {
+ Common::Event success_event;
+ SocketCallback callback{
+ .version = [](Response::Version) {},
+ .port_info = [](Response::PortInfo) {},
+ .pad_data = [&](Response::PadData) { success_event.Set(); },
+ };
+ Socket socket{host, port, std::move(callback)};
+ std::thread worker_thread{SocketLoop, &socket};
+ const bool result =
+ success_event.WaitUntil(std::chrono::steady_clock::now() + std::chrono::seconds(10));
+ socket.Stop();
+ worker_thread.join();
+ if (result) {
+ success_callback();
+ } else {
+ failure_callback();
+ }
+ }).detach();
+}
+
+CalibrationConfigurationJob::CalibrationConfigurationJob(
+ const std::string& host, u16 port, std::function<void(Status)> status_callback,
+ std::function<void(u16, u16, u16, u16)> data_callback) {
+
+ std::thread([=, this] {
+ Status current_status{Status::Initialized};
+ SocketCallback callback{
+ [](Response::Version) {}, [](Response::PortInfo) {},
+ [&](Response::PadData data) {
+ static constexpr u16 CALIBRATION_THRESHOLD = 100;
+ static constexpr u16 MAX_VALUE = UINT16_MAX;
+
+ if (current_status == Status::Initialized) {
+ // Receiving data means the communication is ready now
+ current_status = Status::Ready;
+ status_callback(current_status);
+ }
+ const auto& touchpad_0 = data.touch[0];
+ if (touchpad_0.is_active == 0) {
+ return;
+ }
+ LOG_DEBUG(Input, "Current touch: {} {}", touchpad_0.x, touchpad_0.y);
+ const u16 min_x = std::min(MAX_VALUE, static_cast<u16>(touchpad_0.x));
+ const u16 min_y = std::min(MAX_VALUE, static_cast<u16>(touchpad_0.y));
+ if (current_status == Status::Ready) {
+ // First touch - min data (min_x/min_y)
+ current_status = Status::Stage1Completed;
+ status_callback(current_status);
+ }
+ if (touchpad_0.x - min_x > CALIBRATION_THRESHOLD &&
+ touchpad_0.y - min_y > CALIBRATION_THRESHOLD) {
+ // Set the current position as max value and finishes configuration
+ const u16 max_x = touchpad_0.x;
+ const u16 max_y = touchpad_0.y;
+ current_status = Status::Completed;
+ data_callback(min_x, min_y, max_x, max_y);
+ status_callback(current_status);
+
+ complete_event.Set();
+ }
+ }};
+ Socket socket{host, port, std::move(callback)};
+ std::thread worker_thread{SocketLoop, &socket};
+ complete_event.Wait();
+ socket.Stop();
+ worker_thread.join();
+ }).detach();
+}
+
+CalibrationConfigurationJob::~CalibrationConfigurationJob() {
+ Stop();
+}
+
+void CalibrationConfigurationJob::Stop() {
+ complete_event.Set();
+}
+
+} // namespace InputCommon::CemuhookUDP
diff --git a/src/input_common/udp/client.h b/src/input_common/drivers/udp_client.h
index 380f9bb76..1adc947c4 100644
--- a/src/input_common/udp/client.h
+++ b/src/input_common/drivers/udp_client.h
@@ -4,20 +4,11 @@
#pragma once
-#include <functional>
-#include <memory>
-#include <mutex>
#include <optional>
-#include <string>
-#include <thread>
-#include <tuple>
+
#include "common/common_types.h"
-#include "common/param_package.h"
#include "common/thread.h"
-#include "common/threadsafe_queue.h"
-#include "common/vector_math.h"
-#include "core/frontend/input.h"
-#include "input_common/motion_input.h"
+#include "input_common/input_engine.h"
namespace InputCommon::CemuhookUDP {
@@ -30,16 +21,6 @@ struct TouchPad;
struct Version;
} // namespace Response
-enum class PadMotion {
- GyroX,
- GyroY,
- GyroZ,
- AccX,
- AccY,
- AccZ,
- Undefined,
-};
-
enum class PadTouch {
Click,
Undefined,
@@ -49,14 +30,10 @@ struct UDPPadStatus {
std::string host{"127.0.0.1"};
u16 port{26760};
std::size_t pad_index{};
- PadMotion motion{PadMotion::Undefined};
- f32 motion_value{0.0f};
};
struct DeviceStatus {
std::mutex update_mutex;
- Input::MotionStatus motion_status;
- std::tuple<float, float, bool> touch_status;
// calibration data for scaling the device's touch area to 3ds
struct CalibrationData {
@@ -68,48 +45,85 @@ struct DeviceStatus {
std::optional<CalibrationData> touch_calibration;
};
-class Client {
+/**
+ * A button device factory representing a keyboard. It receives keyboard events and forward them
+ * to all button devices it created.
+ */
+class UDPClient final : public InputEngine {
public:
- // Initialize the UDP client capture and read sequence
- Client();
-
- // Close and release the client
- ~Client();
-
- // Used for polling
- void BeginConfiguration();
- void EndConfiguration();
-
- std::vector<Common::ParamPackage> GetInputDevices() const;
+ explicit UDPClient(std::string input_engine_);
+ ~UDPClient() override;
- bool DeviceConnected(std::size_t pad) const;
void ReloadSockets();
- Common::SPSCQueue<UDPPadStatus>& GetPadQueue();
- const Common::SPSCQueue<UDPPadStatus>& GetPadQueue() const;
+ /// Used for automapping features
+ std::vector<Common::ParamPackage> GetInputDevices() const override;
+ ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override;
+ AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override;
+ MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override;
+ Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
- DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad);
- const DeviceStatus& GetPadState(const std::string& host, u16 port, std::size_t pad) const;
+private:
+ enum class PadButton {
+ Undefined = 0x0000,
+ Share = 0x0001,
+ L3 = 0x0002,
+ R3 = 0x0004,
+ Options = 0x0008,
+ Up = 0x0010,
+ Right = 0x0020,
+ Down = 0x0040,
+ Left = 0x0080,
+ L2 = 0x0100,
+ R2 = 0x0200,
+ L1 = 0x0400,
+ R1 = 0x0800,
+ Triangle = 0x1000,
+ Circle = 0x2000,
+ Cross = 0x4000,
+ Square = 0x8000,
+ Touch1 = 0x10000,
+ touch2 = 0x20000,
+ };
- Input::TouchStatus& GetTouchState();
- const Input::TouchStatus& GetTouchState() const;
+ enum class PadAxes : u8 {
+ LeftStickX,
+ LeftStickY,
+ RightStickX,
+ RightStickY,
+ AnalogLeft,
+ AnalogDown,
+ AnalogRight,
+ AnalogUp,
+ AnalogSquare,
+ AnalogCross,
+ AnalogCircle,
+ AnalogTriangle,
+ AnalogR1,
+ AnalogL1,
+ AnalogR2,
+ AnalogL3,
+ AnalogR3,
+ Touch1X,
+ Touch1Y,
+ Touch2X,
+ Touch2Y,
+ Undefined,
+ };
-private:
struct PadData {
std::size_t pad_index{};
bool connected{};
DeviceStatus status;
u64 packet_sequence{};
- // Realtime values
- // motion is initalized with PID values for drift correction on joycons
- InputCommon::MotionInput motion{0.3f, 0.005f, 0.0f};
std::chrono::time_point<std::chrono::steady_clock> last_update;
};
struct ClientConnection {
ClientConnection();
~ClientConnection();
+ Common::UUID uuid{"7F000001"};
std::string host{"127.0.0.1"};
u16 port{26760};
s8 active{-1};
@@ -127,28 +141,16 @@ private:
void OnPortInfo(Response::PortInfo);
void OnPadData(Response::PadData, std::size_t client);
void StartCommunication(std::size_t client, const std::string& host, u16 port);
- void UpdateYuzuSettings(std::size_t client, std::size_t pad_index,
- const Common::Vec3<float>& acc, const Common::Vec3<float>& gyro);
-
- // Returns an unused finger id, if there is no fingers available std::nullopt will be
- // returned
- std::optional<std::size_t> GetUnusedFingerID() const;
-
- // Merges and updates all touch inputs into the touch_status array
- void UpdateTouchInput(Response::TouchPad& touch_pad, std::size_t client, std::size_t id);
+ const PadIdentifier GetPadIdentifier(std::size_t pad_index) const;
+ const Common::UUID GetHostUUID(const std::string host) const;
- bool configuring = false;
+ Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const;
// Allocate clients for 8 udp servers
static constexpr std::size_t MAX_UDP_CLIENTS = 8;
static constexpr std::size_t PADS_PER_CLIENT = 4;
- // Each client can have up 2 touch inputs
- static constexpr std::size_t MAX_TOUCH_FINGERS = MAX_UDP_CLIENTS * 2;
std::array<PadData, MAX_UDP_CLIENTS * PADS_PER_CLIENT> pads{};
std::array<ClientConnection, MAX_UDP_CLIENTS> clients{};
- Common::SPSCQueue<UDPPadStatus> pad_queue{};
- Input::TouchStatus touch_status{};
- std::array<std::size_t, MAX_TOUCH_FINGERS> finger_id{};
};
/// An async job allowing configuration of the touchpad calibration.
diff --git a/src/input_common/gcadapter/gc_adapter.h b/src/input_common/gcadapter/gc_adapter.h
deleted file mode 100644
index e5de5e94f..000000000
--- a/src/input_common/gcadapter/gc_adapter.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2014 Dolphin Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#pragma once
-#include <algorithm>
-#include <functional>
-#include <mutex>
-#include <thread>
-#include <unordered_map>
-#include "common/common_types.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/main.h"
-
-struct libusb_context;
-struct libusb_device;
-struct libusb_device_handle;
-
-namespace GCAdapter {
-
-enum class PadButton {
- Undefined = 0x0000,
- ButtonLeft = 0x0001,
- ButtonRight = 0x0002,
- ButtonDown = 0x0004,
- ButtonUp = 0x0008,
- TriggerZ = 0x0010,
- TriggerR = 0x0020,
- TriggerL = 0x0040,
- ButtonA = 0x0100,
- ButtonB = 0x0200,
- ButtonX = 0x0400,
- ButtonY = 0x0800,
- ButtonStart = 0x1000,
- // Below is for compatibility with "AxisButton" type
- Stick = 0x2000,
-};
-
-enum class PadAxes : u8 {
- StickX,
- StickY,
- SubstickX,
- SubstickY,
- TriggerLeft,
- TriggerRight,
- Undefined,
-};
-
-enum class ControllerTypes {
- None,
- Wired,
- Wireless,
-};
-
-struct GCPadStatus {
- std::size_t port{};
-
- PadButton button{PadButton::Undefined}; // Or-ed PAD_BUTTON_* and PAD_TRIGGER_* bits
-
- PadAxes axis{PadAxes::Undefined};
- s16 axis_value{};
- u8 axis_threshold{50};
-};
-
-struct GCController {
- ControllerTypes type{};
- bool enable_vibration{};
- u8 rumble_amplitude{};
- u16 buttons{};
- PadButton last_button{};
- std::array<s16, 6> axis_values{};
- std::array<u8, 6> axis_origin{};
- u8 reset_origin_counter{};
-};
-
-class Adapter {
-public:
- Adapter();
- ~Adapter();
-
- /// Request a vibration for a controller
- bool RumblePlay(std::size_t port, u8 amplitude);
-
- /// Used for polling
- void BeginConfiguration();
- void EndConfiguration();
-
- Common::SPSCQueue<GCPadStatus>& GetPadQueue();
- const Common::SPSCQueue<GCPadStatus>& GetPadQueue() const;
-
- GCController& GetPadState(std::size_t port);
- const GCController& GetPadState(std::size_t port) const;
-
- /// Returns true if there is a device connected to port
- bool DeviceConnected(std::size_t port) const;
-
- /// Used for automapping features
- std::vector<Common::ParamPackage> GetInputDevices() const;
- InputCommon::ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) const;
- InputCommon::AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) const;
-
-private:
- using AdapterPayload = std::array<u8, 37>;
-
- void UpdatePadType(std::size_t port, ControllerTypes pad_type);
- void UpdateControllers(const AdapterPayload& adapter_payload);
- void UpdateYuzuSettings(std::size_t port);
- void UpdateStateButtons(std::size_t port, u8 b1, u8 b2);
- void UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_payload);
- void UpdateVibrations();
-
- void AdapterInputThread();
-
- void AdapterScanThread();
-
- bool IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payload_size);
-
- // Updates vibration state of all controllers
- void SendVibrations();
-
- /// For use in initialization, querying devices to find the adapter
- void Setup();
-
- /// Resets status of all GC controller devices to a disconnected state
- void ResetDevices();
-
- /// Resets status of device connected to a disconnected state
- void ResetDevice(std::size_t port);
-
- /// Returns true if we successfully gain access to GC Adapter
- bool CheckDeviceAccess();
-
- /// Captures GC Adapter endpoint address
- /// Returns true if the endpoint was set correctly
- bool GetGCEndpoint(libusb_device* device);
-
- /// For shutting down, clear all data, join all threads, release usb
- void Reset();
-
- // Join all threads
- void JoinThreads();
-
- // Release usb handles
- void ClearLibusbHandle();
-
- libusb_device_handle* usb_adapter_handle = nullptr;
- std::array<GCController, 4> pads;
- Common::SPSCQueue<GCPadStatus> pad_queue;
-
- std::thread adapter_input_thread;
- std::thread adapter_scan_thread;
- bool adapter_input_thread_running;
- bool adapter_scan_thread_running;
- bool restart_scan_thread;
-
- libusb_context* libusb_ctx;
-
- u8 input_endpoint{0};
- u8 output_endpoint{0};
- u8 input_error_counter{0};
- u8 output_error_counter{0};
- int vibration_counter{0};
-
- bool configuring{false};
- bool rumble_enabled{true};
- bool vibration_changed{true};
-};
-} // namespace GCAdapter
diff --git a/src/input_common/gcadapter/gc_poller.cpp b/src/input_common/gcadapter/gc_poller.cpp
deleted file mode 100644
index 1b6ded8d6..000000000
--- a/src/input_common/gcadapter/gc_poller.cpp
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <atomic>
-#include <list>
-#include <mutex>
-#include <utility>
-#include "common/assert.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/gcadapter/gc_adapter.h"
-#include "input_common/gcadapter/gc_poller.h"
-
-namespace InputCommon {
-
-class GCButton final : public Input::ButtonDevice {
-public:
- explicit GCButton(u32 port_, s32 button_, const GCAdapter::Adapter* adapter)
- : port(port_), button(button_), gcadapter(adapter) {}
-
- ~GCButton() override;
-
- bool GetStatus() const override {
- if (gcadapter->DeviceConnected(port)) {
- return (gcadapter->GetPadState(port).buttons & button) != 0;
- }
- return false;
- }
-
-private:
- const u32 port;
- const s32 button;
- const GCAdapter::Adapter* gcadapter;
-};
-
-class GCAxisButton final : public Input::ButtonDevice {
-public:
- explicit GCAxisButton(u32 port_, u32 axis_, float threshold_, bool trigger_if_greater_,
- const GCAdapter::Adapter* adapter)
- : port(port_), axis(axis_), threshold(threshold_), trigger_if_greater(trigger_if_greater_),
- gcadapter(adapter) {}
-
- bool GetStatus() const override {
- if (gcadapter->DeviceConnected(port)) {
- const float current_axis_value = gcadapter->GetPadState(port).axis_values.at(axis);
- const float axis_value = current_axis_value / 128.0f;
- if (trigger_if_greater) {
- // TODO: Might be worthwile to set a slider for the trigger threshold. It is
- // currently always set to 0.5 in configure_input_player.cpp ZL/ZR HandleClick
- return axis_value > threshold;
- }
- return axis_value < -threshold;
- }
- return false;
- }
-
-private:
- const u32 port;
- const u32 axis;
- float threshold;
- bool trigger_if_greater;
- const GCAdapter::Adapter* gcadapter;
-};
-
-GCButtonFactory::GCButtonFactory(std::shared_ptr<GCAdapter::Adapter> adapter_)
- : adapter(std::move(adapter_)) {}
-
-GCButton::~GCButton() = default;
-
-std::unique_ptr<Input::ButtonDevice> GCButtonFactory::Create(const Common::ParamPackage& params) {
- const auto button_id = params.Get("button", 0);
- const auto port = static_cast<u32>(params.Get("port", 0));
-
- constexpr s32 PAD_STICK_ID = static_cast<s32>(GCAdapter::PadButton::Stick);
-
- // button is not an axis/stick button
- if (button_id != PAD_STICK_ID) {
- return std::make_unique<GCButton>(port, button_id, adapter.get());
- }
-
- // For Axis buttons, used by the binary sticks.
- if (button_id == PAD_STICK_ID) {
- const int axis = params.Get("axis", 0);
- const float threshold = params.Get("threshold", 0.25f);
- const std::string direction_name = params.Get("direction", "");
- bool trigger_if_greater;
- if (direction_name == "+") {
- trigger_if_greater = true;
- } else if (direction_name == "-") {
- trigger_if_greater = false;
- } else {
- trigger_if_greater = true;
- LOG_ERROR(Input, "Unknown direction {}", direction_name);
- }
- return std::make_unique<GCAxisButton>(port, axis, threshold, trigger_if_greater,
- adapter.get());
- }
-
- return nullptr;
-}
-
-Common::ParamPackage GCButtonFactory::GetNextInput() const {
- Common::ParamPackage params;
- GCAdapter::GCPadStatus pad;
- auto& queue = adapter->GetPadQueue();
- while (queue.Pop(pad)) {
- // This while loop will break on the earliest detected button
- params.Set("engine", "gcpad");
- params.Set("port", static_cast<s32>(pad.port));
- if (pad.button != GCAdapter::PadButton::Undefined) {
- params.Set("button", static_cast<u16>(pad.button));
- }
-
- // For Axis button implementation
- if (pad.axis != GCAdapter::PadAxes::Undefined) {
- params.Set("axis", static_cast<u8>(pad.axis));
- params.Set("button", static_cast<u16>(GCAdapter::PadButton::Stick));
- params.Set("threshold", "0.25");
- if (pad.axis_value > 0) {
- params.Set("direction", "+");
- } else {
- params.Set("direction", "-");
- }
- break;
- }
- }
- return params;
-}
-
-void GCButtonFactory::BeginConfiguration() {
- polling = true;
- adapter->BeginConfiguration();
-}
-
-void GCButtonFactory::EndConfiguration() {
- polling = false;
- adapter->EndConfiguration();
-}
-
-class GCAnalog final : public Input::AnalogDevice {
-public:
- explicit GCAnalog(u32 port_, u32 axis_x_, u32 axis_y_, bool invert_x_, bool invert_y_,
- float deadzone_, float range_, const GCAdapter::Adapter* adapter)
- : port(port_), axis_x(axis_x_), axis_y(axis_y_), invert_x(invert_x_), invert_y(invert_y_),
- deadzone(deadzone_), range(range_), gcadapter(adapter) {}
-
- float GetAxis(u32 axis) const {
- if (gcadapter->DeviceConnected(port)) {
- std::lock_guard lock{mutex};
- const auto axis_value =
- static_cast<float>(gcadapter->GetPadState(port).axis_values.at(axis));
- return (axis_value) / (100.0f * range);
- }
- return 0.0f;
- }
-
- std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
- float x = GetAxis(analog_axis_x);
- float y = GetAxis(analog_axis_y);
- if (invert_x) {
- x = -x;
- }
- if (invert_y) {
- y = -y;
- }
- // Make sure the coordinates are in the unit circle,
- // otherwise normalize it.
- float r = x * x + y * y;
- if (r > 1.0f) {
- r = std::sqrt(r);
- x /= r;
- y /= r;
- }
-
- return {x, y};
- }
-
- std::tuple<float, float> GetStatus() const override {
- const auto [x, y] = GetAnalog(axis_x, axis_y);
- const float r = std::sqrt((x * x) + (y * y));
- if (r > deadzone) {
- return {x / r * (r - deadzone) / (1 - deadzone),
- y / r * (r - deadzone) / (1 - deadzone)};
- }
- return {0.0f, 0.0f};
- }
-
- std::tuple<float, float> GetRawStatus() const override {
- const float x = GetAxis(axis_x);
- const float y = GetAxis(axis_y);
- return {x, y};
- }
-
- Input::AnalogProperties GetAnalogProperties() const override {
- return {deadzone, range, 0.5f};
- }
-
- bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override {
- const auto [x, y] = GetStatus();
- const float directional_deadzone = 0.5f;
- switch (direction) {
- case Input::AnalogDirection::RIGHT:
- return x > directional_deadzone;
- case Input::AnalogDirection::LEFT:
- return x < -directional_deadzone;
- case Input::AnalogDirection::UP:
- return y > directional_deadzone;
- case Input::AnalogDirection::DOWN:
- return y < -directional_deadzone;
- }
- return false;
- }
-
-private:
- const u32 port;
- const u32 axis_x;
- const u32 axis_y;
- const bool invert_x;
- const bool invert_y;
- const float deadzone;
- const float range;
- const GCAdapter::Adapter* gcadapter;
- mutable std::mutex mutex;
-};
-
-/// An analog device factory that creates analog devices from GC Adapter
-GCAnalogFactory::GCAnalogFactory(std::shared_ptr<GCAdapter::Adapter> adapter_)
- : adapter(std::move(adapter_)) {}
-
-/**
- * Creates analog device from joystick axes
- * @param params contains parameters for creating the device:
- * - "port": the nth gcpad on the adapter
- * - "axis_x": the index of the axis to be bind as x-axis
- * - "axis_y": the index of the axis to be bind as y-axis
- */
-std::unique_ptr<Input::AnalogDevice> GCAnalogFactory::Create(const Common::ParamPackage& params) {
- const auto port = static_cast<u32>(params.Get("port", 0));
- const auto axis_x = static_cast<u32>(params.Get("axis_x", 0));
- const auto axis_y = static_cast<u32>(params.Get("axis_y", 1));
- const auto deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
- const auto range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f);
- const std::string invert_x_value = params.Get("invert_x", "+");
- const std::string invert_y_value = params.Get("invert_y", "+");
- const bool invert_x = invert_x_value == "-";
- const bool invert_y = invert_y_value == "-";
-
- return std::make_unique<GCAnalog>(port, axis_x, axis_y, invert_x, invert_y, deadzone, range,
- adapter.get());
-}
-
-void GCAnalogFactory::BeginConfiguration() {
- polling = true;
- adapter->BeginConfiguration();
-}
-
-void GCAnalogFactory::EndConfiguration() {
- polling = false;
- adapter->EndConfiguration();
-}
-
-Common::ParamPackage GCAnalogFactory::GetNextInput() {
- GCAdapter::GCPadStatus pad;
- Common::ParamPackage params;
- auto& queue = adapter->GetPadQueue();
- while (queue.Pop(pad)) {
- if (pad.button != GCAdapter::PadButton::Undefined) {
- params.Set("engine", "gcpad");
- params.Set("port", static_cast<s32>(pad.port));
- params.Set("button", static_cast<u16>(pad.button));
- return params;
- }
- if (pad.axis == GCAdapter::PadAxes::Undefined ||
- std::abs(static_cast<float>(pad.axis_value) / 128.0f) < 0.1f) {
- continue;
- }
- // An analog device needs two axes, so we need to store the axis for later and wait for
- // a second input event. The axes also must be from the same joystick.
- const u8 axis = static_cast<u8>(pad.axis);
- if (axis == 0 || axis == 1) {
- analog_x_axis = 0;
- analog_y_axis = 1;
- controller_number = static_cast<s32>(pad.port);
- break;
- }
- if (axis == 2 || axis == 3) {
- analog_x_axis = 2;
- analog_y_axis = 3;
- controller_number = static_cast<s32>(pad.port);
- break;
- }
-
- if (analog_x_axis == -1) {
- analog_x_axis = axis;
- controller_number = static_cast<s32>(pad.port);
- } else if (analog_y_axis == -1 && analog_x_axis != axis &&
- controller_number == static_cast<s32>(pad.port)) {
- analog_y_axis = axis;
- break;
- }
- }
- if (analog_x_axis != -1 && analog_y_axis != -1) {
- params.Set("engine", "gcpad");
- params.Set("port", controller_number);
- params.Set("axis_x", analog_x_axis);
- params.Set("axis_y", analog_y_axis);
- params.Set("invert_x", "+");
- params.Set("invert_y", "+");
- analog_x_axis = -1;
- analog_y_axis = -1;
- controller_number = -1;
- return params;
- }
- return params;
-}
-
-class GCVibration final : public Input::VibrationDevice {
-public:
- explicit GCVibration(u32 port_, GCAdapter::Adapter* adapter)
- : port(port_), gcadapter(adapter) {}
-
- u8 GetStatus() const override {
- return gcadapter->RumblePlay(port, 0);
- }
-
- bool SetRumblePlay(f32 amp_low, [[maybe_unused]] f32 freq_low, f32 amp_high,
- [[maybe_unused]] f32 freq_high) const override {
- const auto mean_amplitude = (amp_low + amp_high) * 0.5f;
- const auto processed_amplitude =
- static_cast<u8>((mean_amplitude + std::pow(mean_amplitude, 0.3f)) * 0.5f * 0x8);
-
- return gcadapter->RumblePlay(port, processed_amplitude);
- }
-
-private:
- const u32 port;
- GCAdapter::Adapter* gcadapter;
-};
-
-/// An vibration device factory that creates vibration devices from GC Adapter
-GCVibrationFactory::GCVibrationFactory(std::shared_ptr<GCAdapter::Adapter> adapter_)
- : adapter(std::move(adapter_)) {}
-
-/**
- * Creates a vibration device from a joystick
- * @param params contains parameters for creating the device:
- * - "port": the nth gcpad on the adapter
- */
-std::unique_ptr<Input::VibrationDevice> GCVibrationFactory::Create(
- const Common::ParamPackage& params) {
- const auto port = static_cast<u32>(params.Get("port", 0));
-
- return std::make_unique<GCVibration>(port, adapter.get());
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/gcadapter/gc_poller.h b/src/input_common/gcadapter/gc_poller.h
deleted file mode 100644
index d1271e3ea..000000000
--- a/src/input_common/gcadapter/gc_poller.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include "core/frontend/input.h"
-#include "input_common/gcadapter/gc_adapter.h"
-
-namespace InputCommon {
-
-/**
- * A button device factory representing a gcpad. It receives gcpad events and forward them
- * to all button devices it created.
- */
-class GCButtonFactory final : public Input::Factory<Input::ButtonDevice> {
-public:
- explicit GCButtonFactory(std::shared_ptr<GCAdapter::Adapter> adapter_);
-
- /**
- * Creates a button device from a button press
- * @param params contains parameters for creating the device:
- * - "code": the code of the key to bind with the button
- */
- std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput() const;
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<GCAdapter::Adapter> adapter;
- bool polling = false;
-};
-
-/// An analog device factory that creates analog devices from GC Adapter
-class GCAnalogFactory final : public Input::Factory<Input::AnalogDevice> {
-public:
- explicit GCAnalogFactory(std::shared_ptr<GCAdapter::Adapter> adapter_);
-
- std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override;
- Common::ParamPackage GetNextInput();
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<GCAdapter::Adapter> adapter;
- int analog_x_axis = -1;
- int analog_y_axis = -1;
- int controller_number = -1;
- bool polling = false;
-};
-
-/// A vibration device factory creates vibration devices from GC Adapter
-class GCVibrationFactory final : public Input::Factory<Input::VibrationDevice> {
-public:
- explicit GCVibrationFactory(std::shared_ptr<GCAdapter::Adapter> adapter_);
-
- std::unique_ptr<Input::VibrationDevice> Create(const Common::ParamPackage& params) override;
-
-private:
- std::shared_ptr<GCAdapter::Adapter> adapter;
-};
-
-} // namespace InputCommon
diff --git a/src/input_common/helpers/stick_from_buttons.cpp b/src/input_common/helpers/stick_from_buttons.cpp
new file mode 100644
index 000000000..e23394f5f
--- /dev/null
+++ b/src/input_common/helpers/stick_from_buttons.cpp
@@ -0,0 +1,317 @@
+// Copyright 2017 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <chrono>
+#include <cmath>
+#include "common/math_util.h"
+#include "common/settings.h"
+#include "input_common/helpers/stick_from_buttons.h"
+
+namespace InputCommon {
+
+class Stick final : public Common::Input::InputDevice {
+public:
+ using Button = std::unique_ptr<Common::Input::InputDevice>;
+
+ Stick(Button up_, Button down_, Button left_, Button right_, Button modifier_,
+ float modifier_scale_, float modifier_angle_)
+ : up(std::move(up_)), down(std::move(down_)), left(std::move(left_)),
+ right(std::move(right_)), modifier(std::move(modifier_)), modifier_scale(modifier_scale_),
+ modifier_angle(modifier_angle_) {
+ up->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateUpButtonStatus(callback_);
+ },
+ });
+ down->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateDownButtonStatus(callback_);
+ },
+ });
+ left->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateLeftButtonStatus(callback_);
+ },
+ });
+ right->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateRightButtonStatus(callback_);
+ },
+ });
+ modifier->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateModButtonStatus(callback_);
+ },
+ });
+ last_x_axis_value = 0.0f;
+ last_y_axis_value = 0.0f;
+ }
+
+ bool IsAngleGreater(float old_angle, float new_angle) const {
+ constexpr float TAU = Common::PI * 2.0f;
+ // Use wider angle to ease the transition.
+ constexpr float aperture = TAU * 0.15f;
+ const float top_limit = new_angle + aperture;
+ return (old_angle > new_angle && old_angle <= top_limit) ||
+ (old_angle + TAU > new_angle && old_angle + TAU <= top_limit);
+ }
+
+ bool IsAngleSmaller(float old_angle, float new_angle) const {
+ constexpr float TAU = Common::PI * 2.0f;
+ // Use wider angle to ease the transition.
+ constexpr float aperture = TAU * 0.15f;
+ const float bottom_limit = new_angle - aperture;
+ return (old_angle >= bottom_limit && old_angle < new_angle) ||
+ (old_angle - TAU >= bottom_limit && old_angle - TAU < new_angle);
+ }
+
+ float GetAngle(std::chrono::time_point<std::chrono::steady_clock> now) const {
+ constexpr float TAU = Common::PI * 2.0f;
+ float new_angle = angle;
+
+ auto time_difference = static_cast<float>(
+ std::chrono::duration_cast<std::chrono::microseconds>(now - last_update).count());
+ time_difference /= 1000.0f * 1000.0f;
+ if (time_difference > 0.5f) {
+ time_difference = 0.5f;
+ }
+
+ if (IsAngleGreater(new_angle, goal_angle)) {
+ new_angle -= modifier_angle * time_difference;
+ if (new_angle < 0) {
+ new_angle += TAU;
+ }
+ if (!IsAngleGreater(new_angle, goal_angle)) {
+ return goal_angle;
+ }
+ } else if (IsAngleSmaller(new_angle, goal_angle)) {
+ new_angle += modifier_angle * time_difference;
+ if (new_angle >= TAU) {
+ new_angle -= TAU;
+ }
+ if (!IsAngleSmaller(new_angle, goal_angle)) {
+ return goal_angle;
+ }
+ } else {
+ return goal_angle;
+ }
+ return new_angle;
+ }
+
+ void SetGoalAngle(bool r, bool l, bool u, bool d) {
+ // Move to the right
+ if (r && !u && !d) {
+ goal_angle = 0.0f;
+ }
+
+ // Move to the upper right
+ if (r && u && !d) {
+ goal_angle = Common::PI * 0.25f;
+ }
+
+ // Move up
+ if (u && !l && !r) {
+ goal_angle = Common::PI * 0.5f;
+ }
+
+ // Move to the upper left
+ if (l && u && !d) {
+ goal_angle = Common::PI * 0.75f;
+ }
+
+ // Move to the left
+ if (l && !u && !d) {
+ goal_angle = Common::PI;
+ }
+
+ // Move to the bottom left
+ if (l && !u && d) {
+ goal_angle = Common::PI * 1.25f;
+ }
+
+ // Move down
+ if (d && !l && !r) {
+ goal_angle = Common::PI * 1.5f;
+ }
+
+ // Move to the bottom right
+ if (r && !u && d) {
+ goal_angle = Common::PI * 1.75f;
+ }
+ }
+
+ void UpdateUpButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ up_status = button_callback.button_status.value;
+ UpdateStatus();
+ }
+
+ void UpdateDownButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ down_status = button_callback.button_status.value;
+ UpdateStatus();
+ }
+
+ void UpdateLeftButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ left_status = button_callback.button_status.value;
+ UpdateStatus();
+ }
+
+ void UpdateRightButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ right_status = button_callback.button_status.value;
+ UpdateStatus();
+ }
+
+ void UpdateModButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ modifier_status = button_callback.button_status.value;
+ UpdateStatus();
+ }
+
+ void UpdateStatus() {
+ const float coef = modifier_status ? modifier_scale : 1.0f;
+
+ bool r = right_status;
+ bool l = left_status;
+ bool u = up_status;
+ bool d = down_status;
+
+ // Eliminate contradictory movements
+ if (r && l) {
+ r = false;
+ l = false;
+ }
+ if (u && d) {
+ u = false;
+ d = false;
+ }
+
+ // Move if a key is pressed
+ if (r || l || u || d) {
+ amplitude = coef;
+ } else {
+ amplitude = 0;
+ }
+
+ const auto now = std::chrono::steady_clock::now();
+ const auto time_difference = static_cast<u64>(
+ std::chrono::duration_cast<std::chrono::milliseconds>(now - last_update).count());
+
+ if (time_difference < 10) {
+ // Disable analog mode if inputs are too fast
+ SetGoalAngle(r, l, u, d);
+ angle = goal_angle;
+ } else {
+ angle = GetAngle(now);
+ SetGoalAngle(r, l, u, d);
+ }
+
+ last_update = now;
+ Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Stick,
+ .stick_status = GetStatus(),
+ };
+ last_x_axis_value = status.stick_status.x.raw_value;
+ last_y_axis_value = status.stick_status.y.raw_value;
+ TriggerOnChange(status);
+ }
+
+ void ForceUpdate() override {
+ up->ForceUpdate();
+ down->ForceUpdate();
+ left->ForceUpdate();
+ right->ForceUpdate();
+ modifier->ForceUpdate();
+ }
+
+ void SoftUpdate() override {
+ Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Stick,
+ .stick_status = GetStatus(),
+ };
+ if (last_x_axis_value == status.stick_status.x.raw_value &&
+ last_y_axis_value == status.stick_status.y.raw_value) {
+ return;
+ }
+ last_x_axis_value = status.stick_status.x.raw_value;
+ last_y_axis_value = status.stick_status.y.raw_value;
+ TriggerOnChange(status);
+ }
+
+ Common::Input::StickStatus GetStatus() const {
+ Common::Input::StickStatus status{};
+ status.x.properties = properties;
+ status.y.properties = properties;
+ if (Settings::values.emulate_analog_keyboard) {
+ const auto now = std::chrono::steady_clock::now();
+ float angle_ = GetAngle(now);
+ status.x.raw_value = std::cos(angle_) * amplitude;
+ status.y.raw_value = std::sin(angle_) * amplitude;
+ return status;
+ }
+ constexpr float SQRT_HALF = 0.707106781f;
+ int x = 0, y = 0;
+ if (right_status) {
+ ++x;
+ }
+ if (left_status) {
+ --x;
+ }
+ if (up_status) {
+ ++y;
+ }
+ if (down_status) {
+ --y;
+ }
+ const float coef = modifier_status ? modifier_scale : 1.0f;
+ status.x.raw_value = static_cast<float>(x) * coef * (y == 0 ? 1.0f : SQRT_HALF);
+ status.y.raw_value = static_cast<float>(y) * coef * (x == 0 ? 1.0f : SQRT_HALF);
+ return status;
+ }
+
+private:
+ Button up;
+ Button down;
+ Button left;
+ Button right;
+ Button modifier;
+ float modifier_scale{};
+ float modifier_angle{};
+ float angle{};
+ float goal_angle{};
+ float amplitude{};
+ bool up_status{};
+ bool down_status{};
+ bool left_status{};
+ bool right_status{};
+ bool modifier_status{};
+ float last_x_axis_value{};
+ float last_y_axis_value{};
+ const Common::Input::AnalogProperties properties{0.0f, 1.0f, 0.5f, 0.0f, false};
+ std::chrono::time_point<std::chrono::steady_clock> last_update;
+};
+
+std::unique_ptr<Common::Input::InputDevice> StickFromButton::Create(
+ const Common::ParamPackage& params) {
+ const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
+ auto up = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("up", null_engine));
+ auto down = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("down", null_engine));
+ auto left = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("left", null_engine));
+ auto right = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("right", null_engine));
+ auto modifier = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("modifier", null_engine));
+ auto modifier_scale = params.Get("modifier_scale", 0.5f);
+ auto modifier_angle = params.Get("modifier_angle", 5.5f);
+ return std::make_unique<Stick>(std::move(up), std::move(down), std::move(left),
+ std::move(right), std::move(modifier), modifier_scale,
+ modifier_angle);
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/analog_from_button.h b/src/input_common/helpers/stick_from_buttons.h
index bbd583dd9..437ace4f7 100755..100644
--- a/src/input_common/analog_from_button.h
+++ b/src/input_common/helpers/stick_from_buttons.h
@@ -4,8 +4,7 @@
#pragma once
-#include <memory>
-#include "core/frontend/input.h"
+#include "common/input.h"
namespace InputCommon {
@@ -13,7 +12,7 @@ namespace InputCommon {
* An analog device factory that takes direction button devices and combines them into a analog
* device.
*/
-class AnalogFromButton final : public Input::Factory<Input::AnalogDevice> {
+class StickFromButton final : public Common::Input::Factory<Common::Input::InputDevice> {
public:
/**
* Creates an analog device from direction button devices
@@ -25,7 +24,7 @@ public:
* - "modifier": a serialized ParamPackage for creating a button device as the modifier
* - "modifier_scale": a float for the multiplier the modifier gives to the position
*/
- std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override;
+ std::unique_ptr<Common::Input::InputDevice> Create(const Common::ParamPackage& params) override;
};
} // namespace InputCommon
diff --git a/src/input_common/helpers/touch_from_buttons.cpp b/src/input_common/helpers/touch_from_buttons.cpp
new file mode 100644
index 000000000..ece1e3b32
--- /dev/null
+++ b/src/input_common/helpers/touch_from_buttons.cpp
@@ -0,0 +1,84 @@
+// Copyright 2020 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <algorithm>
+#include "common/settings.h"
+#include "core/frontend/framebuffer_layout.h"
+#include "input_common/helpers/touch_from_buttons.h"
+
+namespace InputCommon {
+
+class TouchFromButtonDevice final : public Common::Input::InputDevice {
+public:
+ using Button = std::unique_ptr<Common::Input::InputDevice>;
+ TouchFromButtonDevice(Button button_, int touch_id_, float x_, float y_)
+ : button(std::move(button_)), touch_id(touch_id_), x(x_), y(y_) {
+ last_button_value = false;
+ button->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback_) {
+ UpdateButtonStatus(callback_);
+ },
+ });
+ button->ForceUpdate();
+ }
+
+ void ForceUpdate() override {
+ button->ForceUpdate();
+ }
+
+ Common::Input::TouchStatus GetStatus(bool pressed) const {
+ const Common::Input::ButtonStatus button_status{
+ .value = pressed,
+ };
+ Common::Input::TouchStatus status{
+ .pressed = button_status,
+ .x = {},
+ .y = {},
+ .id = touch_id,
+ };
+ status.x.properties = properties;
+ status.y.properties = properties;
+
+ if (!pressed) {
+ return status;
+ }
+
+ status.x.raw_value = x;
+ status.y.raw_value = y;
+ return status;
+ }
+
+ void UpdateButtonStatus(const Common::Input::CallbackStatus& button_callback) {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Touch,
+ .touch_status = GetStatus(button_callback.button_status.value),
+ };
+ if (last_button_value != button_callback.button_status.value) {
+ last_button_value = button_callback.button_status.value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ Button button;
+ bool last_button_value;
+ const int touch_id;
+ const float x;
+ const float y;
+ const Common::Input::AnalogProperties properties{0.0f, 1.0f, 0.5f, 0.0f, false};
+};
+
+std::unique_ptr<Common::Input::InputDevice> TouchFromButton::Create(
+ const Common::ParamPackage& params) {
+ const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
+ auto button = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
+ params.Get("button", null_engine));
+ const auto touch_id = params.Get("touch_id", 0);
+ const float x = params.Get("x", 0.0f) / 1280.0f;
+ const float y = params.Get("y", 0.0f) / 720.0f;
+ return std::make_unique<TouchFromButtonDevice>(std::move(button), touch_id, x, y);
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/touch_from_button.h b/src/input_common/helpers/touch_from_buttons.h
index 8b4d1aa96..628f18215 100644
--- a/src/input_common/touch_from_button.h
+++ b/src/input_common/helpers/touch_from_buttons.h
@@ -4,20 +4,19 @@
#pragma once
-#include <memory>
-#include "core/frontend/input.h"
+#include "common/input.h"
namespace InputCommon {
/**
* A touch device factory that takes a list of button devices and combines them into a touch device.
*/
-class TouchFromButtonFactory final : public Input::Factory<Input::TouchDevice> {
+class TouchFromButton final : public Common::Input::Factory<Common::Input::InputDevice> {
public:
/**
* Creates a touch device from a list of button devices
*/
- std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage& params) override;
+ std::unique_ptr<Common::Input::InputDevice> Create(const Common::ParamPackage& params) override;
};
} // namespace InputCommon
diff --git a/src/input_common/udp/protocol.cpp b/src/input_common/helpers/udp_protocol.cpp
index 5e50bd612..cdeab7e11 100644
--- a/src/input_common/udp/protocol.cpp
+++ b/src/input_common/helpers/udp_protocol.cpp
@@ -5,7 +5,7 @@
#include <cstddef>
#include <cstring>
#include "common/logging/log.h"
-#include "input_common/udp/protocol.h"
+#include "input_common/helpers/udp_protocol.h"
namespace InputCommon::CemuhookUDP {
diff --git a/src/input_common/udp/protocol.h b/src/input_common/helpers/udp_protocol.h
index 1bdc9209e..bcba12c58 100644
--- a/src/input_common/udp/protocol.h
+++ b/src/input_common/helpers/udp_protocol.h
@@ -56,6 +56,12 @@ constexpr Type GetMessageType();
namespace Request {
+enum RegisterFlags : u8 {
+ AllPads,
+ PadID,
+ PadMACAdddress,
+};
+
struct Version {};
/**
* Requests the server to send information about what controllers are plugged into the ports
@@ -77,13 +83,8 @@ static_assert(std::is_trivially_copyable_v<PortInfo>,
* timeout seems to be 5 seconds.
*/
struct PadData {
- enum class Flags : u8 {
- AllPorts,
- Id,
- Mac,
- };
/// Determines which method will be used as a look up for the controller
- Flags flags{};
+ RegisterFlags flags{};
/// Index of the port of the controller to retrieve data about
u8 port_id{};
/// Mac address of the controller to retrieve data about
@@ -113,6 +114,36 @@ Message<T> Create(const T data, const u32 client_id = 0) {
namespace Response {
+enum class ConnectionType : u8 {
+ None,
+ Usb,
+ Bluetooth,
+};
+
+enum class State : u8 {
+ Disconnected,
+ Reserved,
+ Connected,
+};
+
+enum class Model : u8 {
+ None,
+ PartialGyro,
+ FullGyro,
+ Generic,
+};
+
+enum class Battery : u8 {
+ None = 0x00,
+ Dying = 0x01,
+ Low = 0x02,
+ Medium = 0x03,
+ High = 0x04,
+ Full = 0x05,
+ Charging = 0xEE,
+ Charged = 0xEF,
+};
+
struct Version {
u16_le version{};
};
@@ -122,11 +153,11 @@ static_assert(std::is_trivially_copyable_v<Version>,
struct PortInfo {
u8 id{};
- u8 state{};
- u8 model{};
- u8 connection_type{};
+ State state{};
+ Model model{};
+ ConnectionType connection_type{};
MacAddress mac;
- u8 battery{};
+ Battery battery{};
u8 is_pad_active{};
};
static_assert(sizeof(PortInfo) == 12, "UDP Response PortInfo struct has wrong size");
@@ -177,18 +208,18 @@ struct PadData {
u8 right_stick_y{};
struct AnalogButton {
- u8 button_8{};
- u8 button_7{};
- u8 button_6{};
- u8 button_5{};
- u8 button_12{};
- u8 button_11{};
- u8 button_10{};
- u8 button_9{};
- u8 button_16{};
- u8 button_15{};
- u8 button_14{};
- u8 button_13{};
+ u8 button_dpad_left_analog{};
+ u8 button_dpad_down_analog{};
+ u8 button_dpad_right_analog{};
+ u8 button_dpad_up_analog{};
+ u8 button_square_analog{};
+ u8 button_cross_analog{};
+ u8 button_circle_analog{};
+ u8 button_triangle_analog{};
+ u8 button_r1_analog{};
+ u8 button_l1_analog{};
+ u8 trigger_r2{};
+ u8 trigger_l2{};
} analog_button;
std::array<TouchPad, 2> touch;
diff --git a/src/input_common/input_engine.cpp b/src/input_common/input_engine.cpp
new file mode 100644
index 000000000..9c17ca4f7
--- /dev/null
+++ b/src/input_common/input_engine.cpp
@@ -0,0 +1,362 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/logging/log.h"
+#include "common/param_package.h"
+#include "input_common/input_engine.h"
+
+namespace InputCommon {
+
+void InputEngine::PreSetController(const PadIdentifier& identifier) {
+ std::lock_guard lock{mutex};
+ controller_list.try_emplace(identifier);
+}
+
+void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ controller.buttons.try_emplace(button, false);
+}
+
+void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ controller.hat_buttons.try_emplace(button, u8{0});
+}
+
+void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ controller.axes.try_emplace(axis, 0.0f);
+}
+
+void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ controller.motions.try_emplace(motion);
+}
+
+void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) {
+ {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ if (!configuring) {
+ controller.buttons.insert_or_assign(button, value);
+ }
+ }
+ TriggerOnButtonChange(identifier, button, value);
+}
+
+void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 value) {
+ {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ if (!configuring) {
+ controller.hat_buttons.insert_or_assign(button, value);
+ }
+ }
+ TriggerOnHatButtonChange(identifier, button, value);
+}
+
+void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) {
+ {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ if (!configuring) {
+ controller.axes.insert_or_assign(axis, value);
+ }
+ }
+ TriggerOnAxisChange(identifier, axis, value);
+}
+
+void InputEngine::SetBattery(const PadIdentifier& identifier, BatteryLevel value) {
+ {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ if (!configuring) {
+ controller.battery = value;
+ }
+ }
+ TriggerOnBatteryChange(identifier, value);
+}
+
+void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) {
+ {
+ std::lock_guard lock{mutex};
+ ControllerData& controller = controller_list.at(identifier);
+ if (!configuring) {
+ controller.motions.insert_or_assign(motion, value);
+ }
+ }
+ TriggerOnMotionChange(identifier, motion, value);
+}
+
+bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const {
+ std::lock_guard lock{mutex};
+ const auto controller_iter = controller_list.find(identifier);
+ if (controller_iter == controller_list.cend()) {
+ LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
+ identifier.pad, identifier.port);
+ return false;
+ }
+ const ControllerData& controller = controller_iter->second;
+ const auto button_iter = controller.buttons.find(button);
+ if (button_iter == controller.buttons.cend()) {
+ LOG_ERROR(Input, "Invalid button {}", button);
+ return false;
+ }
+ return button_iter->second;
+}
+
+bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const {
+ std::lock_guard lock{mutex};
+ const auto controller_iter = controller_list.find(identifier);
+ if (controller_iter == controller_list.cend()) {
+ LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
+ identifier.pad, identifier.port);
+ return false;
+ }
+ const ControllerData& controller = controller_iter->second;
+ const auto hat_iter = controller.hat_buttons.find(button);
+ if (hat_iter == controller.hat_buttons.cend()) {
+ LOG_ERROR(Input, "Invalid hat button {}", button);
+ return false;
+ }
+ return (hat_iter->second & direction) != 0;
+}
+
+f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const {
+ std::lock_guard lock{mutex};
+ const auto controller_iter = controller_list.find(identifier);
+ if (controller_iter == controller_list.cend()) {
+ LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
+ identifier.pad, identifier.port);
+ return 0.0f;
+ }
+ const ControllerData& controller = controller_iter->second;
+ const auto axis_iter = controller.axes.find(axis);
+ if (axis_iter == controller.axes.cend()) {
+ LOG_ERROR(Input, "Invalid axis {}", axis);
+ return 0.0f;
+ }
+ return axis_iter->second;
+}
+
+BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const {
+ std::lock_guard lock{mutex};
+ const auto controller_iter = controller_list.find(identifier);
+ if (controller_iter == controller_list.cend()) {
+ LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
+ identifier.pad, identifier.port);
+ return BatteryLevel::Charging;
+ }
+ const ControllerData& controller = controller_iter->second;
+ return controller.battery;
+}
+
+BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const {
+ std::lock_guard lock{mutex};
+ const auto controller_iter = controller_list.find(identifier);
+ if (controller_iter == controller_list.cend()) {
+ LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(),
+ identifier.pad, identifier.port);
+ return {};
+ }
+ const ControllerData& controller = controller_iter->second;
+ return controller.motions.at(motion);
+}
+
+void InputEngine::ResetButtonState() {
+ for (const auto& controller : controller_list) {
+ for (const auto& button : controller.second.buttons) {
+ SetButton(controller.first, button.first, false);
+ }
+ for (const auto& button : controller.second.hat_buttons) {
+ SetHatButton(controller.first, button.first, false);
+ }
+ }
+}
+
+void InputEngine::ResetAnalogState() {
+ for (const auto& controller : controller_list) {
+ for (const auto& axis : controller.second.axes) {
+ SetAxis(controller.first, axis.first, 0.0);
+ }
+ }
+}
+
+void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) {
+ std::lock_guard lock{mutex_callback};
+ for (const auto& poller_pair : callback_list) {
+ const InputIdentifier& poller = poller_pair.second;
+ if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) {
+ continue;
+ }
+ if (poller.callback.on_change) {
+ poller.callback.on_change();
+ }
+ }
+ if (!configuring || !mapping_callback.on_data) {
+ return;
+ }
+
+ PreSetButton(identifier, button);
+ if (value == GetButton(identifier, button)) {
+ return;
+ }
+ mapping_callback.on_data(MappingData{
+ .engine = GetEngineName(),
+ .pad = identifier,
+ .type = EngineInputType::Button,
+ .index = button,
+ .button_value = value,
+ });
+}
+
+void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) {
+ std::lock_guard lock{mutex_callback};
+ for (const auto& poller_pair : callback_list) {
+ const InputIdentifier& poller = poller_pair.second;
+ if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) {
+ continue;
+ }
+ if (poller.callback.on_change) {
+ poller.callback.on_change();
+ }
+ }
+ if (!configuring || !mapping_callback.on_data) {
+ return;
+ }
+ for (std::size_t index = 1; index < 0xff; index <<= 1) {
+ bool button_value = (value & index) != 0;
+ if (button_value == GetHatButton(identifier, button, static_cast<u8>(index))) {
+ continue;
+ }
+ mapping_callback.on_data(MappingData{
+ .engine = GetEngineName(),
+ .pad = identifier,
+ .type = EngineInputType::HatButton,
+ .index = button,
+ .hat_name = GetHatButtonName(static_cast<u8>(index)),
+ });
+ }
+}
+
+void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) {
+ std::lock_guard lock{mutex_callback};
+ for (const auto& poller_pair : callback_list) {
+ const InputIdentifier& poller = poller_pair.second;
+ if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) {
+ continue;
+ }
+ if (poller.callback.on_change) {
+ poller.callback.on_change();
+ }
+ }
+ if (!configuring || !mapping_callback.on_data) {
+ return;
+ }
+ if (std::abs(value - GetAxis(identifier, axis)) < 0.5f) {
+ return;
+ }
+ mapping_callback.on_data(MappingData{
+ .engine = GetEngineName(),
+ .pad = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis,
+ .axis_value = value,
+ });
+}
+
+void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier,
+ [[maybe_unused]] BatteryLevel value) {
+ std::lock_guard lock{mutex_callback};
+ for (const auto& poller_pair : callback_list) {
+ const InputIdentifier& poller = poller_pair.second;
+ if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) {
+ continue;
+ }
+ if (poller.callback.on_change) {
+ poller.callback.on_change();
+ }
+ }
+}
+
+void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion,
+ const BasicMotion& value) {
+ std::lock_guard lock{mutex_callback};
+ for (const auto& poller_pair : callback_list) {
+ const InputIdentifier& poller = poller_pair.second;
+ if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) {
+ continue;
+ }
+ if (poller.callback.on_change) {
+ poller.callback.on_change();
+ }
+ }
+ if (!configuring || !mapping_callback.on_data) {
+ return;
+ }
+ if (std::abs(value.gyro_x) < 0.6f && std::abs(value.gyro_y) < 0.6f &&
+ std::abs(value.gyro_z) < 0.6f) {
+ return;
+ }
+ mapping_callback.on_data(MappingData{
+ .engine = GetEngineName(),
+ .pad = identifier,
+ .type = EngineInputType::Motion,
+ .index = motion,
+ .motion_value = value,
+ });
+}
+
+bool InputEngine::IsInputIdentifierEqual(const InputIdentifier& input_identifier,
+ const PadIdentifier& identifier, EngineInputType type,
+ int index) const {
+ if (input_identifier.type != type) {
+ return false;
+ }
+ if (input_identifier.index != index) {
+ return false;
+ }
+ if (input_identifier.identifier != identifier) {
+ return false;
+ }
+ return true;
+}
+
+void InputEngine::BeginConfiguration() {
+ configuring = true;
+}
+
+void InputEngine::EndConfiguration() {
+ configuring = false;
+}
+
+const std::string& InputEngine::GetEngineName() const {
+ return input_engine;
+}
+
+int InputEngine::SetCallback(InputIdentifier input_identifier) {
+ std::lock_guard lock{mutex_callback};
+ callback_list.insert_or_assign(last_callback_key, std::move(input_identifier));
+ return last_callback_key++;
+}
+
+void InputEngine::SetMappingCallback(MappingCallback callback) {
+ std::lock_guard lock{mutex_callback};
+ mapping_callback = std::move(callback);
+}
+
+void InputEngine::DeleteCallback(int key) {
+ std::lock_guard lock{mutex_callback};
+ const auto& iterator = callback_list.find(key);
+ if (iterator == callback_list.end()) {
+ LOG_ERROR(Input, "Tried to delete non-existent callback {}", key);
+ return;
+ }
+ callback_list.erase(iterator);
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/input_engine.h b/src/input_common/input_engine.h
new file mode 100644
index 000000000..390581c94
--- /dev/null
+++ b/src/input_common/input_engine.h
@@ -0,0 +1,229 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include <functional>
+#include <mutex>
+#include <unordered_map>
+
+#include "common/common_types.h"
+#include "common/input.h"
+#include "common/param_package.h"
+#include "common/uuid.h"
+#include "input_common/main.h"
+
+// Pad Identifier of data source
+struct PadIdentifier {
+ Common::UUID guid{};
+ std::size_t port{};
+ std::size_t pad{};
+
+ friend constexpr bool operator==(const PadIdentifier&, const PadIdentifier&) = default;
+};
+
+// Basic motion data containing data from the sensors and a timestamp in microseconds
+struct BasicMotion {
+ float gyro_x{};
+ float gyro_y{};
+ float gyro_z{};
+ float accel_x{};
+ float accel_y{};
+ float accel_z{};
+ u64 delta_timestamp{};
+};
+
+// Stages of a battery charge
+enum class BatteryLevel {
+ Empty,
+ Critical,
+ Low,
+ Medium,
+ Full,
+ Charging,
+};
+
+// Types of input that are stored in the engine
+enum class EngineInputType {
+ None,
+ Button,
+ HatButton,
+ Analog,
+ Motion,
+ Battery,
+};
+
+namespace std {
+// Hash used to create lists from PadIdentifier data
+template <>
+struct hash<PadIdentifier> {
+ size_t operator()(const PadIdentifier& pad_id) const noexcept {
+ u64 hash_value = pad_id.guid.uuid[1] ^ pad_id.guid.uuid[0];
+ hash_value ^= (static_cast<u64>(pad_id.port) << 32);
+ hash_value ^= static_cast<u64>(pad_id.pad);
+ return static_cast<size_t>(hash_value);
+ }
+};
+
+} // namespace std
+
+namespace InputCommon {
+
+// Data from the engine and device needed for creating a ParamPackage
+struct MappingData {
+ std::string engine{};
+ PadIdentifier pad{};
+ EngineInputType type{};
+ int index{};
+ bool button_value{};
+ std::string hat_name{};
+ f32 axis_value{};
+ BasicMotion motion_value{};
+};
+
+// Triggered if data changed on the controller
+struct UpdateCallback {
+ std::function<void()> on_change;
+};
+
+// Triggered if data changed on the controller and the engine is on configuring mode
+struct MappingCallback {
+ std::function<void(MappingData)> on_data;
+};
+
+// Input Identifier of data source
+struct InputIdentifier {
+ PadIdentifier identifier;
+ EngineInputType type;
+ int index;
+ UpdateCallback callback;
+};
+
+class InputEngine {
+public:
+ explicit InputEngine(std::string input_engine_) : input_engine{std::move(input_engine_)} {}
+
+ virtual ~InputEngine() = default;
+
+ // Enable configuring mode for mapping
+ void BeginConfiguration();
+
+ // Disable configuring mode for mapping
+ void EndConfiguration();
+
+ // Sets a led pattern for a controller
+ virtual void SetLeds([[maybe_unused]] const PadIdentifier& identifier,
+ [[maybe_unused]] const Common::Input::LedStatus& led_status) {}
+
+ // Sets rumble to a controller
+ virtual Common::Input::VibrationError SetRumble(
+ [[maybe_unused]] const PadIdentifier& identifier,
+ [[maybe_unused]] const Common::Input::VibrationStatus& vibration) {
+ return Common::Input::VibrationError::NotSupported;
+ }
+
+ // Sets polling mode to a controller
+ virtual Common::Input::PollingError SetPollingMode(
+ [[maybe_unused]] const PadIdentifier& identifier,
+ [[maybe_unused]] const Common::Input::PollingMode vibration) {
+ return Common::Input::PollingError::NotSupported;
+ }
+
+ // Returns the engine name
+ [[nodiscard]] const std::string& GetEngineName() const;
+
+ /// Used for automapping features
+ virtual std::vector<Common::ParamPackage> GetInputDevices() const {
+ return {};
+ }
+
+ /// Retrieves the button mappings for the given device
+ virtual ButtonMapping GetButtonMappingForDevice(
+ [[maybe_unused]] const Common::ParamPackage& params) {
+ return {};
+ }
+
+ /// Retrieves the analog mappings for the given device
+ virtual AnalogMapping GetAnalogMappingForDevice(
+ [[maybe_unused]] const Common::ParamPackage& params) {
+ return {};
+ }
+
+ /// Retrieves the motion mappings for the given device
+ virtual MotionMapping GetMotionMappingForDevice(
+ [[maybe_unused]] const Common::ParamPackage& params) {
+ return {};
+ }
+
+ /// Retrieves the name of the given input.
+ virtual Common::Input::ButtonNames GetUIName(
+ [[maybe_unused]] const Common::ParamPackage& params) const {
+ return Common::Input::ButtonNames::Engine;
+ }
+
+ /// Retrieves the index number of the given hat button direction
+ virtual u8 GetHatButtonId([[maybe_unused]] const std::string& direction_name) const {
+ return 0;
+ }
+
+ void PreSetController(const PadIdentifier& identifier);
+ void PreSetButton(const PadIdentifier& identifier, int button);
+ void PreSetHatButton(const PadIdentifier& identifier, int button);
+ void PreSetAxis(const PadIdentifier& identifier, int axis);
+ void PreSetMotion(const PadIdentifier& identifier, int motion);
+ void ResetButtonState();
+ void ResetAnalogState();
+
+ bool GetButton(const PadIdentifier& identifier, int button) const;
+ bool GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const;
+ f32 GetAxis(const PadIdentifier& identifier, int axis) const;
+ BatteryLevel GetBattery(const PadIdentifier& identifier) const;
+ BasicMotion GetMotion(const PadIdentifier& identifier, int motion) const;
+
+ int SetCallback(InputIdentifier input_identifier);
+ void SetMappingCallback(MappingCallback callback);
+ void DeleteCallback(int key);
+
+protected:
+ void SetButton(const PadIdentifier& identifier, int button, bool value);
+ void SetHatButton(const PadIdentifier& identifier, int button, u8 value);
+ void SetAxis(const PadIdentifier& identifier, int axis, f32 value);
+ void SetBattery(const PadIdentifier& identifier, BatteryLevel value);
+ void SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value);
+
+ virtual std::string GetHatButtonName([[maybe_unused]] u8 direction_value) const {
+ return "Unknown";
+ }
+
+private:
+ struct ControllerData {
+ std::unordered_map<int, bool> buttons;
+ std::unordered_map<int, u8> hat_buttons;
+ std::unordered_map<int, float> axes;
+ std::unordered_map<int, BasicMotion> motions;
+ BatteryLevel battery{};
+ };
+
+ void TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value);
+ void TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value);
+ void TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value);
+ void TriggerOnBatteryChange(const PadIdentifier& identifier, BatteryLevel value);
+ void TriggerOnMotionChange(const PadIdentifier& identifier, int motion,
+ const BasicMotion& value);
+
+ bool IsInputIdentifierEqual(const InputIdentifier& input_identifier,
+ const PadIdentifier& identifier, EngineInputType type,
+ int index) const;
+
+ mutable std::mutex mutex;
+ mutable std::mutex mutex_callback;
+ bool configuring{false};
+ const std::string input_engine;
+ int last_callback_key = 0;
+ std::unordered_map<PadIdentifier, ControllerData> controller_list;
+ std::unordered_map<int, InputIdentifier> callback_list;
+ MappingCallback mapping_callback;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/input_mapping.cpp b/src/input_common/input_mapping.cpp
new file mode 100644
index 000000000..6e0024b2d
--- /dev/null
+++ b/src/input_common/input_mapping.cpp
@@ -0,0 +1,207 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/common_types.h"
+#include "common/settings.h"
+#include "input_common/input_engine.h"
+#include "input_common/input_mapping.h"
+
+namespace InputCommon {
+
+MappingFactory::MappingFactory() {}
+
+void MappingFactory::BeginMapping(Polling::InputType type) {
+ is_enabled = true;
+ input_type = type;
+ input_queue.Clear();
+ first_axis = -1;
+ second_axis = -1;
+}
+
+[[nodiscard]] const Common::ParamPackage MappingFactory::GetNextInput() {
+ Common::ParamPackage input;
+ input_queue.Pop(input);
+ return input;
+}
+
+void MappingFactory::RegisterInput(const MappingData& data) {
+ if (!is_enabled) {
+ return;
+ }
+ if (!IsDriverValid(data)) {
+ return;
+ }
+
+ switch (input_type) {
+ case Polling::InputType::Button:
+ RegisterButton(data);
+ return;
+ case Polling::InputType::Stick:
+ RegisterStick(data);
+ return;
+ case Polling::InputType::Motion:
+ RegisterMotion(data);
+ return;
+ default:
+ return;
+ }
+}
+
+void MappingFactory::StopMapping() {
+ is_enabled = false;
+ input_type = Polling::InputType::None;
+ input_queue.Clear();
+}
+
+void MappingFactory::RegisterButton(const MappingData& data) {
+ Common::ParamPackage new_input;
+ new_input.Set("engine", data.engine);
+ if (data.pad.guid != Common::UUID{}) {
+ new_input.Set("guid", data.pad.guid.Format());
+ }
+ new_input.Set("port", static_cast<int>(data.pad.port));
+ new_input.Set("pad", static_cast<int>(data.pad.pad));
+
+ switch (data.type) {
+ case EngineInputType::Button:
+ // Workaround for old compatibility
+ if (data.engine == "keyboard") {
+ new_input.Set("code", data.index);
+ break;
+ }
+ new_input.Set("button", data.index);
+ break;
+ case EngineInputType::HatButton:
+ new_input.Set("hat", data.index);
+ new_input.Set("direction", data.hat_name);
+ break;
+ case EngineInputType::Analog:
+ // Ignore mouse axis when mapping buttons
+ if (data.engine == "mouse") {
+ return;
+ }
+ new_input.Set("axis", data.index);
+ new_input.Set("threshold", 0.5f);
+ break;
+ default:
+ return;
+ }
+ input_queue.Push(new_input);
+}
+
+void MappingFactory::RegisterStick(const MappingData& data) {
+ Common::ParamPackage new_input;
+ new_input.Set("engine", data.engine);
+ if (data.pad.guid != Common::UUID{}) {
+ new_input.Set("guid", data.pad.guid.Format());
+ }
+ new_input.Set("port", static_cast<int>(data.pad.port));
+ new_input.Set("pad", static_cast<int>(data.pad.pad));
+
+ // If engine is mouse map the mouse position as a joystick
+ if (data.engine == "mouse") {
+ new_input.Set("axis_x", 0);
+ new_input.Set("axis_y", 1);
+ new_input.Set("threshold", 0.5f);
+ new_input.Set("range", 1.0f);
+ new_input.Set("deadzone", 0.0f);
+ input_queue.Push(new_input);
+ return;
+ }
+
+ switch (data.type) {
+ case EngineInputType::Button:
+ case EngineInputType::HatButton:
+ RegisterButton(data);
+ return;
+ case EngineInputType::Analog:
+ if (first_axis == data.index) {
+ return;
+ }
+ if (first_axis == -1) {
+ first_axis = data.index;
+ return;
+ }
+ new_input.Set("axis_x", first_axis);
+ new_input.Set("axis_y", data.index);
+ new_input.Set("threshold", 0.5f);
+ new_input.Set("range", 0.95f);
+ new_input.Set("deadzone", 0.15f);
+ break;
+ default:
+ return;
+ }
+ input_queue.Push(new_input);
+}
+
+void MappingFactory::RegisterMotion(const MappingData& data) {
+ Common::ParamPackage new_input;
+ new_input.Set("engine", data.engine);
+ if (data.pad.guid != Common::UUID{}) {
+ new_input.Set("guid", data.pad.guid.Format());
+ }
+ new_input.Set("port", static_cast<int>(data.pad.port));
+ new_input.Set("pad", static_cast<int>(data.pad.pad));
+ switch (data.type) {
+ case EngineInputType::Button:
+ case EngineInputType::HatButton:
+ RegisterButton(data);
+ return;
+ case EngineInputType::Analog:
+ if (first_axis == data.index) {
+ return;
+ }
+ if (second_axis == data.index) {
+ return;
+ }
+ if (first_axis == -1) {
+ first_axis = data.index;
+ return;
+ }
+ if (second_axis == -1) {
+ second_axis = data.index;
+ return;
+ }
+ new_input.Set("axis_x", first_axis);
+ new_input.Set("axis_y", second_axis);
+ new_input.Set("axis_z", data.index);
+ new_input.Set("range", 1.0f);
+ new_input.Set("deadzone", 0.20f);
+ break;
+ case EngineInputType::Motion:
+ new_input.Set("motion", data.index);
+ break;
+ default:
+ return;
+ }
+ input_queue.Push(new_input);
+}
+
+bool MappingFactory::IsDriverValid(const MappingData& data) const {
+ // Only port 0 can be mapped on the keyboard
+ if (data.engine == "keyboard" && data.pad.port != 0) {
+ return false;
+ }
+ // To prevent mapping with two devices we disable any UDP except motion
+ if (!Settings::values.enable_udp_controller && data.engine == "cemuhookudp" &&
+ data.type != EngineInputType::Motion) {
+ return false;
+ }
+ // The following drivers don't need to be mapped
+ if (data.engine == "tas") {
+ return false;
+ }
+ if (data.engine == "touch") {
+ return false;
+ }
+ if (data.engine == "touch_from_button") {
+ return false;
+ }
+ if (data.engine == "analog_from_button") {
+ return false;
+ }
+ return true;
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/input_mapping.h b/src/input_common/input_mapping.h
new file mode 100644
index 000000000..93564b5f8
--- /dev/null
+++ b/src/input_common/input_mapping.h
@@ -0,0 +1,83 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+#include "common/threadsafe_queue.h"
+
+namespace InputCommon {
+class InputEngine;
+struct MappingData;
+
+class MappingFactory {
+public:
+ MappingFactory();
+
+ /**
+ * Resets all variables to begin the mapping process
+ * @param type type of input desired to be returned
+ */
+ void BeginMapping(Polling::InputType type);
+
+ /// Returns an input event with mapping information from the input_queue
+ [[nodiscard]] const Common::ParamPackage GetNextInput();
+
+ /**
+ * Registers mapping input data from the driver
+ * @param data A struct containing all the information needed to create a proper
+ * ParamPackage
+ */
+ void RegisterInput(const MappingData& data);
+
+ /// Stop polling from all backends
+ void StopMapping();
+
+private:
+ /**
+ * If provided data satisfies the requirements it will push an element to the input_queue
+ * Supported input:
+ * - Button: Creates a basic button ParamPackage
+ * - HatButton: Creates a basic hat button ParamPackage
+ * - Analog: Creates a basic analog ParamPackage
+ * @param data A struct containing all the information needed to create a proper
+ * ParamPackage
+ */
+ void RegisterButton(const MappingData& data);
+
+ /**
+ * If provided data satisfies the requirements it will push an element to the input_queue
+ * Supported input:
+ * - Button, HatButton: Pass the data to RegisterButton
+ * - Analog: Stores the first axis and on the second axis creates a basic stick ParamPackage
+ * @param data A struct containing all the information needed to create a proper
+ * ParamPackage
+ */
+ void RegisterStick(const MappingData& data);
+
+ /**
+ * If provided data satisfies the requirements it will push an element to the input_queue
+ * Supported input:
+ * - Button, HatButton: Pass the data to RegisterButton
+ * - Analog: Stores the first two axis and on the third axis creates a basic Motion
+ * ParamPackage
+ * - Motion: Creates a basic Motion ParamPackage
+ * @param data A struct containing all the information needed to create a proper
+ * ParamPackage
+ */
+ void RegisterMotion(const MappingData& data);
+
+ /**
+ * Returns true if driver can be mapped
+ * @param data A struct containing all the information needed to create a proper
+ * ParamPackage
+ */
+ bool IsDriverValid(const MappingData& data) const;
+
+ Common::SPSCQueue<Common::ParamPackage> input_queue;
+ Polling::InputType input_type{Polling::InputType::None};
+ bool is_enabled{};
+ int first_axis = -1;
+ int second_axis = -1;
+};
+
+} // namespace InputCommon
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp
new file mode 100644
index 000000000..7b370335f
--- /dev/null
+++ b/src/input_common/input_poller.cpp
@@ -0,0 +1,970 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/common_types.h"
+#include "common/input.h"
+
+#include "input_common/input_engine.h"
+#include "input_common/input_poller.h"
+
+namespace InputCommon {
+
+class DummyInput final : public Common::Input::InputDevice {
+public:
+ explicit DummyInput() = default;
+};
+
+class InputFromButton final : public Common::Input::InputDevice {
+public:
+ explicit InputFromButton(PadIdentifier identifier_, int button_, bool toggle_, bool inverted_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), button(button_), toggle(toggle_), inverted(inverted_),
+ input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Button,
+ .index = button,
+ .callback = engine_callback,
+ };
+ last_button_value = false;
+ callback_key = input_engine->SetCallback(input_identifier);
+ }
+
+ ~InputFromButton() override {
+ input_engine->DeleteCallback(callback_key);
+ }
+
+ Common::Input::ButtonStatus GetStatus() const {
+ return {
+ .value = input_engine->GetButton(identifier, button),
+ .inverted = inverted,
+ .toggle = toggle,
+ };
+ }
+
+ void ForceUpdate() override {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Button,
+ .button_status = GetStatus(),
+ };
+
+ last_button_value = status.button_status.value;
+ TriggerOnChange(status);
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Button,
+ .button_status = GetStatus(),
+ };
+
+ if (status.button_status.value != last_button_value) {
+ last_button_value = status.button_status.value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int button;
+ const bool toggle;
+ const bool inverted;
+ int callback_key;
+ bool last_button_value;
+ InputEngine* input_engine;
+};
+
+class InputFromHatButton final : public Common::Input::InputDevice {
+public:
+ explicit InputFromHatButton(PadIdentifier identifier_, int button_, u8 direction_, bool toggle_,
+ bool inverted_, InputEngine* input_engine_)
+ : identifier(identifier_), button(button_), direction(direction_), toggle(toggle_),
+ inverted(inverted_), input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::HatButton,
+ .index = button,
+ .callback = engine_callback,
+ };
+ last_button_value = false;
+ callback_key = input_engine->SetCallback(input_identifier);
+ }
+
+ ~InputFromHatButton() override {
+ input_engine->DeleteCallback(callback_key);
+ }
+
+ Common::Input::ButtonStatus GetStatus() const {
+ return {
+ .value = input_engine->GetHatButton(identifier, button, direction),
+ .inverted = inverted,
+ .toggle = toggle,
+ };
+ }
+
+ void ForceUpdate() override {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Button,
+ .button_status = GetStatus(),
+ };
+
+ last_button_value = status.button_status.value;
+ TriggerOnChange(status);
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Button,
+ .button_status = GetStatus(),
+ };
+
+ if (status.button_status.value != last_button_value) {
+ last_button_value = status.button_status.value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int button;
+ const u8 direction;
+ const bool toggle;
+ const bool inverted;
+ int callback_key;
+ bool last_button_value;
+ InputEngine* input_engine;
+};
+
+class InputFromStick final : public Common::Input::InputDevice {
+public:
+ explicit InputFromStick(PadIdentifier identifier_, int axis_x_, int axis_y_,
+ Common::Input::AnalogProperties properties_x_,
+ Common::Input::AnalogProperties properties_y_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), axis_x(axis_x_), axis_y(axis_y_), properties_x(properties_x_),
+ properties_y(properties_y_),
+ input_engine(input_engine_), invert_axis_y{input_engine_->GetEngineName() == "sdl"} {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier x_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_x,
+ .callback = engine_callback,
+ };
+ const InputIdentifier y_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_y,
+ .callback = engine_callback,
+ };
+ last_axis_x_value = 0.0f;
+ last_axis_y_value = 0.0f;
+ callback_key_x = input_engine->SetCallback(x_input_identifier);
+ callback_key_y = input_engine->SetCallback(y_input_identifier);
+ }
+
+ ~InputFromStick() override {
+ input_engine->DeleteCallback(callback_key_x);
+ input_engine->DeleteCallback(callback_key_y);
+ }
+
+ Common::Input::StickStatus GetStatus() const {
+ Common::Input::StickStatus status;
+ status.x = {
+ .raw_value = input_engine->GetAxis(identifier, axis_x),
+ .properties = properties_x,
+ };
+ status.y = {
+ .raw_value = input_engine->GetAxis(identifier, axis_y),
+ .properties = properties_y,
+ };
+ // This is a workaround too keep compatibility with old yuzu versions. Vertical axis is
+ // inverted on SDL compared to Nintendo
+ if (invert_axis_y) {
+ status.y.raw_value = -status.y.raw_value;
+ }
+ return status;
+ }
+
+ void ForceUpdate() override {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Stick,
+ .stick_status = GetStatus(),
+ };
+
+ last_axis_x_value = status.stick_status.x.raw_value;
+ last_axis_y_value = status.stick_status.y.raw_value;
+ TriggerOnChange(status);
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Stick,
+ .stick_status = GetStatus(),
+ };
+
+ if (status.stick_status.x.raw_value != last_axis_x_value ||
+ status.stick_status.y.raw_value != last_axis_y_value) {
+ last_axis_x_value = status.stick_status.x.raw_value;
+ last_axis_y_value = status.stick_status.y.raw_value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int axis_x;
+ const int axis_y;
+ const Common::Input::AnalogProperties properties_x;
+ const Common::Input::AnalogProperties properties_y;
+ int callback_key_x;
+ int callback_key_y;
+ float last_axis_x_value;
+ float last_axis_y_value;
+ InputEngine* input_engine;
+ const bool invert_axis_y;
+};
+
+class InputFromTouch final : public Common::Input::InputDevice {
+public:
+ explicit InputFromTouch(PadIdentifier identifier_, int touch_id_, int button_, bool toggle_,
+ bool inverted_, int axis_x_, int axis_y_,
+ Common::Input::AnalogProperties properties_x_,
+ Common::Input::AnalogProperties properties_y_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), touch_id(touch_id_), button(button_), toggle(toggle_),
+ inverted(inverted_), axis_x(axis_x_), axis_y(axis_y_), properties_x(properties_x_),
+ properties_y(properties_y_), input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier button_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Button,
+ .index = button,
+ .callback = engine_callback,
+ };
+ const InputIdentifier x_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_x,
+ .callback = engine_callback,
+ };
+ const InputIdentifier y_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_y,
+ .callback = engine_callback,
+ };
+ last_axis_x_value = 0.0f;
+ last_axis_y_value = 0.0f;
+ last_button_value = false;
+ callback_key_button = input_engine->SetCallback(button_input_identifier);
+ callback_key_x = input_engine->SetCallback(x_input_identifier);
+ callback_key_y = input_engine->SetCallback(y_input_identifier);
+ }
+
+ ~InputFromTouch() override {
+ input_engine->DeleteCallback(callback_key_button);
+ input_engine->DeleteCallback(callback_key_x);
+ input_engine->DeleteCallback(callback_key_y);
+ }
+
+ Common::Input::TouchStatus GetStatus() const {
+ Common::Input::TouchStatus status;
+ status.id = touch_id;
+ status.pressed = {
+ .value = input_engine->GetButton(identifier, button),
+ .inverted = inverted,
+ .toggle = toggle,
+ };
+ status.x = {
+ .raw_value = input_engine->GetAxis(identifier, axis_x),
+ .properties = properties_x,
+ };
+ status.y = {
+ .raw_value = input_engine->GetAxis(identifier, axis_y),
+ .properties = properties_y,
+ };
+ return status;
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Touch,
+ .touch_status = GetStatus(),
+ };
+
+ if (status.touch_status.x.raw_value != last_axis_x_value ||
+ status.touch_status.y.raw_value != last_axis_y_value ||
+ status.touch_status.pressed.value != last_button_value) {
+ last_axis_x_value = status.touch_status.x.raw_value;
+ last_axis_y_value = status.touch_status.y.raw_value;
+ last_button_value = status.touch_status.pressed.value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int touch_id;
+ const int button;
+ const bool toggle;
+ const bool inverted;
+ const int axis_x;
+ const int axis_y;
+ const Common::Input::AnalogProperties properties_x;
+ const Common::Input::AnalogProperties properties_y;
+ int callback_key_button;
+ int callback_key_x;
+ int callback_key_y;
+ bool last_button_value;
+ float last_axis_x_value;
+ float last_axis_y_value;
+ InputEngine* input_engine;
+};
+
+class InputFromTrigger final : public Common::Input::InputDevice {
+public:
+ explicit InputFromTrigger(PadIdentifier identifier_, int button_, bool toggle_, bool inverted_,
+ int axis_, Common::Input::AnalogProperties properties_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), button(button_), toggle(toggle_), inverted(inverted_),
+ axis(axis_), properties(properties_), input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier button_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Button,
+ .index = button,
+ .callback = engine_callback,
+ };
+ const InputIdentifier axis_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis,
+ .callback = engine_callback,
+ };
+ last_axis_value = 0.0f;
+ last_button_value = false;
+ callback_key_button = input_engine->SetCallback(button_input_identifier);
+ axis_callback_key = input_engine->SetCallback(axis_input_identifier);
+ }
+
+ ~InputFromTrigger() override {
+ input_engine->DeleteCallback(callback_key_button);
+ input_engine->DeleteCallback(axis_callback_key);
+ }
+
+ Common::Input::TriggerStatus GetStatus() const {
+ const Common::Input::AnalogStatus analog_status{
+ .raw_value = input_engine->GetAxis(identifier, axis),
+ .properties = properties,
+ };
+ const Common::Input::ButtonStatus button_status{
+ .value = input_engine->GetButton(identifier, button),
+ .inverted = inverted,
+ .toggle = toggle,
+ };
+ return {
+ .analog = analog_status,
+ .pressed = button_status,
+ };
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Trigger,
+ .trigger_status = GetStatus(),
+ };
+
+ if (status.trigger_status.analog.raw_value != last_axis_value ||
+ status.trigger_status.pressed.value != last_button_value) {
+ last_axis_value = status.trigger_status.analog.raw_value;
+ last_button_value = status.trigger_status.pressed.value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int button;
+ const bool toggle;
+ const bool inverted;
+ const int axis;
+ const Common::Input::AnalogProperties properties;
+ int callback_key_button;
+ int axis_callback_key;
+ bool last_button_value;
+ float last_axis_value;
+ InputEngine* input_engine;
+};
+
+class InputFromAnalog final : public Common::Input::InputDevice {
+public:
+ explicit InputFromAnalog(PadIdentifier identifier_, int axis_,
+ Common::Input::AnalogProperties properties_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), axis(axis_), properties(properties_),
+ input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis,
+ .callback = engine_callback,
+ };
+ last_axis_value = 0.0f;
+ callback_key = input_engine->SetCallback(input_identifier);
+ }
+
+ ~InputFromAnalog() override {
+ input_engine->DeleteCallback(callback_key);
+ }
+
+ Common::Input::AnalogStatus GetStatus() const {
+ return {
+ .raw_value = input_engine->GetAxis(identifier, axis),
+ .properties = properties,
+ };
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Analog,
+ .analog_status = GetStatus(),
+ };
+
+ if (status.analog_status.raw_value != last_axis_value) {
+ last_axis_value = status.analog_status.raw_value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int axis;
+ const Common::Input::AnalogProperties properties;
+ int callback_key;
+ float last_axis_value;
+ InputEngine* input_engine;
+};
+
+class InputFromBattery final : public Common::Input::InputDevice {
+public:
+ explicit InputFromBattery(PadIdentifier identifier_, InputEngine* input_engine_)
+ : identifier(identifier_), input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Battery,
+ .index = 0,
+ .callback = engine_callback,
+ };
+ last_battery_value = Common::Input::BatteryStatus::Charging;
+ callback_key = input_engine->SetCallback(input_identifier);
+ }
+
+ ~InputFromBattery() override {
+ input_engine->DeleteCallback(callback_key);
+ }
+
+ Common::Input::BatteryStatus GetStatus() const {
+ return static_cast<Common::Input::BatteryLevel>(input_engine->GetBattery(identifier));
+ }
+
+ void ForceUpdate() override {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Battery,
+ .battery_status = GetStatus(),
+ };
+
+ last_battery_value = status.battery_status;
+ TriggerOnChange(status);
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Battery,
+ .battery_status = GetStatus(),
+ };
+
+ if (status.battery_status != last_battery_value) {
+ last_battery_value = status.battery_status;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ int callback_key;
+ Common::Input::BatteryStatus last_battery_value;
+ InputEngine* input_engine;
+};
+
+class InputFromMotion final : public Common::Input::InputDevice {
+public:
+ explicit InputFromMotion(PadIdentifier identifier_, int motion_sensor_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), motion_sensor(motion_sensor_), input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Motion,
+ .index = motion_sensor,
+ .callback = engine_callback,
+ };
+ callback_key = input_engine->SetCallback(input_identifier);
+ }
+
+ ~InputFromMotion() override {
+ input_engine->DeleteCallback(callback_key);
+ }
+
+ Common::Input::MotionStatus GetStatus() const {
+ const auto basic_motion = input_engine->GetMotion(identifier, motion_sensor);
+ Common::Input::MotionStatus status{};
+ const Common::Input::AnalogProperties properties = {
+ .deadzone = 0.001f,
+ .range = 1.0f,
+ .offset = 0.0f,
+ };
+ status.accel.x = {.raw_value = basic_motion.accel_x, .properties = properties};
+ status.accel.y = {.raw_value = basic_motion.accel_y, .properties = properties};
+ status.accel.z = {.raw_value = basic_motion.accel_z, .properties = properties};
+ status.gyro.x = {.raw_value = basic_motion.gyro_x, .properties = properties};
+ status.gyro.y = {.raw_value = basic_motion.gyro_y, .properties = properties};
+ status.gyro.z = {.raw_value = basic_motion.gyro_z, .properties = properties};
+ status.delta_timestamp = basic_motion.delta_timestamp;
+ return status;
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Motion,
+ .motion_status = GetStatus(),
+ };
+
+ TriggerOnChange(status);
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int motion_sensor;
+ int callback_key;
+ InputEngine* input_engine;
+};
+
+class InputFromAxisMotion final : public Common::Input::InputDevice {
+public:
+ explicit InputFromAxisMotion(PadIdentifier identifier_, int axis_x_, int axis_y_, int axis_z_,
+ Common::Input::AnalogProperties properties_x_,
+ Common::Input::AnalogProperties properties_y_,
+ Common::Input::AnalogProperties properties_z_,
+ InputEngine* input_engine_)
+ : identifier(identifier_), axis_x(axis_x_), axis_y(axis_y_), axis_z(axis_z_),
+ properties_x(properties_x_), properties_y(properties_y_), properties_z(properties_z_),
+ input_engine(input_engine_) {
+ UpdateCallback engine_callback{[this]() { OnChange(); }};
+ const InputIdentifier x_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_x,
+ .callback = engine_callback,
+ };
+ const InputIdentifier y_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_y,
+ .callback = engine_callback,
+ };
+ const InputIdentifier z_input_identifier{
+ .identifier = identifier,
+ .type = EngineInputType::Analog,
+ .index = axis_z,
+ .callback = engine_callback,
+ };
+ last_axis_x_value = 0.0f;
+ last_axis_y_value = 0.0f;
+ last_axis_z_value = 0.0f;
+ callback_key_x = input_engine->SetCallback(x_input_identifier);
+ callback_key_y = input_engine->SetCallback(y_input_identifier);
+ callback_key_z = input_engine->SetCallback(z_input_identifier);
+ }
+
+ ~InputFromAxisMotion() override {
+ input_engine->DeleteCallback(callback_key_x);
+ input_engine->DeleteCallback(callback_key_y);
+ input_engine->DeleteCallback(callback_key_z);
+ }
+
+ Common::Input::MotionStatus GetStatus() const {
+ Common::Input::MotionStatus status{};
+ status.gyro.x = {
+ .raw_value = input_engine->GetAxis(identifier, axis_x),
+ .properties = properties_x,
+ };
+ status.gyro.y = {
+ .raw_value = input_engine->GetAxis(identifier, axis_y),
+ .properties = properties_y,
+ };
+ status.gyro.z = {
+ .raw_value = input_engine->GetAxis(identifier, axis_z),
+ .properties = properties_z,
+ };
+ status.delta_timestamp = 5000;
+ status.force_update = true;
+ return status;
+ }
+
+ void ForceUpdate() override {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Motion,
+ .motion_status = GetStatus(),
+ };
+
+ last_axis_x_value = status.motion_status.gyro.x.raw_value;
+ last_axis_y_value = status.motion_status.gyro.y.raw_value;
+ last_axis_z_value = status.motion_status.gyro.z.raw_value;
+ TriggerOnChange(status);
+ }
+
+ void OnChange() {
+ const Common::Input::CallbackStatus status{
+ .type = Common::Input::InputType::Motion,
+ .motion_status = GetStatus(),
+ };
+
+ if (status.motion_status.gyro.x.raw_value != last_axis_x_value ||
+ status.motion_status.gyro.y.raw_value != last_axis_y_value ||
+ status.motion_status.gyro.z.raw_value != last_axis_z_value) {
+ last_axis_x_value = status.motion_status.gyro.x.raw_value;
+ last_axis_y_value = status.motion_status.gyro.y.raw_value;
+ last_axis_z_value = status.motion_status.gyro.z.raw_value;
+ TriggerOnChange(status);
+ }
+ }
+
+private:
+ const PadIdentifier identifier;
+ const int axis_x;
+ const int axis_y;
+ const int axis_z;
+ const Common::Input::AnalogProperties properties_x;
+ const Common::Input::AnalogProperties properties_y;
+ const Common::Input::AnalogProperties properties_z;
+ int callback_key_x;
+ int callback_key_y;
+ int callback_key_z;
+ float last_axis_x_value;
+ float last_axis_y_value;
+ float last_axis_z_value;
+ InputEngine* input_engine;
+};
+
+class OutputFromIdentifier final : public Common::Input::OutputDevice {
+public:
+ explicit OutputFromIdentifier(PadIdentifier identifier_, InputEngine* input_engine_)
+ : identifier(identifier_), input_engine(input_engine_) {}
+
+ void SetLED(const Common::Input::LedStatus& led_status) override {
+ input_engine->SetLeds(identifier, led_status);
+ }
+
+ Common::Input::VibrationError SetVibration(
+ const Common::Input::VibrationStatus& vibration_status) override {
+ return input_engine->SetRumble(identifier, vibration_status);
+ }
+
+ Common::Input::PollingError SetPollingMode(Common::Input::PollingMode polling_mode) override {
+ return input_engine->SetPollingMode(identifier, polling_mode);
+ }
+
+private:
+ const PadIdentifier identifier;
+ InputEngine* input_engine;
+};
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateButtonDevice(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto button_id = params.Get("button", 0);
+ const auto keyboard_key = params.Get("code", 0);
+ const auto toggle = params.Get("toggle", false);
+ const auto inverted = params.Get("inverted", false);
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetButton(identifier, button_id);
+ input_engine->PreSetButton(identifier, keyboard_key);
+ if (keyboard_key != 0) {
+ return std::make_unique<InputFromButton>(identifier, keyboard_key, toggle, inverted,
+ input_engine.get());
+ }
+ return std::make_unique<InputFromButton>(identifier, button_id, toggle, inverted,
+ input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateHatButtonDevice(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto button_id = params.Get("hat", 0);
+ const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
+ const auto toggle = params.Get("toggle", false);
+ const auto inverted = params.Get("inverted", false);
+
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetHatButton(identifier, button_id);
+ return std::make_unique<InputFromHatButton>(identifier, button_id, direction, toggle, inverted,
+ input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateStickDevice(
+ const Common::ParamPackage& params) {
+ const auto deadzone = std::clamp(params.Get("deadzone", 0.15f), 0.0f, 1.0f);
+ const auto range = std::clamp(params.Get("range", 1.0f), 0.25f, 1.50f);
+ const auto threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f);
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto axis_x = params.Get("axis_x", 0);
+ const Common::Input::AnalogProperties properties_x = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_x", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_x", "+") == "-",
+ };
+
+ const auto axis_y = params.Get("axis_y", 1);
+ const Common::Input::AnalogProperties properties_y = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_y", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_y", "+") != "+",
+ };
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetAxis(identifier, axis_x);
+ input_engine->PreSetAxis(identifier, axis_y);
+ return std::make_unique<InputFromStick>(identifier, axis_x, axis_y, properties_x, properties_y,
+ input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto axis = params.Get("axis", 0);
+ const Common::Input::AnalogProperties properties = {
+ .deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f),
+ .range = std::clamp(params.Get("range", 1.0f), 0.25f, 1.50f),
+ .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
+ .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert", "+") == "-",
+ };
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetAxis(identifier, axis);
+ return std::make_unique<InputFromAnalog>(identifier, axis, properties, input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTriggerDevice(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto button = params.Get("button", 0);
+ const auto toggle = params.Get("toggle", false);
+ const auto inverted = params.Get("inverted", false);
+
+ const auto axis = params.Get("axis", 0);
+ const Common::Input::AnalogProperties properties = {
+ .deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f),
+ .range = std::clamp(params.Get("range", 1.0f), 0.25f, 2.50f),
+ .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
+ .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert", false) != 0,
+ };
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetAxis(identifier, axis);
+ input_engine->PreSetButton(identifier, button);
+ return std::make_unique<InputFromTrigger>(identifier, button, toggle, inverted, axis,
+ properties, input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTouchDevice(
+ const Common::ParamPackage& params) {
+ const auto touch_id = params.Get("touch_id", 0);
+ const auto deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
+ const auto range = std::clamp(params.Get("range", 1.0f), 0.25f, 1.50f);
+ const auto threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f);
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ const auto button = params.Get("button", 0);
+ const auto toggle = params.Get("toggle", false);
+ const auto inverted = params.Get("inverted", false);
+
+ const auto axis_x = params.Get("axis_x", 0);
+ const Common::Input::AnalogProperties properties_x = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_x", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_x", "+") == "-",
+ };
+
+ const auto axis_y = params.Get("axis_y", 1);
+ const Common::Input::AnalogProperties properties_y = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_y", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_y", false) != 0,
+ };
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetAxis(identifier, axis_x);
+ input_engine->PreSetAxis(identifier, axis_y);
+ input_engine->PreSetButton(identifier, button);
+ return std::make_unique<InputFromTouch>(identifier, touch_id, button, toggle, inverted, axis_x,
+ axis_y, properties_x, properties_y, input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateBatteryDevice(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ input_engine->PreSetController(identifier);
+ return std::make_unique<InputFromBattery>(identifier, input_engine.get());
+}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateMotionDevice(
+ Common::ParamPackage params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ if (params.Has("motion")) {
+ const auto motion_sensor = params.Get("motion", 0);
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetMotion(identifier, motion_sensor);
+ return std::make_unique<InputFromMotion>(identifier, motion_sensor, input_engine.get());
+ }
+
+ const auto deadzone = std::clamp(params.Get("deadzone", 0.15f), 0.0f, 1.0f);
+ const auto range = std::clamp(params.Get("range", 1.0f), 0.25f, 1.50f);
+ const auto threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f);
+
+ const auto axis_x = params.Get("axis_x", 0);
+ const Common::Input::AnalogProperties properties_x = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_x", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_x", "+") == "-",
+ };
+
+ const auto axis_y = params.Get("axis_y", 1);
+ const Common::Input::AnalogProperties properties_y = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_y", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_y", "+") != "+",
+ };
+
+ const auto axis_z = params.Get("axis_z", 1);
+ const Common::Input::AnalogProperties properties_z = {
+ .deadzone = deadzone,
+ .range = range,
+ .threshold = threshold,
+ .offset = std::clamp(params.Get("offset_z", 0.0f), -1.0f, 1.0f),
+ .inverted = params.Get("invert_z", "+") != "+",
+ };
+ input_engine->PreSetController(identifier);
+ input_engine->PreSetAxis(identifier, axis_x);
+ input_engine->PreSetAxis(identifier, axis_y);
+ input_engine->PreSetAxis(identifier, axis_z);
+ return std::make_unique<InputFromAxisMotion>(identifier, axis_x, axis_y, axis_z, properties_x,
+ properties_y, properties_z, input_engine.get());
+}
+
+InputFactory::InputFactory(std::shared_ptr<InputEngine> input_engine_)
+ : input_engine(std::move(input_engine_)) {}
+
+std::unique_ptr<Common::Input::InputDevice> InputFactory::Create(
+ const Common::ParamPackage& params) {
+ if (params.Has("battery")) {
+ return CreateBatteryDevice(params);
+ }
+ if (params.Has("button") && params.Has("axis")) {
+ return CreateTriggerDevice(params);
+ }
+ if (params.Has("button") && params.Has("axis_x") && params.Has("axis_y")) {
+ return CreateTouchDevice(params);
+ }
+ if (params.Has("button") || params.Has("code")) {
+ return CreateButtonDevice(params);
+ }
+ if (params.Has("hat")) {
+ return CreateHatButtonDevice(params);
+ }
+ if (params.Has("axis_x") && params.Has("axis_y") && params.Has("axis_z")) {
+ return CreateMotionDevice(params);
+ }
+ if (params.Has("motion")) {
+ return CreateMotionDevice(params);
+ }
+ if (params.Has("axis_x") && params.Has("axis_y")) {
+ return CreateStickDevice(params);
+ }
+ if (params.Has("axis")) {
+ return CreateAnalogDevice(params);
+ }
+ LOG_ERROR(Input, "Invalid parameters given");
+ return std::make_unique<DummyInput>();
+}
+
+OutputFactory::OutputFactory(std::shared_ptr<InputEngine> input_engine_)
+ : input_engine(std::move(input_engine_)) {}
+
+std::unique_ptr<Common::Input::OutputDevice> OutputFactory::Create(
+ const Common::ParamPackage& params) {
+ const PadIdentifier identifier = {
+ .guid = Common::UUID{params.Get("guid", "")},
+ .port = static_cast<std::size_t>(params.Get("port", 0)),
+ .pad = static_cast<std::size_t>(params.Get("pad", 0)),
+ };
+
+ input_engine->PreSetController(identifier);
+ return std::make_unique<OutputFromIdentifier>(identifier, input_engine.get());
+}
+
+} // namespace InputCommon
diff --git a/src/input_common/input_poller.h b/src/input_common/input_poller.h
new file mode 100644
index 000000000..8a0977d58
--- /dev/null
+++ b/src/input_common/input_poller.h
@@ -0,0 +1,217 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+namespace Input {
+class InputDevice;
+
+template <typename InputDevice>
+class Factory;
+}; // namespace Input
+
+namespace InputCommon {
+class InputEngine;
+
+class OutputFactory final : public Common::Input::Factory<Common::Input::OutputDevice> {
+public:
+ explicit OutputFactory(std::shared_ptr<InputEngine> input_engine_);
+
+ /**
+ * Creates an output device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "guid" text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique output device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::OutputDevice> Create(
+ const Common::ParamPackage& params) override;
+
+private:
+ std::shared_ptr<InputEngine> input_engine;
+};
+
+/**
+ * An Input factory. It receives input events and forward them to all input devices it created.
+ */
+class InputFactory final : public Common::Input::Factory<Common::Input::InputDevice> {
+public:
+ explicit InputFactory(std::shared_ptr<InputEngine> input_engine_);
+
+ /**
+ * Creates an input device from the parameters given. Identifies the type of input to be
+ * returned if it contains the following parameters:
+ * - button: Contains "button" or "code"
+ * - hat_button: Contains "hat"
+ * - analog: Contains "axis"
+ * - trigger: Contains "button" and "axis"
+ * - stick: Contains "axis_x" and "axis_y"
+ * - motion: Contains "axis_x", "axis_y" and "axis_z"
+ * - motion: Contains "motion"
+ * - touch: Contains "button", "axis_x" and "axis_y"
+ * - battery: Contains "battery"
+ * - output: Contains "output"
+ * @param params contains parameters for creating the device:
+ * - "code": the code of the keyboard key to bind with the input
+ * - "button": same as "code" but for controller buttons
+ * - "hat": similar as "button" but it's a group of hat buttons from SDL
+ * - "axis": the axis number of the axis to bind with the input
+ * - "motion": the motion number of the motion to bind with the input
+ * - "axis_x": same as axis but specifying horizontal direction
+ * - "axis_y": same as axis but specifying vertical direction
+ * - "axis_z": same as axis but specifying forward direction
+ * - "battery": Only used as a placeholder to set the input type
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> Create(const Common::ParamPackage& params) override;
+
+private:
+ /**
+ * Creates a button device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "code": the code of the keyboard key to bind with the input
+ * - "button": same as "code" but for controller buttons
+ * - "toggle": press once to enable, press again to disable
+ * - "inverted": inverts the output of the button
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateButtonDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a hat button device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "button": the controller hat id to bind with the input
+ * - "direction": the direction id to be detected
+ * - "toggle": press once to enable, press again to disable
+ * - "inverted": inverts the output of the button
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateHatButtonDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a stick device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "axis_x": the controller horizontal axis id to bind with the input
+ * - "axis_y": the controller vertical axis id to bind with the input
+ * - "deadzone": the minimum required value to be detected
+ * - "range": the maximum value required to reach 100%
+ * - "threshold": the minimum required value to considered pressed
+ * - "offset_x": the amount of offset in the x axis
+ * - "offset_y": the amount of offset in the y axis
+ * - "invert_x": inverts the sign of the horizontal axis
+ * - "invert_y": inverts the sign of the vertical axis
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateStickDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates an analog device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "axis": the controller axis id to bind with the input
+ * - "deadzone": the minimum required value to be detected
+ * - "range": the maximum value required to reach 100%
+ * - "threshold": the minimum required value to considered pressed
+ * - "offset": the amount of offset in the axis
+ * - "invert": inverts the sign of the axis
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateAnalogDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a trigger device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "button": the controller hat id to bind with the input
+ * - "direction": the direction id to be detected
+ * - "toggle": press once to enable, press again to disable
+ * - "inverted": inverts the output of the button
+ * - "axis": the controller axis id to bind with the input
+ * - "deadzone": the minimum required value to be detected
+ * - "range": the maximum value required to reach 100%
+ * - "threshold": the minimum required value to considered pressed
+ * - "offset": the amount of offset in the axis
+ * - "invert": inverts the sign of the axis
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateTriggerDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a touch device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "button": the controller hat id to bind with the input
+ * - "direction": the direction id to be detected
+ * - "toggle": press once to enable, press again to disable
+ * - "inverted": inverts the output of the button
+ * - "axis_x": the controller horizontal axis id to bind with the input
+ * - "axis_y": the controller vertical axis id to bind with the input
+ * - "deadzone": the minimum required value to be detected
+ * - "range": the maximum value required to reach 100%
+ * - "threshold": the minimum required value to considered pressed
+ * - "offset_x": the amount of offset in the x axis
+ * - "offset_y": the amount of offset in the y axis
+ * - "invert_x": inverts the sign of the horizontal axis
+ * - "invert_y": inverts the sign of the vertical axis
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateTouchDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a battery device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateBatteryDevice(
+ const Common::ParamPackage& params);
+
+ /**
+ * Creates a motion device from the parameters given.
+ * @param params contains parameters for creating the device:
+ * - "axis_x": the controller horizontal axis id to bind with the input
+ * - "axis_y": the controller vertical axis id to bind with the input
+ * - "axis_z": the controller forward axis id to bind with the input
+ * - "deadzone": the minimum required value to be detected
+ * - "range": the maximum value required to reach 100%
+ * - "offset_x": the amount of offset in the x axis
+ * - "offset_y": the amount of offset in the y axis
+ * - "offset_z": the amount of offset in the z axis
+ * - "invert_x": inverts the sign of the horizontal axis
+ * - "invert_y": inverts the sign of the vertical axis
+ * - "invert_z": inverts the sign of the forward axis
+ * - "guid": text string for identifying controllers
+ * - "port": port of the connected device
+ * - "pad": slot of the connected controller
+ * @returns a unique input device with the parameters specified
+ */
+ std::unique_ptr<Common::Input::InputDevice> CreateMotionDevice(Common::ParamPackage params);
+
+ std::shared_ptr<InputEngine> input_engine;
+};
+} // namespace InputCommon
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp
deleted file mode 100644
index 8261e76fd..000000000
--- a/src/input_common/keyboard.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <atomic>
-#include <list>
-#include <mutex>
-#include <utility>
-#include "input_common/keyboard.h"
-
-namespace InputCommon {
-
-class KeyButton final : public Input::ButtonDevice {
-public:
- explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_, bool toggle_)
- : key_button_list(std::move(key_button_list_)), toggle(toggle_) {}
-
- ~KeyButton() override;
-
- bool GetStatus() const override {
- if (toggle) {
- return toggled_status.load(std::memory_order_relaxed);
- }
- return status.load();
- }
-
- void ToggleButton() {
- if (lock) {
- return;
- }
- lock = true;
- const bool old_toggle_status = toggled_status.load();
- toggled_status.store(!old_toggle_status);
- }
-
- void UnlockButton() {
- lock = false;
- }
-
- friend class KeyButtonList;
-
-private:
- std::shared_ptr<KeyButtonList> key_button_list;
- std::atomic<bool> status{false};
- std::atomic<bool> toggled_status{false};
- bool lock{false};
- const bool toggle;
-};
-
-struct KeyButtonPair {
- int key_code;
- KeyButton* key_button;
-};
-
-class KeyButtonList {
-public:
- void AddKeyButton(int key_code, KeyButton* key_button) {
- std::lock_guard guard{mutex};
- list.push_back(KeyButtonPair{key_code, key_button});
- }
-
- void RemoveKeyButton(const KeyButton* key_button) {
- std::lock_guard guard{mutex};
- list.remove_if(
- [key_button](const KeyButtonPair& pair) { return pair.key_button == key_button; });
- }
-
- void ChangeKeyStatus(int key_code, bool pressed) {
- std::lock_guard guard{mutex};
- for (const KeyButtonPair& pair : list) {
- if (pair.key_code == key_code) {
- pair.key_button->status.store(pressed);
- if (pressed) {
- pair.key_button->ToggleButton();
- } else {
- pair.key_button->UnlockButton();
- }
- pair.key_button->TriggerOnChange();
- }
- }
- }
-
- void ChangeAllKeyStatus(bool pressed) {
- std::lock_guard guard{mutex};
- for (const KeyButtonPair& pair : list) {
- pair.key_button->status.store(pressed);
- }
- }
-
-private:
- std::mutex mutex;
- std::list<KeyButtonPair> list;
-};
-
-Keyboard::Keyboard() : key_button_list{std::make_shared<KeyButtonList>()} {}
-
-KeyButton::~KeyButton() {
- key_button_list->RemoveKeyButton(this);
-}
-
-std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) {
- const int key_code = params.Get("code", 0);
- const bool toggle = params.Get("toggle", false);
- std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list, toggle);
- key_button_list->AddKeyButton(key_code, button.get());
- return button;
-}
-
-void Keyboard::PressKey(int key_code) {
- key_button_list->ChangeKeyStatus(key_code, true);
-}
-
-void Keyboard::ReleaseKey(int key_code) {
- key_button_list->ChangeKeyStatus(key_code, false);
-}
-
-void Keyboard::ReleaseAllKeys() {
- key_button_list->ChangeAllKeyStatus(false);
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/keyboard.h b/src/input_common/keyboard.h
deleted file mode 100644
index 861950472..000000000
--- a/src/input_common/keyboard.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include "core/frontend/input.h"
-
-namespace InputCommon {
-
-class KeyButtonList;
-
-/**
- * A button device factory representing a keyboard. It receives keyboard events and forward them
- * to all button devices it created.
- */
-class Keyboard final : public Input::Factory<Input::ButtonDevice> {
-public:
- Keyboard();
-
- /**
- * Creates a button device from a keyboard key
- * @param params contains parameters for creating the device:
- * - "code": the code of the key to bind with the button
- */
- std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override;
-
- /**
- * Sets the status of all buttons bound with the key to pressed
- * @param key_code the code of the key to press
- */
- void PressKey(int key_code);
-
- /**
- * Sets the status of all buttons bound with the key to released
- * @param key_code the code of the key to release
- */
- void ReleaseKey(int key_code);
-
- void ReleaseAllKeys();
-
-private:
- std::shared_ptr<KeyButtonList> key_button_list;
-};
-
-} // namespace InputCommon
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index f3907c65a..940744c5f 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -4,146 +4,173 @@
#include <memory>
#include <thread>
+#include "common/input.h"
#include "common/param_package.h"
-#include "common/settings.h"
-#include "input_common/analog_from_button.h"
-#include "input_common/gcadapter/gc_adapter.h"
-#include "input_common/gcadapter/gc_poller.h"
-#include "input_common/keyboard.h"
+#include "input_common/drivers/gc_adapter.h"
+#include "input_common/drivers/keyboard.h"
+#include "input_common/drivers/mouse.h"
+#include "input_common/drivers/tas_input.h"
+#include "input_common/drivers/touch_screen.h"
+#include "input_common/drivers/udp_client.h"
+#include "input_common/helpers/stick_from_buttons.h"
+#include "input_common/helpers/touch_from_buttons.h"
+#include "input_common/input_engine.h"
+#include "input_common/input_mapping.h"
+#include "input_common/input_poller.h"
#include "input_common/main.h"
-#include "input_common/motion_from_button.h"
-#include "input_common/mouse/mouse_input.h"
-#include "input_common/mouse/mouse_poller.h"
-#include "input_common/tas/tas_input.h"
-#include "input_common/tas/tas_poller.h"
-#include "input_common/touch_from_button.h"
-#include "input_common/udp/client.h"
-#include "input_common/udp/udp.h"
#ifdef HAVE_SDL2
-#include "input_common/sdl/sdl.h"
+#include "input_common/drivers/sdl_driver.h"
#endif
namespace InputCommon {
struct InputSubsystem::Impl {
void Initialize() {
- gcadapter = std::make_shared<GCAdapter::Adapter>();
- gcbuttons = std::make_shared<GCButtonFactory>(gcadapter);
- Input::RegisterFactory<Input::ButtonDevice>("gcpad", gcbuttons);
- gcanalog = std::make_shared<GCAnalogFactory>(gcadapter);
- Input::RegisterFactory<Input::AnalogDevice>("gcpad", gcanalog);
- gcvibration = std::make_shared<GCVibrationFactory>(gcadapter);
- Input::RegisterFactory<Input::VibrationDevice>("gcpad", gcvibration);
-
- keyboard = std::make_shared<Keyboard>();
- Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard);
- Input::RegisterFactory<Input::AnalogDevice>("analog_from_button",
- std::make_shared<AnalogFromButton>());
- Input::RegisterFactory<Input::MotionDevice>("keyboard",
- std::make_shared<MotionFromButton>());
- Input::RegisterFactory<Input::TouchDevice>("touch_from_button",
- std::make_shared<TouchFromButtonFactory>());
+ mapping_factory = std::make_shared<MappingFactory>();
+ MappingCallback mapping_callback{[this](MappingData data) { RegisterInput(data); }};
+
+ keyboard = std::make_shared<Keyboard>("keyboard");
+ keyboard->SetMappingCallback(mapping_callback);
+ keyboard_factory = std::make_shared<InputFactory>(keyboard);
+ keyboard_output_factory = std::make_shared<OutputFactory>(keyboard);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(keyboard->GetEngineName(),
+ keyboard_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(keyboard->GetEngineName(),
+ keyboard_output_factory);
+
+ mouse = std::make_shared<Mouse>("mouse");
+ mouse->SetMappingCallback(mapping_callback);
+ mouse_factory = std::make_shared<InputFactory>(mouse);
+ mouse_output_factory = std::make_shared<OutputFactory>(mouse);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(mouse->GetEngineName(),
+ mouse_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(mouse->GetEngineName(),
+ mouse_output_factory);
+
+ touch_screen = std::make_shared<TouchScreen>("touch");
+ touch_screen_factory = std::make_shared<InputFactory>(touch_screen);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(touch_screen->GetEngineName(),
+ touch_screen_factory);
+
+ gcadapter = std::make_shared<GCAdapter>("gcpad");
+ gcadapter->SetMappingCallback(mapping_callback);
+ gcadapter_input_factory = std::make_shared<InputFactory>(gcadapter);
+ gcadapter_output_factory = std::make_shared<OutputFactory>(gcadapter);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(gcadapter->GetEngineName(),
+ gcadapter_input_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(gcadapter->GetEngineName(),
+ gcadapter_output_factory);
+
+ udp_client = std::make_shared<CemuhookUDP::UDPClient>("cemuhookudp");
+ udp_client->SetMappingCallback(mapping_callback);
+ udp_client_input_factory = std::make_shared<InputFactory>(udp_client);
+ udp_client_output_factory = std::make_shared<OutputFactory>(udp_client);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(udp_client->GetEngineName(),
+ udp_client_input_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(udp_client->GetEngineName(),
+ udp_client_output_factory);
+
+ tas_input = std::make_shared<TasInput::Tas>("tas");
+ tas_input->SetMappingCallback(mapping_callback);
+ tas_input_factory = std::make_shared<InputFactory>(tas_input);
+ tas_output_factory = std::make_shared<OutputFactory>(tas_input);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(tas_input->GetEngineName(),
+ tas_input_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(tas_input->GetEngineName(),
+ tas_output_factory);
#ifdef HAVE_SDL2
- sdl = SDL::Init();
+ sdl = std::make_shared<SDLDriver>("sdl");
+ sdl->SetMappingCallback(mapping_callback);
+ sdl_input_factory = std::make_shared<InputFactory>(sdl);
+ sdl_output_factory = std::make_shared<OutputFactory>(sdl);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(sdl->GetEngineName(),
+ sdl_input_factory);
+ Common::Input::RegisterFactory<Common::Input::OutputDevice>(sdl->GetEngineName(),
+ sdl_output_factory);
#endif
- udp = std::make_shared<InputCommon::CemuhookUDP::Client>();
- udpmotion = std::make_shared<UDPMotionFactory>(udp);
- Input::RegisterFactory<Input::MotionDevice>("cemuhookudp", udpmotion);
- udptouch = std::make_shared<UDPTouchFactory>(udp);
- Input::RegisterFactory<Input::TouchDevice>("cemuhookudp", udptouch);
-
- mouse = std::make_shared<MouseInput::Mouse>();
- mousebuttons = std::make_shared<MouseButtonFactory>(mouse);
- Input::RegisterFactory<Input::ButtonDevice>("mouse", mousebuttons);
- mouseanalog = std::make_shared<MouseAnalogFactory>(mouse);
- Input::RegisterFactory<Input::AnalogDevice>("mouse", mouseanalog);
- mousemotion = std::make_shared<MouseMotionFactory>(mouse);
- Input::RegisterFactory<Input::MotionDevice>("mouse", mousemotion);
- mousetouch = std::make_shared<MouseTouchFactory>(mouse);
- Input::RegisterFactory<Input::TouchDevice>("mouse", mousetouch);
-
- tas = std::make_shared<TasInput::Tas>();
- tasbuttons = std::make_shared<TasButtonFactory>(tas);
- Input::RegisterFactory<Input::ButtonDevice>("tas", tasbuttons);
- tasanalog = std::make_shared<TasAnalogFactory>(tas);
- Input::RegisterFactory<Input::AnalogDevice>("tas", tasanalog);
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(
+ "touch_from_button", std::make_shared<TouchFromButton>());
+ Common::Input::RegisterFactory<Common::Input::InputDevice>(
+ "analog_from_button", std::make_shared<StickFromButton>());
}
void Shutdown() {
- Input::UnregisterFactory<Input::ButtonDevice>("keyboard");
- Input::UnregisterFactory<Input::MotionDevice>("keyboard");
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(keyboard->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(keyboard->GetEngineName());
keyboard.reset();
- Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button");
- Input::UnregisterFactory<Input::TouchDevice>("touch_from_button");
-#ifdef HAVE_SDL2
- sdl.reset();
-#endif
- Input::UnregisterFactory<Input::ButtonDevice>("gcpad");
- Input::UnregisterFactory<Input::AnalogDevice>("gcpad");
- Input::UnregisterFactory<Input::VibrationDevice>("gcpad");
- gcbuttons.reset();
- gcanalog.reset();
- gcvibration.reset();
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(mouse->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(mouse->GetEngineName());
+ mouse.reset();
- Input::UnregisterFactory<Input::MotionDevice>("cemuhookudp");
- Input::UnregisterFactory<Input::TouchDevice>("cemuhookudp");
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(touch_screen->GetEngineName());
+ touch_screen.reset();
- udpmotion.reset();
- udptouch.reset();
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(gcadapter->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(gcadapter->GetEngineName());
+ gcadapter.reset();
- Input::UnregisterFactory<Input::ButtonDevice>("mouse");
- Input::UnregisterFactory<Input::AnalogDevice>("mouse");
- Input::UnregisterFactory<Input::MotionDevice>("mouse");
- Input::UnregisterFactory<Input::TouchDevice>("mouse");
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(udp_client->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(udp_client->GetEngineName());
+ udp_client.reset();
- mousebuttons.reset();
- mouseanalog.reset();
- mousemotion.reset();
- mousetouch.reset();
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(tas_input->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(tas_input->GetEngineName());
+ tas_input.reset();
- Input::UnregisterFactory<Input::ButtonDevice>("tas");
- Input::UnregisterFactory<Input::AnalogDevice>("tas");
+#ifdef HAVE_SDL2
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>(sdl->GetEngineName());
+ Common::Input::UnregisterFactory<Common::Input::OutputDevice>(sdl->GetEngineName());
+ sdl.reset();
+#endif
- tasbuttons.reset();
- tasanalog.reset();
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>("touch_from_button");
+ Common::Input::UnregisterFactory<Common::Input::InputDevice>("analog_from_button");
}
[[nodiscard]] std::vector<Common::ParamPackage> GetInputDevices() const {
std::vector<Common::ParamPackage> devices = {
- Common::ParamPackage{{"display", "Any"}, {"class", "any"}},
- Common::ParamPackage{{"display", "Keyboard/Mouse"}, {"class", "keyboard"}},
+ Common::ParamPackage{{"display", "Any"}, {"engine", "any"}},
};
- if (Settings::values.tas_enable) {
- devices.emplace_back(
- Common::ParamPackage{{"display", "TAS Controller"}, {"class", "tas"}});
- }
+
+ auto keyboard_devices = keyboard->GetInputDevices();
+ devices.insert(devices.end(), keyboard_devices.begin(), keyboard_devices.end());
+ auto mouse_devices = mouse->GetInputDevices();
+ devices.insert(devices.end(), mouse_devices.begin(), mouse_devices.end());
+ auto gcadapter_devices = gcadapter->GetInputDevices();
+ devices.insert(devices.end(), gcadapter_devices.begin(), gcadapter_devices.end());
+ auto udp_devices = udp_client->GetInputDevices();
+ devices.insert(devices.end(), udp_devices.begin(), udp_devices.end());
#ifdef HAVE_SDL2
auto sdl_devices = sdl->GetInputDevices();
devices.insert(devices.end(), sdl_devices.begin(), sdl_devices.end());
#endif
- auto udp_devices = udp->GetInputDevices();
- devices.insert(devices.end(), udp_devices.begin(), udp_devices.end());
- auto gcpad_devices = gcadapter->GetInputDevices();
- devices.insert(devices.end(), gcpad_devices.begin(), gcpad_devices.end());
+
return devices;
}
[[nodiscard]] AnalogMapping GetAnalogMappingForDevice(
const Common::ParamPackage& params) const {
- if (!params.Has("class") || params.Get("class", "") == "any") {
+ if (!params.Has("engine") || params.Get("engine", "") == "any") {
return {};
}
- if (params.Get("class", "") == "gcpad") {
+ const std::string engine = params.Get("engine", "");
+ if (engine == mouse->GetEngineName()) {
+ return mouse->GetAnalogMappingForDevice(params);
+ }
+ if (engine == gcadapter->GetEngineName()) {
return gcadapter->GetAnalogMappingForDevice(params);
}
- if (params.Get("class", "") == "tas") {
- return tas->GetAnalogMappingForDevice(params);
+ if (engine == udp_client->GetEngineName()) {
+ return udp_client->GetAnalogMappingForDevice(params);
+ }
+ if (engine == tas_input->GetEngineName()) {
+ return tas_input->GetAnalogMappingForDevice(params);
}
#ifdef HAVE_SDL2
- if (params.Get("class", "") == "sdl") {
+ if (engine == sdl->GetEngineName()) {
return sdl->GetAnalogMappingForDevice(params);
}
#endif
@@ -152,17 +179,21 @@ struct InputSubsystem::Impl {
[[nodiscard]] ButtonMapping GetButtonMappingForDevice(
const Common::ParamPackage& params) const {
- if (!params.Has("class") || params.Get("class", "") == "any") {
+ if (!params.Has("engine") || params.Get("engine", "") == "any") {
return {};
}
- if (params.Get("class", "") == "gcpad") {
+ const std::string engine = params.Get("engine", "");
+ if (engine == gcadapter->GetEngineName()) {
return gcadapter->GetButtonMappingForDevice(params);
}
- if (params.Get("class", "") == "tas") {
- return tas->GetButtonMappingForDevice(params);
+ if (engine == udp_client->GetEngineName()) {
+ return udp_client->GetButtonMappingForDevice(params);
+ }
+ if (engine == tas_input->GetEngineName()) {
+ return tas_input->GetButtonMappingForDevice(params);
}
#ifdef HAVE_SDL2
- if (params.Get("class", "") == "sdl") {
+ if (engine == sdl->GetEngineName()) {
return sdl->GetButtonMappingForDevice(params);
}
#endif
@@ -171,40 +202,119 @@ struct InputSubsystem::Impl {
[[nodiscard]] MotionMapping GetMotionMappingForDevice(
const Common::ParamPackage& params) const {
- if (!params.Has("class") || params.Get("class", "") == "any") {
+ if (!params.Has("engine") || params.Get("engine", "") == "any") {
return {};
}
- if (params.Get("class", "") == "cemuhookudp") {
- // TODO return the correct motion device
- return {};
+ const std::string engine = params.Get("engine", "");
+ if (engine == udp_client->GetEngineName()) {
+ return udp_client->GetMotionMappingForDevice(params);
}
#ifdef HAVE_SDL2
- if (params.Get("class", "") == "sdl") {
+ if (engine == sdl->GetEngineName()) {
return sdl->GetMotionMappingForDevice(params);
}
#endif
return {};
}
+ Common::Input::ButtonNames GetButtonName(const Common::ParamPackage& params) const {
+ if (!params.Has("engine") || params.Get("engine", "") == "any") {
+ return Common::Input::ButtonNames::Undefined;
+ }
+ const std::string engine = params.Get("engine", "");
+ if (engine == mouse->GetEngineName()) {
+ return mouse->GetUIName(params);
+ }
+ if (engine == gcadapter->GetEngineName()) {
+ return gcadapter->GetUIName(params);
+ }
+ if (engine == udp_client->GetEngineName()) {
+ return udp_client->GetUIName(params);
+ }
+ if (engine == tas_input->GetEngineName()) {
+ return tas_input->GetUIName(params);
+ }
+#ifdef HAVE_SDL2
+ if (engine == sdl->GetEngineName()) {
+ return sdl->GetUIName(params);
+ }
+#endif
+ return Common::Input::ButtonNames::Invalid;
+ }
+
+ bool IsController(const Common::ParamPackage& params) {
+ const std::string engine = params.Get("engine", "");
+ if (engine == mouse->GetEngineName()) {
+ return true;
+ }
+ if (engine == gcadapter->GetEngineName()) {
+ return true;
+ }
+ if (engine == udp_client->GetEngineName()) {
+ return true;
+ }
+ if (engine == tas_input->GetEngineName()) {
+ return true;
+ }
+#ifdef HAVE_SDL2
+ if (engine == sdl->GetEngineName()) {
+ return true;
+ }
+#endif
+ return false;
+ }
+
+ void BeginConfiguration() {
+ keyboard->BeginConfiguration();
+ mouse->BeginConfiguration();
+ gcadapter->BeginConfiguration();
+ udp_client->BeginConfiguration();
+#ifdef HAVE_SDL2
+ sdl->BeginConfiguration();
+#endif
+ }
+
+ void EndConfiguration() {
+ keyboard->EndConfiguration();
+ mouse->EndConfiguration();
+ gcadapter->EndConfiguration();
+ udp_client->EndConfiguration();
+#ifdef HAVE_SDL2
+ sdl->EndConfiguration();
+#endif
+ }
+
+ void RegisterInput(MappingData data) {
+ mapping_factory->RegisterInput(data);
+ }
+
+ std::shared_ptr<MappingFactory> mapping_factory;
+
std::shared_ptr<Keyboard> keyboard;
+ std::shared_ptr<Mouse> mouse;
+ std::shared_ptr<GCAdapter> gcadapter;
+ std::shared_ptr<TouchScreen> touch_screen;
+ std::shared_ptr<TasInput::Tas> tas_input;
+ std::shared_ptr<CemuhookUDP::UDPClient> udp_client;
+
+ std::shared_ptr<InputFactory> keyboard_factory;
+ std::shared_ptr<InputFactory> mouse_factory;
+ std::shared_ptr<InputFactory> gcadapter_input_factory;
+ std::shared_ptr<InputFactory> touch_screen_factory;
+ std::shared_ptr<InputFactory> udp_client_input_factory;
+ std::shared_ptr<InputFactory> tas_input_factory;
+
+ std::shared_ptr<OutputFactory> keyboard_output_factory;
+ std::shared_ptr<OutputFactory> mouse_output_factory;
+ std::shared_ptr<OutputFactory> gcadapter_output_factory;
+ std::shared_ptr<OutputFactory> udp_client_output_factory;
+ std::shared_ptr<OutputFactory> tas_output_factory;
+
#ifdef HAVE_SDL2
- std::unique_ptr<SDL::State> sdl;
+ std::shared_ptr<SDLDriver> sdl;
+ std::shared_ptr<InputFactory> sdl_input_factory;
+ std::shared_ptr<OutputFactory> sdl_output_factory;
#endif
- std::shared_ptr<GCButtonFactory> gcbuttons;
- std::shared_ptr<GCAnalogFactory> gcanalog;
- std::shared_ptr<GCVibrationFactory> gcvibration;
- std::shared_ptr<UDPMotionFactory> udpmotion;
- std::shared_ptr<UDPTouchFactory> udptouch;
- std::shared_ptr<MouseButtonFactory> mousebuttons;
- std::shared_ptr<MouseAnalogFactory> mouseanalog;
- std::shared_ptr<MouseMotionFactory> mousemotion;
- std::shared_ptr<MouseTouchFactory> mousetouch;
- std::shared_ptr<TasButtonFactory> tasbuttons;
- std::shared_ptr<TasAnalogFactory> tasanalog;
- std::shared_ptr<CemuhookUDP::Client> udp;
- std::shared_ptr<GCAdapter::Adapter> gcadapter;
- std::shared_ptr<MouseInput::Mouse> mouse;
- std::shared_ptr<TasInput::Tas> tas;
};
InputSubsystem::InputSubsystem() : impl{std::make_unique<Impl>()} {}
@@ -227,20 +337,28 @@ const Keyboard* InputSubsystem::GetKeyboard() const {
return impl->keyboard.get();
}
-MouseInput::Mouse* InputSubsystem::GetMouse() {
+Mouse* InputSubsystem::GetMouse() {
return impl->mouse.get();
}
-const MouseInput::Mouse* InputSubsystem::GetMouse() const {
+const Mouse* InputSubsystem::GetMouse() const {
return impl->mouse.get();
}
+TouchScreen* InputSubsystem::GetTouchScreen() {
+ return impl->touch_screen.get();
+}
+
+const TouchScreen* InputSubsystem::GetTouchScreen() const {
+ return impl->touch_screen.get();
+}
+
TasInput::Tas* InputSubsystem::GetTas() {
- return impl->tas.get();
+ return impl->tas_input.get();
}
const TasInput::Tas* InputSubsystem::GetTas() const {
- return impl->tas.get();
+ return impl->tas_input.get();
}
std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const {
@@ -259,100 +377,30 @@ MotionMapping InputSubsystem::GetMotionMappingForDevice(const Common::ParamPacka
return impl->GetMotionMappingForDevice(device);
}
-GCAnalogFactory* InputSubsystem::GetGCAnalogs() {
- return impl->gcanalog.get();
-}
-
-const GCAnalogFactory* InputSubsystem::GetGCAnalogs() const {
- return impl->gcanalog.get();
-}
-
-GCButtonFactory* InputSubsystem::GetGCButtons() {
- return impl->gcbuttons.get();
-}
-
-const GCButtonFactory* InputSubsystem::GetGCButtons() const {
- return impl->gcbuttons.get();
-}
-
-UDPMotionFactory* InputSubsystem::GetUDPMotions() {
- return impl->udpmotion.get();
-}
-
-const UDPMotionFactory* InputSubsystem::GetUDPMotions() const {
- return impl->udpmotion.get();
-}
-
-UDPTouchFactory* InputSubsystem::GetUDPTouch() {
- return impl->udptouch.get();
-}
-
-const UDPTouchFactory* InputSubsystem::GetUDPTouch() const {
- return impl->udptouch.get();
-}
-
-MouseButtonFactory* InputSubsystem::GetMouseButtons() {
- return impl->mousebuttons.get();
+Common::Input::ButtonNames InputSubsystem::GetButtonName(const Common::ParamPackage& params) const {
+ return impl->GetButtonName(params);
}
-const MouseButtonFactory* InputSubsystem::GetMouseButtons() const {
- return impl->mousebuttons.get();
+bool InputSubsystem::IsController(const Common::ParamPackage& params) const {
+ return impl->IsController(params);
}
-MouseAnalogFactory* InputSubsystem::GetMouseAnalogs() {
- return impl->mouseanalog.get();
-}
-
-const MouseAnalogFactory* InputSubsystem::GetMouseAnalogs() const {
- return impl->mouseanalog.get();
-}
-
-MouseMotionFactory* InputSubsystem::GetMouseMotions() {
- return impl->mousemotion.get();
-}
-
-const MouseMotionFactory* InputSubsystem::GetMouseMotions() const {
- return impl->mousemotion.get();
-}
-
-MouseTouchFactory* InputSubsystem::GetMouseTouch() {
- return impl->mousetouch.get();
-}
-
-const MouseTouchFactory* InputSubsystem::GetMouseTouch() const {
- return impl->mousetouch.get();
-}
-
-TasButtonFactory* InputSubsystem::GetTasButtons() {
- return impl->tasbuttons.get();
-}
-
-const TasButtonFactory* InputSubsystem::GetTasButtons() const {
- return impl->tasbuttons.get();
-}
-
-TasAnalogFactory* InputSubsystem::GetTasAnalogs() {
- return impl->tasanalog.get();
+void InputSubsystem::ReloadInputDevices() {
+ impl->udp_client.get()->ReloadSockets();
}
-const TasAnalogFactory* InputSubsystem::GetTasAnalogs() const {
- return impl->tasanalog.get();
+void InputSubsystem::BeginMapping(Polling::InputType type) {
+ impl->BeginConfiguration();
+ impl->mapping_factory->BeginMapping(type);
}
-void InputSubsystem::ReloadInputDevices() {
- if (!impl->udp) {
- return;
- }
- impl->udp->ReloadSockets();
+const Common::ParamPackage InputSubsystem::GetNextInput() const {
+ return impl->mapping_factory->GetNextInput();
}
-std::vector<std::unique_ptr<Polling::DevicePoller>> InputSubsystem::GetPollers(
- [[maybe_unused]] Polling::DeviceType type) const {
-#ifdef HAVE_SDL2
- return impl->sdl->GetPollers(type);
-#else
- return {};
-#endif
+void InputSubsystem::StopMapping() const {
+ impl->EndConfiguration();
+ impl->mapping_factory->StopMapping();
}
std::string GenerateKeyboardParam(int key_code) {
diff --git a/src/input_common/main.h b/src/input_common/main.h
index 6390d3f09..c6f97f691 100644
--- a/src/input_common/main.h
+++ b/src/input_common/main.h
@@ -13,6 +13,10 @@ namespace Common {
class ParamPackage;
}
+namespace Common::Input {
+enum class ButtonNames;
+}
+
namespace Settings::NativeAnalog {
enum Values : int;
}
@@ -25,56 +29,26 @@ namespace Settings::NativeMotion {
enum Values : int;
}
-namespace MouseInput {
+namespace InputCommon {
+class Keyboard;
class Mouse;
-}
+class TouchScreen;
+struct MappingData;
+} // namespace InputCommon
-namespace TasInput {
+namespace InputCommon::TasInput {
class Tas;
-}
+} // namespace InputCommon::TasInput
namespace InputCommon {
namespace Polling {
-
-enum class DeviceType { Button, AnalogPreferred, Motion };
-
-/**
- * A class that can be used to get inputs from an input device like controllers without having to
- * poll the device's status yourself
- */
-class DevicePoller {
-public:
- virtual ~DevicePoller() = default;
- /// Setup and start polling for inputs, should be called before GetNextInput
- /// If a device_id is provided, events should be filtered to only include events from this
- /// device id
- virtual void Start(const std::string& device_id = "") = 0;
- /// Stop polling
- virtual void Stop() = 0;
- /**
- * Every call to this function returns the next input recorded since calling Start
- * @return A ParamPackage of the recorded input, which can be used to create an InputDevice.
- * If there has been no input, the package is empty
- */
- virtual Common::ParamPackage GetNextInput() = 0;
-};
+/// Type of input desired for mapping purposes
+enum class InputType { None, Button, Stick, Motion, Touch };
} // namespace Polling
-class GCAnalogFactory;
-class GCButtonFactory;
-class UDPMotionFactory;
-class UDPTouchFactory;
-class MouseButtonFactory;
-class MouseAnalogFactory;
-class MouseMotionFactory;
-class MouseTouchFactory;
-class TasButtonFactory;
-class TasAnalogFactory;
-class Keyboard;
-
/**
* Given a ParamPackage for a Device returned from `GetInputDevices`, attempt to get the default
- * mapping for the device. This is currently only implemented for the SDL backend devices.
+ * mapping for the device.
*/
using AnalogMapping = std::unordered_map<Settings::NativeAnalog::Values, Common::ParamPackage>;
using ButtonMapping = std::unordered_map<Settings::NativeButton::Values, Common::ParamPackage>;
@@ -104,20 +78,27 @@ public:
[[nodiscard]] const Keyboard* GetKeyboard() const;
/// Retrieves the underlying mouse device.
- [[nodiscard]] MouseInput::Mouse* GetMouse();
+ [[nodiscard]] Mouse* GetMouse();
/// Retrieves the underlying mouse device.
- [[nodiscard]] const MouseInput::Mouse* GetMouse() const;
+ [[nodiscard]] const Mouse* GetMouse() const;
+
+ /// Retrieves the underlying touch screen device.
+ [[nodiscard]] TouchScreen* GetTouchScreen();
- /// Retrieves the underlying tas device.
+ /// Retrieves the underlying touch screen device.
+ [[nodiscard]] const TouchScreen* GetTouchScreen() const;
+
+ /// Retrieves the underlying tas input device.
[[nodiscard]] TasInput::Tas* GetTas();
- /// Retrieves the underlying tas device.
+ /// Retrieves the underlying tas input device.
[[nodiscard]] const TasInput::Tas* GetTas() const;
+
/**
* Returns all available input devices that this Factory can create a new device with.
- * Each returned ParamPackage should have a `display` field used for display, a class field for
- * backends to determine if this backend is meant to service the request and any other
+ * Each returned ParamPackage should have a `display` field used for display, a `engine` field
+ * for backends to determine if this backend is meant to service the request and any other
* information needed to identify this in the backend later.
*/
[[nodiscard]] std::vector<Common::ParamPackage> GetInputDevices() const;
@@ -131,83 +112,34 @@ public:
/// Retrieves the motion mappings for the given device.
[[nodiscard]] MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& device) const;
- /// Retrieves the underlying GameCube analog handler.
- [[nodiscard]] GCAnalogFactory* GetGCAnalogs();
+ /// Returns an enum contaning the name to be displayed from the input engine.
+ [[nodiscard]] Common::Input::ButtonNames GetButtonName(
+ const Common::ParamPackage& params) const;
- /// Retrieves the underlying GameCube analog handler.
- [[nodiscard]] const GCAnalogFactory* GetGCAnalogs() const;
+ /// Returns true if device is a controller.
+ [[nodiscard]] bool IsController(const Common::ParamPackage& params) const;
- /// Retrieves the underlying GameCube button handler.
- [[nodiscard]] GCButtonFactory* GetGCButtons();
-
- /// Retrieves the underlying GameCube button handler.
- [[nodiscard]] const GCButtonFactory* GetGCButtons() const;
-
- /// Retrieves the underlying udp motion handler.
- [[nodiscard]] UDPMotionFactory* GetUDPMotions();
-
- /// Retrieves the underlying udp motion handler.
- [[nodiscard]] const UDPMotionFactory* GetUDPMotions() const;
-
- /// Retrieves the underlying udp touch handler.
- [[nodiscard]] UDPTouchFactory* GetUDPTouch();
-
- /// Retrieves the underlying udp touch handler.
- [[nodiscard]] const UDPTouchFactory* GetUDPTouch() const;
-
- /// Retrieves the underlying mouse button handler.
- [[nodiscard]] MouseButtonFactory* GetMouseButtons();
-
- /// Retrieves the underlying mouse button handler.
- [[nodiscard]] const MouseButtonFactory* GetMouseButtons() const;
-
- /// Retrieves the underlying mouse analog handler.
- [[nodiscard]] MouseAnalogFactory* GetMouseAnalogs();
-
- /// Retrieves the underlying mouse analog handler.
- [[nodiscard]] const MouseAnalogFactory* GetMouseAnalogs() const;
-
- /// Retrieves the underlying mouse motion handler.
- [[nodiscard]] MouseMotionFactory* GetMouseMotions();
-
- /// Retrieves the underlying mouse motion handler.
- [[nodiscard]] const MouseMotionFactory* GetMouseMotions() const;
-
- /// Retrieves the underlying mouse touch handler.
- [[nodiscard]] MouseTouchFactory* GetMouseTouch();
-
- /// Retrieves the underlying mouse touch handler.
- [[nodiscard]] const MouseTouchFactory* GetMouseTouch() const;
-
- /// Retrieves the underlying tas button handler.
- [[nodiscard]] TasButtonFactory* GetTasButtons();
-
- /// Retrieves the underlying tas button handler.
- [[nodiscard]] const TasButtonFactory* GetTasButtons() const;
-
- /// Retrieves the underlying tas analogs handler.
- [[nodiscard]] TasAnalogFactory* GetTasAnalogs();
+ /// Reloads the input devices.
+ void ReloadInputDevices();
- /// Retrieves the underlying tas analogs handler.
- [[nodiscard]] const TasAnalogFactory* GetTasAnalogs() const;
+ /// Start polling from all backends for a desired input type.
+ void BeginMapping(Polling::InputType type);
- /// Reloads the input devices
- void ReloadInputDevices();
+ /// Returns an input event with mapping information.
+ [[nodiscard]] const Common::ParamPackage GetNextInput() const;
- /// Get all DevicePoller from all backends for a specific device type
- [[nodiscard]] std::vector<std::unique_ptr<Polling::DevicePoller>> GetPollers(
- Polling::DeviceType type) const;
+ /// Stop polling from all backends.
+ void StopMapping() const;
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
-/// Generates a serialized param package for creating a keyboard button device
+/// Generates a serialized param package for creating a keyboard button device.
std::string GenerateKeyboardParam(int key_code);
-/// Generates a serialized param package for creating an analog device taking input from keyboard
+/// Generates a serialized param package for creating an analog device taking input from keyboard.
std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
int key_modifier, float modifier_scale);
-
} // namespace InputCommon
diff --git a/src/input_common/motion_from_button.cpp b/src/input_common/motion_from_button.cpp
deleted file mode 100644
index 29045a673..000000000
--- a/src/input_common/motion_from_button.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "input_common/motion_from_button.h"
-#include "input_common/motion_input.h"
-
-namespace InputCommon {
-
-class MotionKey final : public Input::MotionDevice {
-public:
- using Button = std::unique_ptr<Input::ButtonDevice>;
-
- explicit MotionKey(Button key_) : key(std::move(key_)) {}
-
- Input::MotionStatus GetStatus() const override {
-
- if (key->GetStatus()) {
- return motion.GetRandomMotion(2, 6);
- }
- return motion.GetRandomMotion(0, 0);
- }
-
-private:
- Button key;
- InputCommon::MotionInput motion{0.0f, 0.0f, 0.0f};
-};
-
-std::unique_ptr<Input::MotionDevice> MotionFromButton::Create(const Common::ParamPackage& params) {
- auto key = Input::CreateDevice<Input::ButtonDevice>(params.Serialize());
- return std::make_unique<MotionKey>(std::move(key));
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/motion_from_button.h b/src/input_common/motion_from_button.h
deleted file mode 100644
index a959046fb..000000000
--- a/src/input_common/motion_from_button.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include "core/frontend/input.h"
-
-namespace InputCommon {
-
-/**
- * An motion device factory that takes a keyboard button and uses it as a random
- * motion device.
- */
-class MotionFromButton final : public Input::Factory<Input::MotionDevice> {
-public:
- /**
- * Creates an motion device from button devices
- * @param params contains parameters for creating the device:
- * - "key": a serialized ParamPackage for creating a button device
- */
- std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
-};
-
-} // namespace InputCommon
diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp
deleted file mode 100644
index 3b052ffb2..000000000
--- a/src/input_common/mouse/mouse_input.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#include <stop_token>
-#include <thread>
-
-#include "common/settings.h"
-#include "input_common/mouse/mouse_input.h"
-
-namespace MouseInput {
-
-Mouse::Mouse() {
- update_thread = std::jthread([this](std::stop_token stop_token) { UpdateThread(stop_token); });
-}
-
-Mouse::~Mouse() = default;
-
-void Mouse::UpdateThread(std::stop_token stop_token) {
- constexpr int update_time = 10;
- while (!stop_token.stop_requested()) {
- for (MouseInfo& info : mouse_info) {
- const Common::Vec3f angular_direction{
- -info.tilt_direction.y,
- 0.0f,
- -info.tilt_direction.x,
- };
-
- info.motion.SetGyroscope(angular_direction * info.tilt_speed);
- info.motion.UpdateRotation(update_time * 1000);
- info.motion.UpdateOrientation(update_time * 1000);
- info.tilt_speed = 0;
- info.data.motion = info.motion.GetMotion();
- if (Settings::values.mouse_panning) {
- info.last_mouse_change *= 0.96f;
- info.data.axis = {static_cast<int>(16 * info.last_mouse_change.x),
- static_cast<int>(16 * -info.last_mouse_change.y)};
- }
- }
- if (configuring) {
- UpdateYuzuSettings();
- }
- if (mouse_panning_timout++ > 20) {
- StopPanning();
- }
- std::this_thread::sleep_for(std::chrono::milliseconds(update_time));
- }
-}
-
-void Mouse::UpdateYuzuSettings() {
- if (buttons == 0) {
- return;
- }
-
- mouse_queue.Push(MouseStatus{
- .button = last_button,
- });
-}
-
-void Mouse::PressButton(int x, int y, MouseButton button_) {
- const auto button_index = static_cast<std::size_t>(button_);
- if (button_index >= mouse_info.size()) {
- return;
- }
-
- const auto button = 1U << button_index;
- buttons |= static_cast<u16>(button);
- last_button = button_;
-
- mouse_info[button_index].mouse_origin = Common::MakeVec(x, y);
- mouse_info[button_index].last_mouse_position = Common::MakeVec(x, y);
- mouse_info[button_index].data.pressed = true;
-}
-
-void Mouse::StopPanning() {
- for (MouseInfo& info : mouse_info) {
- if (Settings::values.mouse_panning) {
- info.data.axis = {};
- info.tilt_speed = 0;
- info.last_mouse_change = {};
- }
- }
-}
-
-void Mouse::MouseMove(int x, int y, int center_x, int center_y) {
- for (MouseInfo& info : mouse_info) {
- if (Settings::values.mouse_panning) {
- auto mouse_change =
- (Common::MakeVec(x, y) - Common::MakeVec(center_x, center_y)).Cast<float>();
- mouse_panning_timout = 0;
-
- if (mouse_change.y == 0 && mouse_change.x == 0) {
- continue;
- }
- const auto mouse_change_length = mouse_change.Length();
- if (mouse_change_length < 3.0f) {
- mouse_change /= mouse_change_length / 3.0f;
- }
-
- info.last_mouse_change = (info.last_mouse_change * 0.91f) + (mouse_change * 0.09f);
-
- const auto last_mouse_change_length = info.last_mouse_change.Length();
- if (last_mouse_change_length > 8.0f) {
- info.last_mouse_change /= last_mouse_change_length / 8.0f;
- } else if (last_mouse_change_length < 1.0f) {
- info.last_mouse_change = mouse_change / mouse_change.Length();
- }
-
- info.tilt_direction = info.last_mouse_change;
- info.tilt_speed = info.tilt_direction.Normalize() * info.sensitivity;
- continue;
- }
-
- if (info.data.pressed) {
- const auto mouse_move = Common::MakeVec(x, y) - info.mouse_origin;
- const auto mouse_change = Common::MakeVec(x, y) - info.last_mouse_position;
- info.last_mouse_position = Common::MakeVec(x, y);
- info.data.axis = {mouse_move.x, -mouse_move.y};
-
- if (mouse_change.x == 0 && mouse_change.y == 0) {
- info.tilt_speed = 0;
- } else {
- info.tilt_direction = mouse_change.Cast<float>();
- info.tilt_speed = info.tilt_direction.Normalize() * info.sensitivity;
- }
- }
- }
-}
-
-void Mouse::ReleaseButton(MouseButton button_) {
- const auto button_index = static_cast<std::size_t>(button_);
- if (button_index >= mouse_info.size()) {
- return;
- }
-
- const auto button = 1U << button_index;
- buttons &= static_cast<u16>(0xFF - button);
-
- mouse_info[button_index].tilt_speed = 0;
- mouse_info[button_index].data.pressed = false;
- mouse_info[button_index].data.axis = {0, 0};
-}
-
-void Mouse::ReleaseAllButtons() {
- buttons = 0;
- for (auto& info : mouse_info) {
- info.tilt_speed = 0;
- info.data.pressed = false;
- info.data.axis = {0, 0};
- }
-}
-
-void Mouse::BeginConfiguration() {
- buttons = 0;
- last_button = MouseButton::Undefined;
- mouse_queue.Clear();
- configuring = true;
-}
-
-void Mouse::EndConfiguration() {
- buttons = 0;
- for (MouseInfo& info : mouse_info) {
- info.tilt_speed = 0;
- info.data.pressed = false;
- info.data.axis = {0, 0};
- }
- last_button = MouseButton::Undefined;
- mouse_queue.Clear();
- configuring = false;
-}
-
-bool Mouse::ToggleButton(std::size_t button_) {
- if (button_ >= mouse_info.size()) {
- return false;
- }
- const auto button = 1U << button_;
- const bool button_state = (toggle_buttons & button) != 0;
- const bool button_lock = (lock_buttons & button) != 0;
-
- if (button_lock) {
- return button_state;
- }
-
- lock_buttons |= static_cast<u16>(button);
-
- if (button_state) {
- toggle_buttons &= static_cast<u16>(0xFF - button);
- } else {
- toggle_buttons |= static_cast<u16>(button);
- }
-
- return !button_state;
-}
-
-bool Mouse::UnlockButton(std::size_t button_) {
- if (button_ >= mouse_info.size()) {
- return false;
- }
-
- const auto button = 1U << button_;
- const bool button_state = (toggle_buttons & button) != 0;
-
- lock_buttons &= static_cast<u16>(0xFF - button);
-
- return button_state;
-}
-
-Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() {
- return mouse_queue;
-}
-
-const Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() const {
- return mouse_queue;
-}
-
-MouseData& Mouse::GetMouseState(std::size_t button) {
- return mouse_info[button].data;
-}
-
-const MouseData& Mouse::GetMouseState(std::size_t button) const {
- return mouse_info[button].data;
-}
-} // namespace MouseInput
diff --git a/src/input_common/mouse/mouse_input.h b/src/input_common/mouse/mouse_input.h
deleted file mode 100644
index c8bae99c1..000000000
--- a/src/input_common/mouse/mouse_input.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <array>
-#include <mutex>
-#include <stop_token>
-#include <thread>
-
-#include "common/common_types.h"
-#include "common/threadsafe_queue.h"
-#include "common/vector_math.h"
-#include "core/frontend/input.h"
-#include "input_common/motion_input.h"
-
-namespace MouseInput {
-
-enum class MouseButton {
- Left,
- Right,
- Wheel,
- Backward,
- Forward,
- Task,
- Extra,
- Undefined,
-};
-
-struct MouseStatus {
- MouseButton button{MouseButton::Undefined};
-};
-
-struct MouseData {
- bool pressed{};
- std::array<int, 2> axis{};
- Input::MotionStatus motion{};
- Input::TouchStatus touch{};
-};
-
-class Mouse {
-public:
- Mouse();
- ~Mouse();
-
- /// Used for polling
- void BeginConfiguration();
- void EndConfiguration();
-
- /**
- * Signals that a button is pressed.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- * @param button_ the button pressed
- */
- void PressButton(int x, int y, MouseButton button_);
-
- /**
- * Signals that mouse has moved.
- * @param x the x-coordinate of the cursor
- * @param y the y-coordinate of the cursor
- * @param center_x the x-coordinate of the middle of the screen
- * @param center_y the y-coordinate of the middle of the screen
- */
- void MouseMove(int x, int y, int center_x, int center_y);
-
- /**
- * Signals that a button is released.
- * @param button_ the button pressed
- */
- void ReleaseButton(MouseButton button_);
-
- /**
- * Signals that all buttons are released
- */
- void ReleaseAllButtons();
-
- [[nodiscard]] bool ToggleButton(std::size_t button_);
- [[nodiscard]] bool UnlockButton(std::size_t button_);
-
- [[nodiscard]] Common::SPSCQueue<MouseStatus>& GetMouseQueue();
- [[nodiscard]] const Common::SPSCQueue<MouseStatus>& GetMouseQueue() const;
-
- [[nodiscard]] MouseData& GetMouseState(std::size_t button);
- [[nodiscard]] const MouseData& GetMouseState(std::size_t button) const;
-
-private:
- void UpdateThread(std::stop_token stop_token);
- void UpdateYuzuSettings();
- void StopPanning();
-
- struct MouseInfo {
- InputCommon::MotionInput motion{0.0f, 0.0f, 0.0f};
- Common::Vec2<int> mouse_origin;
- Common::Vec2<int> last_mouse_position;
- Common::Vec2<float> last_mouse_change;
- bool is_tilting = false;
- float sensitivity{0.120f};
-
- float tilt_speed = 0;
- Common::Vec2<float> tilt_direction;
- MouseData data;
- };
-
- u16 buttons{};
- u16 toggle_buttons{};
- u16 lock_buttons{};
- std::jthread update_thread;
- MouseButton last_button{MouseButton::Undefined};
- std::array<MouseInfo, 7> mouse_info;
- Common::SPSCQueue<MouseStatus> mouse_queue;
- bool configuring{false};
- int mouse_panning_timout{};
-};
-} // namespace MouseInput
diff --git a/src/input_common/mouse/mouse_poller.cpp b/src/input_common/mouse/mouse_poller.cpp
deleted file mode 100644
index 090b26972..000000000
--- a/src/input_common/mouse/mouse_poller.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <algorithm>
-#include <memory>
-#include <mutex>
-#include <utility>
-
-#include "common/settings.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/mouse/mouse_input.h"
-#include "input_common/mouse/mouse_poller.h"
-
-namespace InputCommon {
-
-class MouseButton final : public Input::ButtonDevice {
-public:
- explicit MouseButton(u32 button_, bool toggle_, MouseInput::Mouse* mouse_input_)
- : button(button_), toggle(toggle_), mouse_input(mouse_input_) {}
-
- bool GetStatus() const override {
- const bool button_state = mouse_input->GetMouseState(button).pressed;
- if (!toggle) {
- return button_state;
- }
-
- if (button_state) {
- return mouse_input->ToggleButton(button);
- }
- return mouse_input->UnlockButton(button);
- }
-
-private:
- const u32 button;
- const bool toggle;
- MouseInput::Mouse* mouse_input;
-};
-
-MouseButtonFactory::MouseButtonFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_)
- : mouse_input(std::move(mouse_input_)) {}
-
-std::unique_ptr<Input::ButtonDevice> MouseButtonFactory::Create(
- const Common::ParamPackage& params) {
- const auto button_id = params.Get("button", 0);
- const auto toggle = params.Get("toggle", false);
-
- return std::make_unique<MouseButton>(button_id, toggle, mouse_input.get());
-}
-
-Common::ParamPackage MouseButtonFactory::GetNextInput() const {
- MouseInput::MouseStatus pad;
- Common::ParamPackage params;
- auto& queue = mouse_input->GetMouseQueue();
- while (queue.Pop(pad)) {
- // This while loop will break on the earliest detected button
- if (pad.button != MouseInput::MouseButton::Undefined) {
- params.Set("engine", "mouse");
- params.Set("button", static_cast<u16>(pad.button));
- params.Set("toggle", false);
- return params;
- }
- }
- return params;
-}
-
-void MouseButtonFactory::BeginConfiguration() {
- polling = true;
- mouse_input->BeginConfiguration();
-}
-
-void MouseButtonFactory::EndConfiguration() {
- polling = false;
- mouse_input->EndConfiguration();
-}
-
-class MouseAnalog final : public Input::AnalogDevice {
-public:
- explicit MouseAnalog(u32 port_, u32 axis_x_, u32 axis_y_, bool invert_x_, bool invert_y_,
- float deadzone_, float range_, const MouseInput::Mouse* mouse_input_)
- : button(port_), axis_x(axis_x_), axis_y(axis_y_), invert_x(invert_x_), invert_y(invert_y_),
- deadzone(deadzone_), range(range_), mouse_input(mouse_input_) {}
-
- float GetAxis(u32 axis) const {
- std::lock_guard lock{mutex};
- const auto axis_value =
- static_cast<float>(mouse_input->GetMouseState(button).axis.at(axis));
- const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue() * 0.10f;
- return axis_value * sensitivity / (100.0f * range);
- }
-
- std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
- float x = GetAxis(analog_axis_x);
- float y = GetAxis(analog_axis_y);
- if (invert_x) {
- x = -x;
- }
- if (invert_y) {
- y = -y;
- }
-
- // Make sure the coordinates are in the unit circle,
- // otherwise normalize it.
- float r = x * x + y * y;
- if (r > 1.0f) {
- r = std::sqrt(r);
- x /= r;
- y /= r;
- }
-
- return {x, y};
- }
-
- std::tuple<float, float> GetStatus() const override {
- const auto [x, y] = GetAnalog(axis_x, axis_y);
- const float r = std::sqrt((x * x) + (y * y));
- if (r > deadzone) {
- return {x / r * (r - deadzone) / (1 - deadzone),
- y / r * (r - deadzone) / (1 - deadzone)};
- }
- return {0.0f, 0.0f};
- }
-
- std::tuple<float, float> GetRawStatus() const override {
- const float x = GetAxis(axis_x);
- const float y = GetAxis(axis_y);
- return {x, y};
- }
-
- Input::AnalogProperties GetAnalogProperties() const override {
- return {deadzone, range, 0.5f};
- }
-
-private:
- const u32 button;
- const u32 axis_x;
- const u32 axis_y;
- const bool invert_x;
- const bool invert_y;
- const float deadzone;
- const float range;
- const MouseInput::Mouse* mouse_input;
- mutable std::mutex mutex;
-};
-
-/// An analog device factory that creates analog devices from GC Adapter
-MouseAnalogFactory::MouseAnalogFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_)
- : mouse_input(std::move(mouse_input_)) {}
-
-/**
- * Creates analog device from joystick axes
- * @param params contains parameters for creating the device:
- * - "port": the nth gcpad on the adapter
- * - "axis_x": the index of the axis to be bind as x-axis
- * - "axis_y": the index of the axis to be bind as y-axis
- */
-std::unique_ptr<Input::AnalogDevice> MouseAnalogFactory::Create(
- const Common::ParamPackage& params) {
- const auto port = static_cast<u32>(params.Get("port", 0));
- const auto axis_x = static_cast<u32>(params.Get("axis_x", 0));
- const auto axis_y = static_cast<u32>(params.Get("axis_y", 1));
- const auto deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
- const auto range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f);
- const std::string invert_x_value = params.Get("invert_x", "+");
- const std::string invert_y_value = params.Get("invert_y", "+");
- const bool invert_x = invert_x_value == "-";
- const bool invert_y = invert_y_value == "-";
-
- return std::make_unique<MouseAnalog>(port, axis_x, axis_y, invert_x, invert_y, deadzone, range,
- mouse_input.get());
-}
-
-void MouseAnalogFactory::BeginConfiguration() {
- polling = true;
- mouse_input->BeginConfiguration();
-}
-
-void MouseAnalogFactory::EndConfiguration() {
- polling = false;
- mouse_input->EndConfiguration();
-}
-
-Common::ParamPackage MouseAnalogFactory::GetNextInput() const {
- MouseInput::MouseStatus pad;
- Common::ParamPackage params;
- auto& queue = mouse_input->GetMouseQueue();
- while (queue.Pop(pad)) {
- // This while loop will break on the earliest detected button
- if (pad.button != MouseInput::MouseButton::Undefined) {
- params.Set("engine", "mouse");
- params.Set("port", static_cast<u16>(pad.button));
- params.Set("axis_x", 0);
- params.Set("axis_y", 1);
- params.Set("invert_x", "+");
- params.Set("invert_y", "+");
- return params;
- }
- }
- return params;
-}
-
-class MouseMotion final : public Input::MotionDevice {
-public:
- explicit MouseMotion(u32 button_, const MouseInput::Mouse* mouse_input_)
- : button(button_), mouse_input(mouse_input_) {}
-
- Input::MotionStatus GetStatus() const override {
- return mouse_input->GetMouseState(button).motion;
- }
-
-private:
- const u32 button;
- const MouseInput::Mouse* mouse_input;
-};
-
-MouseMotionFactory::MouseMotionFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_)
- : mouse_input(std::move(mouse_input_)) {}
-
-std::unique_ptr<Input::MotionDevice> MouseMotionFactory::Create(
- const Common::ParamPackage& params) {
- const auto button_id = params.Get("button", 0);
-
- return std::make_unique<MouseMotion>(button_id, mouse_input.get());
-}
-
-Common::ParamPackage MouseMotionFactory::GetNextInput() const {
- MouseInput::MouseStatus pad;
- Common::ParamPackage params;
- auto& queue = mouse_input->GetMouseQueue();
- while (queue.Pop(pad)) {
- // This while loop will break on the earliest detected button
- if (pad.button != MouseInput::MouseButton::Undefined) {
- params.Set("engine", "mouse");
- params.Set("button", static_cast<u16>(pad.button));
- return params;
- }
- }
- return params;
-}
-
-void MouseMotionFactory::BeginConfiguration() {
- polling = true;
- mouse_input->BeginConfiguration();
-}
-
-void MouseMotionFactory::EndConfiguration() {
- polling = false;
- mouse_input->EndConfiguration();
-}
-
-class MouseTouch final : public Input::TouchDevice {
-public:
- explicit MouseTouch(u32 button_, const MouseInput::Mouse* mouse_input_)
- : button(button_), mouse_input(mouse_input_) {}
-
- Input::TouchStatus GetStatus() const override {
- return mouse_input->GetMouseState(button).touch;
- }
-
-private:
- const u32 button;
- const MouseInput::Mouse* mouse_input;
-};
-
-MouseTouchFactory::MouseTouchFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_)
- : mouse_input(std::move(mouse_input_)) {}
-
-std::unique_ptr<Input::TouchDevice> MouseTouchFactory::Create(const Common::ParamPackage& params) {
- const auto button_id = params.Get("button", 0);
-
- return std::make_unique<MouseTouch>(button_id, mouse_input.get());
-}
-
-Common::ParamPackage MouseTouchFactory::GetNextInput() const {
- MouseInput::MouseStatus pad;
- Common::ParamPackage params;
- auto& queue = mouse_input->GetMouseQueue();
- while (queue.Pop(pad)) {
- // This while loop will break on the earliest detected button
- if (pad.button != MouseInput::MouseButton::Undefined) {
- params.Set("engine", "mouse");
- params.Set("button", static_cast<u16>(pad.button));
- return params;
- }
- }
- return params;
-}
-
-void MouseTouchFactory::BeginConfiguration() {
- polling = true;
- mouse_input->BeginConfiguration();
-}
-
-void MouseTouchFactory::EndConfiguration() {
- polling = false;
- mouse_input->EndConfiguration();
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/mouse/mouse_poller.h b/src/input_common/mouse/mouse_poller.h
deleted file mode 100644
index cf331293b..000000000
--- a/src/input_common/mouse/mouse_poller.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include "core/frontend/input.h"
-#include "input_common/mouse/mouse_input.h"
-
-namespace InputCommon {
-
-/**
- * A button device factory representing a mouse. It receives mouse events and forward them
- * to all button devices it created.
- */
-class MouseButtonFactory final : public Input::Factory<Input::ButtonDevice> {
-public:
- explicit MouseButtonFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_);
-
- /**
- * Creates a button device from a button press
- * @param params contains parameters for creating the device:
- * - "code": the code of the key to bind with the button
- */
- std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput() const;
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<MouseInput::Mouse> mouse_input;
- bool polling = false;
-};
-
-/// An analog device factory that creates analog devices from mouse
-class MouseAnalogFactory final : public Input::Factory<Input::AnalogDevice> {
-public:
- explicit MouseAnalogFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_);
-
- std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput() const;
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<MouseInput::Mouse> mouse_input;
- bool polling = false;
-};
-
-/// A motion device factory that creates motion devices from mouse
-class MouseMotionFactory final : public Input::Factory<Input::MotionDevice> {
-public:
- explicit MouseMotionFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_);
-
- std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput() const;
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<MouseInput::Mouse> mouse_input;
- bool polling = false;
-};
-
-/// An touch device factory that creates touch devices from mouse
-class MouseTouchFactory final : public Input::Factory<Input::TouchDevice> {
-public:
- explicit MouseTouchFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_);
-
- std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput() const;
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<MouseInput::Mouse> mouse_input;
- bool polling = false;
-};
-
-} // namespace InputCommon
diff --git a/src/input_common/sdl/sdl.cpp b/src/input_common/sdl/sdl.cpp
deleted file mode 100644
index 644db3448..000000000
--- a/src/input_common/sdl/sdl.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include "input_common/sdl/sdl.h"
-#ifdef HAVE_SDL2
-#include "input_common/sdl/sdl_impl.h"
-#endif
-
-namespace InputCommon::SDL {
-
-std::unique_ptr<State> Init() {
-#ifdef HAVE_SDL2
- return std::make_unique<SDLState>();
-#else
- return std::make_unique<NullState>();
-#endif
-}
-} // namespace InputCommon::SDL
diff --git a/src/input_common/sdl/sdl.h b/src/input_common/sdl/sdl.h
deleted file mode 100644
index b5d41bba4..000000000
--- a/src/input_common/sdl/sdl.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include <vector>
-#include "common/param_package.h"
-#include "input_common/main.h"
-
-namespace InputCommon::Polling {
-class DevicePoller;
-enum class DeviceType;
-} // namespace InputCommon::Polling
-
-namespace InputCommon::SDL {
-
-class State {
-public:
- using Pollers = std::vector<std::unique_ptr<Polling::DevicePoller>>;
-
- /// Unregisters SDL device factories and shut them down.
- virtual ~State() = default;
-
- virtual Pollers GetPollers(Polling::DeviceType) {
- return {};
- }
-
- virtual std::vector<Common::ParamPackage> GetInputDevices() {
- return {};
- }
-
- virtual ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage&) {
- return {};
- }
- virtual AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage&) {
- return {};
- }
- virtual MotionMapping GetMotionMappingForDevice(const Common::ParamPackage&) {
- return {};
- }
-};
-
-class NullState : public State {
-public:
-};
-
-std::unique_ptr<State> Init();
-
-} // namespace InputCommon::SDL
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp
deleted file mode 100644
index ecb00d428..000000000
--- a/src/input_common/sdl/sdl_impl.cpp
+++ /dev/null
@@ -1,1658 +0,0 @@
-// Copyright 2018 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <algorithm>
-#include <array>
-#include <atomic>
-#include <chrono>
-#include <cmath>
-#include <functional>
-#include <mutex>
-#include <optional>
-#include <sstream>
-#include <string>
-#include <thread>
-#include <tuple>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-#include "common/logging/log.h"
-#include "common/math_util.h"
-#include "common/param_package.h"
-#include "common/settings.h"
-#include "common/threadsafe_queue.h"
-#include "core/frontend/input.h"
-#include "input_common/motion_input.h"
-#include "input_common/sdl/sdl_impl.h"
-
-namespace InputCommon::SDL {
-
-namespace {
-std::string GetGUID(SDL_Joystick* joystick) {
- const SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick);
- char guid_str[33];
- SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str));
- return guid_str;
-}
-
-/// Creates a ParamPackage from an SDL_Event that can directly be used to create a ButtonDevice
-Common::ParamPackage SDLEventToButtonParamPackage(SDLState& state, const SDL_Event& event);
-} // Anonymous namespace
-
-static int SDLEventWatcher(void* user_data, SDL_Event* event) {
- auto* const sdl_state = static_cast<SDLState*>(user_data);
-
- // Don't handle the event if we are configuring
- if (sdl_state->polling) {
- sdl_state->event_queue.Push(*event);
- } else {
- sdl_state->HandleGameControllerEvent(*event);
- }
-
- return 0;
-}
-
-class SDLJoystick {
-public:
- SDLJoystick(std::string guid_, int port_, SDL_Joystick* joystick,
- SDL_GameController* game_controller)
- : guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose},
- sdl_controller{game_controller, &SDL_GameControllerClose} {
- EnableMotion();
- }
-
- void EnableMotion() {
- if (sdl_controller) {
- SDL_GameController* controller = sdl_controller.get();
- if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) && !has_accel) {
- SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE);
- has_accel = true;
- }
- if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) && !has_gyro) {
- SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE);
- has_gyro = true;
- }
- }
- }
-
- void SetButton(int button, bool value) {
- std::lock_guard lock{mutex};
- state.buttons.insert_or_assign(button, value);
- }
-
- void PreSetButton(int button) {
- if (!state.buttons.contains(button)) {
- SetButton(button, false);
- }
- }
-
- void SetMotion(SDL_ControllerSensorEvent event) {
- constexpr float gravity_constant = 9.80665f;
- std::lock_guard lock{mutex};
- u64 time_difference = event.timestamp - last_motion_update;
- last_motion_update = event.timestamp;
- switch (event.sensor) {
- case SDL_SENSOR_ACCEL: {
- const Common::Vec3f acceleration = {-event.data[0], event.data[2], -event.data[1]};
- motion.SetAcceleration(acceleration / gravity_constant);
- break;
- }
- case SDL_SENSOR_GYRO: {
- const Common::Vec3f gyroscope = {event.data[0], -event.data[2], event.data[1]};
- motion.SetGyroscope(gyroscope / (Common::PI * 2));
- break;
- }
- }
-
- // Ignore duplicated timestamps
- if (time_difference == 0) {
- return;
- }
-
- motion.SetGyroThreshold(0.0001f);
- motion.UpdateRotation(time_difference * 1000);
- motion.UpdateOrientation(time_difference * 1000);
- }
-
- bool GetButton(int button) const {
- std::lock_guard lock{mutex};
- return state.buttons.at(button);
- }
-
- bool ToggleButton(int button) {
- std::lock_guard lock{mutex};
-
- if (!state.toggle_buttons.contains(button) || !state.lock_buttons.contains(button)) {
- state.toggle_buttons.insert_or_assign(button, false);
- state.lock_buttons.insert_or_assign(button, false);
- }
-
- const bool button_state = state.toggle_buttons.at(button);
- const bool button_lock = state.lock_buttons.at(button);
-
- if (button_lock) {
- return button_state;
- }
-
- state.lock_buttons.insert_or_assign(button, true);
-
- if (button_state) {
- state.toggle_buttons.insert_or_assign(button, false);
- } else {
- state.toggle_buttons.insert_or_assign(button, true);
- }
-
- return !button_state;
- }
-
- bool UnlockButton(int button) {
- std::lock_guard lock{mutex};
- if (!state.toggle_buttons.contains(button)) {
- return false;
- }
- state.lock_buttons.insert_or_assign(button, false);
- return state.toggle_buttons.at(button);
- }
-
- void SetAxis(int axis, Sint16 value) {
- std::lock_guard lock{mutex};
- state.axes.insert_or_assign(axis, value);
- }
-
- void PreSetAxis(int axis) {
- if (!state.axes.contains(axis)) {
- SetAxis(axis, 0);
- }
- }
-
- float GetAxis(int axis, float range, float offset) const {
- std::lock_guard lock{mutex};
- const float value = static_cast<float>(state.axes.at(axis)) / 32767.0f;
- const float offset_scale = (value + offset) > 0.0f ? 1.0f + offset : 1.0f - offset;
- return (value + offset) / range / offset_scale;
- }
-
- bool RumblePlay(u16 amp_low, u16 amp_high) {
- constexpr u32 rumble_max_duration_ms = 1000;
-
- if (sdl_controller) {
- return SDL_GameControllerRumble(sdl_controller.get(), amp_low, amp_high,
- rumble_max_duration_ms) != -1;
- } else if (sdl_joystick) {
- return SDL_JoystickRumble(sdl_joystick.get(), amp_low, amp_high,
- rumble_max_duration_ms) != -1;
- }
-
- return false;
- }
-
- std::tuple<float, float> GetAnalog(int axis_x, int axis_y, float range, float offset_x,
- float offset_y) const {
- float x = GetAxis(axis_x, range, offset_x);
- float y = GetAxis(axis_y, range, offset_y);
- y = -y; // 3DS uses an y-axis inverse from SDL
-
- // Make sure the coordinates are in the unit circle,
- // otherwise normalize it.
- float r = x * x + y * y;
- if (r > 1.0f) {
- r = std::sqrt(r);
- x /= r;
- y /= r;
- }
-
- return std::make_tuple(x, y);
- }
-
- bool HasGyro() const {
- return has_gyro;
- }
-
- bool HasAccel() const {
- return has_accel;
- }
-
- const MotionInput& GetMotion() const {
- return motion;
- }
-
- void SetHat(int hat, Uint8 direction) {
- std::lock_guard lock{mutex};
- state.hats.insert_or_assign(hat, direction);
- }
-
- bool GetHatDirection(int hat, Uint8 direction) const {
- std::lock_guard lock{mutex};
- return (state.hats.at(hat) & direction) != 0;
- }
- /**
- * The guid of the joystick
- */
- const std::string& GetGUID() const {
- return guid;
- }
-
- /**
- * The number of joystick from the same type that were connected before this joystick
- */
- int GetPort() const {
- return port;
- }
-
- SDL_Joystick* GetSDLJoystick() const {
- return sdl_joystick.get();
- }
-
- SDL_GameController* GetSDLGameController() const {
- return sdl_controller.get();
- }
-
- void SetSDLJoystick(SDL_Joystick* joystick, SDL_GameController* controller) {
- sdl_joystick.reset(joystick);
- sdl_controller.reset(controller);
- }
-
- bool IsJoyconLeft() const {
- const std::string controller_name = GetControllerName();
- if (std::strstr(controller_name.c_str(), "Joy-Con Left") != nullptr) {
- return true;
- }
- if (std::strstr(controller_name.c_str(), "Joy-Con (L)") != nullptr) {
- return true;
- }
- return false;
- }
-
- bool IsJoyconRight() const {
- const std::string controller_name = GetControllerName();
- if (std::strstr(controller_name.c_str(), "Joy-Con Right") != nullptr) {
- return true;
- }
- if (std::strstr(controller_name.c_str(), "Joy-Con (R)") != nullptr) {
- return true;
- }
- return false;
- }
-
- std::string GetControllerName() const {
- if (sdl_controller) {
- switch (SDL_GameControllerGetType(sdl_controller.get())) {
- case SDL_CONTROLLER_TYPE_XBOX360:
- return "XBox 360 Controller";
- case SDL_CONTROLLER_TYPE_XBOXONE:
- return "XBox One Controller";
- default:
- break;
- }
- const auto name = SDL_GameControllerName(sdl_controller.get());
- if (name) {
- return name;
- }
- }
-
- if (sdl_joystick) {
- const auto name = SDL_JoystickName(sdl_joystick.get());
- if (name) {
- return name;
- }
- }
-
- return "Unknown";
- }
-
-private:
- struct State {
- std::unordered_map<int, bool> buttons;
- std::unordered_map<int, bool> toggle_buttons{};
- std::unordered_map<int, bool> lock_buttons{};
- std::unordered_map<int, Sint16> axes;
- std::unordered_map<int, Uint8> hats;
- } state;
- std::string guid;
- int port;
- std::unique_ptr<SDL_Joystick, decltype(&SDL_JoystickClose)> sdl_joystick;
- std::unique_ptr<SDL_GameController, decltype(&SDL_GameControllerClose)> sdl_controller;
- mutable std::mutex mutex;
-
- // Motion is initialized with the PID values
- MotionInput motion{0.3f, 0.005f, 0.0f};
- u64 last_motion_update{};
- bool has_gyro{false};
- bool has_accel{false};
-};
-
-std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickByGUID(const std::string& guid, int port) {
- std::lock_guard lock{joystick_map_mutex};
- const auto it = joystick_map.find(guid);
-
- if (it != joystick_map.end()) {
- while (it->second.size() <= static_cast<std::size_t>(port)) {
- auto joystick = std::make_shared<SDLJoystick>(guid, static_cast<int>(it->second.size()),
- nullptr, nullptr);
- it->second.emplace_back(std::move(joystick));
- }
-
- return it->second[static_cast<std::size_t>(port)];
- }
-
- auto joystick = std::make_shared<SDLJoystick>(guid, 0, nullptr, nullptr);
-
- return joystick_map[guid].emplace_back(std::move(joystick));
-}
-
-std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickBySDLID(SDL_JoystickID sdl_id) {
- auto sdl_joystick = SDL_JoystickFromInstanceID(sdl_id);
- const std::string guid = GetGUID(sdl_joystick);
-
- std::lock_guard lock{joystick_map_mutex};
- const auto map_it = joystick_map.find(guid);
-
- if (map_it == joystick_map.end()) {
- return nullptr;
- }
-
- const auto vec_it = std::find_if(map_it->second.begin(), map_it->second.end(),
- [&sdl_joystick](const auto& joystick) {
- return joystick->GetSDLJoystick() == sdl_joystick;
- });
-
- if (vec_it == map_it->second.end()) {
- return nullptr;
- }
-
- return *vec_it;
-}
-
-void SDLState::InitJoystick(int joystick_index) {
- SDL_Joystick* sdl_joystick = SDL_JoystickOpen(joystick_index);
- SDL_GameController* sdl_gamecontroller = nullptr;
-
- if (SDL_IsGameController(joystick_index)) {
- sdl_gamecontroller = SDL_GameControllerOpen(joystick_index);
- }
-
- if (!sdl_joystick) {
- LOG_ERROR(Input, "Failed to open joystick {}", joystick_index);
- return;
- }
-
- const std::string guid = GetGUID(sdl_joystick);
-
- std::lock_guard lock{joystick_map_mutex};
- if (joystick_map.find(guid) == joystick_map.end()) {
- auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller);
- joystick_map[guid].emplace_back(std::move(joystick));
- return;
- }
-
- auto& joystick_guid_list = joystick_map[guid];
- const auto joystick_it =
- std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
- [](const auto& joystick) { return !joystick->GetSDLJoystick(); });
-
- if (joystick_it != joystick_guid_list.end()) {
- (*joystick_it)->SetSDLJoystick(sdl_joystick, sdl_gamecontroller);
- return;
- }
-
- const int port = static_cast<int>(joystick_guid_list.size());
- auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller);
- joystick_guid_list.emplace_back(std::move(joystick));
-}
-
-void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) {
- const std::string guid = GetGUID(sdl_joystick);
-
- std::lock_guard lock{joystick_map_mutex};
- // This call to guid is safe since the joystick is guaranteed to be in the map
- const auto& joystick_guid_list = joystick_map[guid];
- const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(),
- [&sdl_joystick](const auto& joystick) {
- return joystick->GetSDLJoystick() == sdl_joystick;
- });
-
- if (joystick_it != joystick_guid_list.end()) {
- (*joystick_it)->SetSDLJoystick(nullptr, nullptr);
- }
-}
-
-void SDLState::HandleGameControllerEvent(const SDL_Event& event) {
- switch (event.type) {
- case SDL_JOYBUTTONUP: {
- if (auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) {
- joystick->SetButton(event.jbutton.button, false);
- }
- break;
- }
- case SDL_JOYBUTTONDOWN: {
- if (auto joystick = GetSDLJoystickBySDLID(event.jbutton.which)) {
- joystick->SetButton(event.jbutton.button, true);
- }
- break;
- }
- case SDL_JOYHATMOTION: {
- if (auto joystick = GetSDLJoystickBySDLID(event.jhat.which)) {
- joystick->SetHat(event.jhat.hat, event.jhat.value);
- }
- break;
- }
- case SDL_JOYAXISMOTION: {
- if (auto joystick = GetSDLJoystickBySDLID(event.jaxis.which)) {
- joystick->SetAxis(event.jaxis.axis, event.jaxis.value);
- }
- break;
- }
- case SDL_CONTROLLERSENSORUPDATE: {
- if (auto joystick = GetSDLJoystickBySDLID(event.csensor.which)) {
- joystick->SetMotion(event.csensor);
- }
- break;
- }
- case SDL_JOYDEVICEREMOVED:
- LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which);
- CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which));
- break;
- case SDL_JOYDEVICEADDED:
- LOG_DEBUG(Input, "Controller connected with device index {}", event.jdevice.which);
- InitJoystick(event.jdevice.which);
- break;
- }
-}
-
-void SDLState::CloseJoysticks() {
- std::lock_guard lock{joystick_map_mutex};
- joystick_map.clear();
-}
-
-class SDLButton final : public Input::ButtonDevice {
-public:
- explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_, bool toggle_)
- : joystick(std::move(joystick_)), button(button_), toggle(toggle_) {}
-
- bool GetStatus() const override {
- const bool button_state = joystick->GetButton(button);
- if (!toggle) {
- return button_state;
- }
-
- if (button_state) {
- return joystick->ToggleButton(button);
- }
- return joystick->UnlockButton(button);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int button;
- bool toggle;
-};
-
-class SDLDirectionButton final : public Input::ButtonDevice {
-public:
- explicit SDLDirectionButton(std::shared_ptr<SDLJoystick> joystick_, int hat_, Uint8 direction_)
- : joystick(std::move(joystick_)), hat(hat_), direction(direction_) {}
-
- bool GetStatus() const override {
- return joystick->GetHatDirection(hat, direction);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int hat;
- Uint8 direction;
-};
-
-class SDLAxisButton final : public Input::ButtonDevice {
-public:
- explicit SDLAxisButton(std::shared_ptr<SDLJoystick> joystick_, int axis_, float threshold_,
- bool trigger_if_greater_)
- : joystick(std::move(joystick_)), axis(axis_), threshold(threshold_),
- trigger_if_greater(trigger_if_greater_) {}
-
- bool GetStatus() const override {
- const float axis_value = joystick->GetAxis(axis, 1.0f, 0.0f);
- if (trigger_if_greater) {
- return axis_value > threshold;
- }
- return axis_value < threshold;
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int axis;
- float threshold;
- bool trigger_if_greater;
-};
-
-class SDLAnalog final : public Input::AnalogDevice {
-public:
- explicit SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_,
- bool invert_x_, bool invert_y_, float deadzone_, float range_,
- float offset_x_, float offset_y_)
- : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), invert_x(invert_x_),
- invert_y(invert_y_), deadzone(deadzone_), range(range_), offset_x(offset_x_),
- offset_y(offset_y_) {}
-
- std::tuple<float, float> GetStatus() const override {
- auto [x, y] = joystick->GetAnalog(axis_x, axis_y, range, offset_x, offset_y);
- const float r = std::sqrt((x * x) + (y * y));
- if (invert_x) {
- x = -x;
- }
- if (invert_y) {
- y = -y;
- }
-
- if (r > deadzone) {
- return std::make_tuple(x / r * (r - deadzone) / (1 - deadzone),
- y / r * (r - deadzone) / (1 - deadzone));
- }
- return {};
- }
-
- std::tuple<float, float> GetRawStatus() const override {
- const float x = joystick->GetAxis(axis_x, range, offset_x);
- const float y = joystick->GetAxis(axis_y, range, offset_y);
- return {x, -y};
- }
-
- Input::AnalogProperties GetAnalogProperties() const override {
- return {deadzone, range, 0.5f};
- }
-
- bool GetAnalogDirectionStatus(Input::AnalogDirection direction) const override {
- const auto [x, y] = GetStatus();
- const float directional_deadzone = 0.5f;
- switch (direction) {
- case Input::AnalogDirection::RIGHT:
- return x > directional_deadzone;
- case Input::AnalogDirection::LEFT:
- return x < -directional_deadzone;
- case Input::AnalogDirection::UP:
- return y > directional_deadzone;
- case Input::AnalogDirection::DOWN:
- return y < -directional_deadzone;
- }
- return false;
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- const int axis_x;
- const int axis_y;
- const bool invert_x;
- const bool invert_y;
- const float deadzone;
- const float range;
- const float offset_x;
- const float offset_y;
-};
-
-class SDLVibration final : public Input::VibrationDevice {
-public:
- explicit SDLVibration(std::shared_ptr<SDLJoystick> joystick_)
- : joystick(std::move(joystick_)) {}
-
- u8 GetStatus() const override {
- joystick->RumblePlay(1, 1);
- return joystick->RumblePlay(0, 0);
- }
-
- bool SetRumblePlay(f32 amp_low, [[maybe_unused]] f32 freq_low, f32 amp_high,
- [[maybe_unused]] f32 freq_high) const override {
- const auto process_amplitude = [](f32 amplitude) {
- return static_cast<u16>((amplitude + std::pow(amplitude, 0.3f)) * 0.5f * 0xFFFF);
- };
-
- const auto processed_amp_low = process_amplitude(amp_low);
- const auto processed_amp_high = process_amplitude(amp_high);
-
- return joystick->RumblePlay(processed_amp_low, processed_amp_high);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
-};
-
-class SDLMotion final : public Input::MotionDevice {
-public:
- explicit SDLMotion(std::shared_ptr<SDLJoystick> joystick_) : joystick(std::move(joystick_)) {}
-
- Input::MotionStatus GetStatus() const override {
- return joystick->GetMotion().GetMotion();
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
-};
-
-class SDLDirectionMotion final : public Input::MotionDevice {
-public:
- explicit SDLDirectionMotion(std::shared_ptr<SDLJoystick> joystick_, int hat_, Uint8 direction_)
- : joystick(std::move(joystick_)), hat(hat_), direction(direction_) {}
-
- Input::MotionStatus GetStatus() const override {
- if (joystick->GetHatDirection(hat, direction)) {
- return joystick->GetMotion().GetRandomMotion(2, 6);
- }
- return joystick->GetMotion().GetRandomMotion(0, 0);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int hat;
- Uint8 direction;
-};
-
-class SDLAxisMotion final : public Input::MotionDevice {
-public:
- explicit SDLAxisMotion(std::shared_ptr<SDLJoystick> joystick_, int axis_, float threshold_,
- bool trigger_if_greater_)
- : joystick(std::move(joystick_)), axis(axis_), threshold(threshold_),
- trigger_if_greater(trigger_if_greater_) {}
-
- Input::MotionStatus GetStatus() const override {
- const float axis_value = joystick->GetAxis(axis, 1.0f, 0.0f);
- bool trigger = axis_value < threshold;
- if (trigger_if_greater) {
- trigger = axis_value > threshold;
- }
-
- if (trigger) {
- return joystick->GetMotion().GetRandomMotion(2, 6);
- }
- return joystick->GetMotion().GetRandomMotion(0, 0);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int axis;
- float threshold;
- bool trigger_if_greater;
-};
-
-class SDLButtonMotion final : public Input::MotionDevice {
-public:
- explicit SDLButtonMotion(std::shared_ptr<SDLJoystick> joystick_, int button_)
- : joystick(std::move(joystick_)), button(button_) {}
-
- Input::MotionStatus GetStatus() const override {
- if (joystick->GetButton(button)) {
- return joystick->GetMotion().GetRandomMotion(2, 6);
- }
- return joystick->GetMotion().GetRandomMotion(0, 0);
- }
-
-private:
- std::shared_ptr<SDLJoystick> joystick;
- int button;
-};
-
-/// A button device factory that creates button devices from SDL joystick
-class SDLButtonFactory final : public Input::Factory<Input::ButtonDevice> {
-public:
- explicit SDLButtonFactory(SDLState& state_) : state(state_) {}
-
- /**
- * Creates a button device from a joystick button
- * @param params contains parameters for creating the device:
- * - "guid": the guid of the joystick to bind
- * - "port": the nth joystick of the same type to bind
- * - "button"(optional): the index of the button to bind
- * - "hat"(optional): the index of the hat to bind as direction buttons
- * - "axis"(optional): the index of the axis to bind
- * - "direction"(only used for hat): the direction name of the hat to bind. Can be "up",
- * "down", "left" or "right"
- * - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is
- * triggered if the axis value crosses
- * - "direction"(only used for axis): "+" means the button is triggered when the axis
- * value is greater than the threshold; "-" means the button is triggered when the axis
- * value is smaller than the threshold
- */
- std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override {
- const std::string guid = params.Get("guid", "0");
- const int port = params.Get("port", 0);
- const auto toggle = params.Get("toggle", false);
-
- auto joystick = state.GetSDLJoystickByGUID(guid, port);
-
- if (params.Has("hat")) {
- const int hat = params.Get("hat", 0);
- const std::string direction_name = params.Get("direction", "");
- Uint8 direction;
- if (direction_name == "up") {
- direction = SDL_HAT_UP;
- } else if (direction_name == "down") {
- direction = SDL_HAT_DOWN;
- } else if (direction_name == "left") {
- direction = SDL_HAT_LEFT;
- } else if (direction_name == "right") {
- direction = SDL_HAT_RIGHT;
- } else {
- direction = 0;
- }
- // This is necessary so accessing GetHat with hat won't crash
- joystick->SetHat(hat, SDL_HAT_CENTERED);
- return std::make_unique<SDLDirectionButton>(joystick, hat, direction);
- }
-
- if (params.Has("axis")) {
- const int axis = params.Get("axis", 0);
- // Convert range from (0.0, 1.0) to (-1.0, 1.0)
- const float threshold = (params.Get("threshold", 0.5f) - 0.5f) * 2.0f;
- const std::string direction_name = params.Get("direction", "");
- bool trigger_if_greater;
- if (direction_name == "+") {
- trigger_if_greater = true;
- } else if (direction_name == "-") {
- trigger_if_greater = false;
- } else {
- trigger_if_greater = true;
- LOG_ERROR(Input, "Unknown direction {}", direction_name);
- }
- // This is necessary so accessing GetAxis with axis won't crash
- joystick->PreSetAxis(axis);
- return std::make_unique<SDLAxisButton>(joystick, axis, threshold, trigger_if_greater);
- }
-
- const int button = params.Get("button", 0);
- // This is necessary so accessing GetButton with button won't crash
- joystick->PreSetButton(button);
- return std::make_unique<SDLButton>(joystick, button, toggle);
- }
-
-private:
- SDLState& state;
-};
-
-/// An analog device factory that creates analog devices from SDL joystick
-class SDLAnalogFactory final : public Input::Factory<Input::AnalogDevice> {
-public:
- explicit SDLAnalogFactory(SDLState& state_) : state(state_) {}
- /**
- * Creates an analog device from joystick axes
- * @param params contains parameters for creating the device:
- * - "guid": the guid of the joystick to bind
- * - "port": the nth joystick of the same type
- * - "axis_x": the index of the axis to be bind as x-axis
- * - "axis_y": the index of the axis to be bind as y-axis
- */
- std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override {
- const std::string guid = params.Get("guid", "0");
- const int port = params.Get("port", 0);
- const int axis_x = params.Get("axis_x", 0);
- const int axis_y = params.Get("axis_y", 1);
- const float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
- const float range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f);
- const std::string invert_x_value = params.Get("invert_x", "+");
- const std::string invert_y_value = params.Get("invert_y", "+");
- const bool invert_x = invert_x_value == "-";
- const bool invert_y = invert_y_value == "-";
- const float offset_x = std::clamp(params.Get("offset_x", 0.0f), -0.99f, 0.99f);
- const float offset_y = std::clamp(params.Get("offset_y", 0.0f), -0.99f, 0.99f);
- auto joystick = state.GetSDLJoystickByGUID(guid, port);
-
- // This is necessary so accessing GetAxis with axis_x and axis_y won't crash
- joystick->PreSetAxis(axis_x);
- joystick->PreSetAxis(axis_y);
- return std::make_unique<SDLAnalog>(joystick, axis_x, axis_y, invert_x, invert_y, deadzone,
- range, offset_x, offset_y);
- }
-
-private:
- SDLState& state;
-};
-
-/// An vibration device factory that creates vibration devices from SDL joystick
-class SDLVibrationFactory final : public Input::Factory<Input::VibrationDevice> {
-public:
- explicit SDLVibrationFactory(SDLState& state_) : state(state_) {}
- /**
- * Creates a vibration device from a joystick
- * @param params contains parameters for creating the device:
- * - "guid": the guid of the joystick to bind
- * - "port": the nth joystick of the same type
- */
- std::unique_ptr<Input::VibrationDevice> Create(const Common::ParamPackage& params) override {
- const std::string guid = params.Get("guid", "0");
- const int port = params.Get("port", 0);
- return std::make_unique<SDLVibration>(state.GetSDLJoystickByGUID(guid, port));
- }
-
-private:
- SDLState& state;
-};
-
-/// A motion device factory that creates motion devices from SDL joystick
-class SDLMotionFactory final : public Input::Factory<Input::MotionDevice> {
-public:
- explicit SDLMotionFactory(SDLState& state_) : state(state_) {}
- /**
- * Creates motion device from joystick axes
- * @param params contains parameters for creating the device:
- * - "guid": the guid of the joystick to bind
- * - "port": the nth joystick of the same type
- */
- std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override {
- const std::string guid = params.Get("guid", "0");
- const int port = params.Get("port", 0);
-
- auto joystick = state.GetSDLJoystickByGUID(guid, port);
-
- if (params.Has("motion")) {
- return std::make_unique<SDLMotion>(joystick);
- }
-
- if (params.Has("hat")) {
- const int hat = params.Get("hat", 0);
- const std::string direction_name = params.Get("direction", "");
- Uint8 direction;
- if (direction_name == "up") {
- direction = SDL_HAT_UP;
- } else if (direction_name == "down") {
- direction = SDL_HAT_DOWN;
- } else if (direction_name == "left") {
- direction = SDL_HAT_LEFT;
- } else if (direction_name == "right") {
- direction = SDL_HAT_RIGHT;
- } else {
- direction = 0;
- }
- // This is necessary so accessing GetHat with hat won't crash
- joystick->SetHat(hat, SDL_HAT_CENTERED);
- return std::make_unique<SDLDirectionMotion>(joystick, hat, direction);
- }
-
- if (params.Has("axis")) {
- const int axis = params.Get("axis", 0);
- const float threshold = params.Get("threshold", 0.5f);
- const std::string direction_name = params.Get("direction", "");
- bool trigger_if_greater;
- if (direction_name == "+") {
- trigger_if_greater = true;
- } else if (direction_name == "-") {
- trigger_if_greater = false;
- } else {
- trigger_if_greater = true;
- LOG_ERROR(Input, "Unknown direction {}", direction_name);
- }
- // This is necessary so accessing GetAxis with axis won't crash
- joystick->PreSetAxis(axis);
- return std::make_unique<SDLAxisMotion>(joystick, axis, threshold, trigger_if_greater);
- }
-
- const int button = params.Get("button", 0);
- // This is necessary so accessing GetButton with button won't crash
- joystick->PreSetButton(button);
- return std::make_unique<SDLButtonMotion>(joystick, button);
- }
-
-private:
- SDLState& state;
-};
-
-SDLState::SDLState() {
- using namespace Input;
- button_factory = std::make_shared<SDLButtonFactory>(*this);
- analog_factory = std::make_shared<SDLAnalogFactory>(*this);
- vibration_factory = std::make_shared<SDLVibrationFactory>(*this);
- motion_factory = std::make_shared<SDLMotionFactory>(*this);
- RegisterFactory<ButtonDevice>("sdl", button_factory);
- RegisterFactory<AnalogDevice>("sdl", analog_factory);
- RegisterFactory<VibrationDevice>("sdl", vibration_factory);
- RegisterFactory<MotionDevice>("sdl", motion_factory);
-
- if (!Settings::values.enable_raw_input) {
- // Disable raw input. When enabled this setting causes SDL to die when a web applet opens
- SDL_SetHint(SDL_HINT_JOYSTICK_RAWINPUT, "0");
- }
-
- // Enable HIDAPI rumble. This prevents SDL from disabling motion on PS4 and PS5 controllers
- SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, "1");
- SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE, "1");
-
- // Tell SDL2 to use the hidapi driver. This will allow joycons to be detected as a
- // GameController and not a generic one
- SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1");
-
- // Turn off Pro controller home led
- SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED, "0");
-
- // If the frontend is going to manage the event loop, then we don't start one here
- start_thread = SDL_WasInit(SDL_INIT_JOYSTICK) == 0;
- if (start_thread && SDL_Init(SDL_INIT_JOYSTICK) < 0) {
- LOG_CRITICAL(Input, "SDL_Init(SDL_INIT_JOYSTICK) failed with: {}", SDL_GetError());
- return;
- }
- has_gamecontroller = SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) != 0;
- if (SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1") == SDL_FALSE) {
- LOG_ERROR(Input, "Failed to set hint for background events with: {}", SDL_GetError());
- }
-
- SDL_AddEventWatch(&SDLEventWatcher, this);
-
- initialized = true;
- if (start_thread) {
- poll_thread = std::thread([this] {
- using namespace std::chrono_literals;
- while (initialized) {
- SDL_PumpEvents();
- std::this_thread::sleep_for(1ms);
- }
- });
- }
- // Because the events for joystick connection happens before we have our event watcher added, we
- // can just open all the joysticks right here
- for (int i = 0; i < SDL_NumJoysticks(); ++i) {
- InitJoystick(i);
- }
-}
-
-SDLState::~SDLState() {
- using namespace Input;
- UnregisterFactory<ButtonDevice>("sdl");
- UnregisterFactory<AnalogDevice>("sdl");
- UnregisterFactory<VibrationDevice>("sdl");
- UnregisterFactory<MotionDevice>("sdl");
-
- CloseJoysticks();
- SDL_DelEventWatch(&SDLEventWatcher, this);
-
- initialized = false;
- if (start_thread) {
- poll_thread.join();
- SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
- }
-}
-
-std::vector<Common::ParamPackage> SDLState::GetInputDevices() {
- std::scoped_lock lock(joystick_map_mutex);
- std::vector<Common::ParamPackage> devices;
- std::unordered_map<int, std::shared_ptr<SDLJoystick>> joycon_pairs;
- for (const auto& [key, value] : joystick_map) {
- for (const auto& joystick : value) {
- if (!joystick->GetSDLJoystick()) {
- continue;
- }
- std::string name =
- fmt::format("{} {}", joystick->GetControllerName(), joystick->GetPort());
- devices.emplace_back(Common::ParamPackage{
- {"class", "sdl"},
- {"display", std::move(name)},
- {"guid", joystick->GetGUID()},
- {"port", std::to_string(joystick->GetPort())},
- });
- if (joystick->IsJoyconLeft()) {
- joycon_pairs.insert_or_assign(joystick->GetPort(), joystick);
- }
- }
- }
-
- // Add dual controllers
- for (const auto& [key, value] : joystick_map) {
- for (const auto& joystick : value) {
- if (joystick->IsJoyconRight()) {
- if (!joycon_pairs.contains(joystick->GetPort())) {
- continue;
- }
- const auto joystick2 = joycon_pairs.at(joystick->GetPort());
-
- std::string name =
- fmt::format("{} {}", "Nintendo Dual Joy-Con", joystick->GetPort());
- devices.emplace_back(Common::ParamPackage{
- {"class", "sdl"},
- {"display", std::move(name)},
- {"guid", joystick->GetGUID()},
- {"guid2", joystick2->GetGUID()},
- {"port", std::to_string(joystick->GetPort())},
- });
- }
- }
- }
- return devices;
-}
-
-namespace {
-Common::ParamPackage BuildAnalogParamPackageForButton(int port, std::string guid, s32 axis,
- float value = 0.1f) {
- Common::ParamPackage params({{"engine", "sdl"}});
- params.Set("port", port);
- params.Set("guid", std::move(guid));
- params.Set("axis", axis);
- params.Set("threshold", "0.5");
- if (value > 0) {
- params.Set("direction", "+");
- } else {
- params.Set("direction", "-");
- }
- return params;
-}
-
-Common::ParamPackage BuildButtonParamPackageForButton(int port, std::string guid, s32 button) {
- Common::ParamPackage params({{"engine", "sdl"}});
- params.Set("port", port);
- params.Set("guid", std::move(guid));
- params.Set("button", button);
- params.Set("toggle", false);
- return params;
-}
-
-Common::ParamPackage BuildHatParamPackageForButton(int port, std::string guid, s32 hat, s32 value) {
- Common::ParamPackage params({{"engine", "sdl"}});
-
- params.Set("port", port);
- params.Set("guid", std::move(guid));
- params.Set("hat", hat);
- switch (value) {
- case SDL_HAT_UP:
- params.Set("direction", "up");
- break;
- case SDL_HAT_DOWN:
- params.Set("direction", "down");
- break;
- case SDL_HAT_LEFT:
- params.Set("direction", "left");
- break;
- case SDL_HAT_RIGHT:
- params.Set("direction", "right");
- break;
- default:
- return {};
- }
- return params;
-}
-
-Common::ParamPackage BuildMotionParam(int port, std::string guid) {
- Common::ParamPackage params({{"engine", "sdl"}, {"motion", "0"}});
- params.Set("port", port);
- params.Set("guid", std::move(guid));
- return params;
-}
-
-Common::ParamPackage SDLEventToButtonParamPackage(SDLState& state, const SDL_Event& event) {
- switch (event.type) {
- case SDL_JOYAXISMOTION: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
- return BuildAnalogParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jaxis.axis),
- event.jaxis.value);
- }
- break;
- }
- case SDL_JOYBUTTONUP: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jbutton.which)) {
- return BuildButtonParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jbutton.button));
- }
- break;
- }
- case SDL_JOYHATMOTION: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jhat.which)) {
- return BuildHatParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jhat.hat),
- static_cast<s32>(event.jhat.value));
- }
- break;
- }
- }
- return {};
-}
-
-Common::ParamPackage SDLEventToMotionParamPackage(SDLState& state, const SDL_Event& event) {
- switch (event.type) {
- case SDL_JOYAXISMOTION: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
- return BuildAnalogParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jaxis.axis),
- event.jaxis.value);
- }
- break;
- }
- case SDL_JOYBUTTONUP: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jbutton.which)) {
- return BuildButtonParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jbutton.button));
- }
- break;
- }
- case SDL_JOYHATMOTION: {
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jhat.which)) {
- return BuildHatParamPackageForButton(joystick->GetPort(), joystick->GetGUID(),
- static_cast<s32>(event.jhat.hat),
- static_cast<s32>(event.jhat.value));
- }
- break;
- }
- case SDL_CONTROLLERSENSORUPDATE: {
- bool is_motion_shaking = false;
- constexpr float gyro_threshold = 5.0f;
- constexpr float accel_threshold = 11.0f;
- if (event.csensor.sensor == SDL_SENSOR_ACCEL) {
- const Common::Vec3f acceleration = {-event.csensor.data[0], event.csensor.data[2],
- -event.csensor.data[1]};
- if (acceleration.Length() > accel_threshold) {
- is_motion_shaking = true;
- }
- }
-
- if (event.csensor.sensor == SDL_SENSOR_GYRO) {
- const Common::Vec3f gyroscope = {event.csensor.data[0], -event.csensor.data[2],
- event.csensor.data[1]};
- if (gyroscope.Length() > gyro_threshold) {
- is_motion_shaking = true;
- }
- }
-
- if (!is_motion_shaking) {
- break;
- }
-
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.csensor.which)) {
- return BuildMotionParam(joystick->GetPort(), joystick->GetGUID());
- }
- break;
- }
- }
- return {};
-}
-
-Common::ParamPackage BuildParamPackageForBinding(int port, const std::string& guid,
- const SDL_GameControllerButtonBind& binding) {
- switch (binding.bindType) {
- case SDL_CONTROLLER_BINDTYPE_NONE:
- break;
- case SDL_CONTROLLER_BINDTYPE_AXIS:
- return BuildAnalogParamPackageForButton(port, guid, binding.value.axis);
- case SDL_CONTROLLER_BINDTYPE_BUTTON:
- return BuildButtonParamPackageForButton(port, guid, binding.value.button);
- case SDL_CONTROLLER_BINDTYPE_HAT:
- return BuildHatParamPackageForButton(port, guid, binding.value.hat.hat,
- binding.value.hat.hat_mask);
- }
- return {};
-}
-
-Common::ParamPackage BuildParamPackageForAnalog(int port, const std::string& guid, int axis_x,
- int axis_y, float offset_x, float offset_y) {
- Common::ParamPackage params;
- params.Set("engine", "sdl");
- params.Set("port", port);
- params.Set("guid", guid);
- params.Set("axis_x", axis_x);
- params.Set("axis_y", axis_y);
- params.Set("offset_x", offset_x);
- params.Set("offset_y", offset_y);
- params.Set("invert_x", "+");
- params.Set("invert_y", "+");
- return params;
-}
-} // Anonymous namespace
-
-ButtonMapping SDLState::GetButtonMappingForDevice(const Common::ParamPackage& params) {
- if (!params.Has("guid") || !params.Has("port")) {
- return {};
- }
- const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
-
- auto* controller = joystick->GetSDLGameController();
- if (controller == nullptr) {
- return {};
- }
-
- // This list is missing ZL/ZR since those are not considered buttons in SDL GameController.
- // We will add those afterwards
- // This list also excludes Screenshot since theres not really a mapping for that
- ButtonBindings switch_to_sdl_button;
-
- if (SDL_GameControllerGetType(controller) == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) {
- switch_to_sdl_button = GetNintendoButtonBinding(joystick);
- } else {
- switch_to_sdl_button = GetDefaultButtonBinding();
- }
-
- // Add the missing bindings for ZL/ZR
- static constexpr ZButtonBindings switch_to_sdl_axis{{
- {Settings::NativeButton::ZL, SDL_CONTROLLER_AXIS_TRIGGERLEFT},
- {Settings::NativeButton::ZR, SDL_CONTROLLER_AXIS_TRIGGERRIGHT},
- }};
-
- // Parameters contain two joysticks return dual
- if (params.Has("guid2")) {
- const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
-
- if (joystick2->GetSDLGameController() != nullptr) {
- return GetDualControllerMapping(joystick, joystick2, switch_to_sdl_button,
- switch_to_sdl_axis);
- }
- }
-
- return GetSingleControllerMapping(joystick, switch_to_sdl_button, switch_to_sdl_axis);
-}
-
-ButtonBindings SDLState::GetDefaultButtonBinding() const {
- return {
- std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_B},
- {Settings::NativeButton::B, SDL_CONTROLLER_BUTTON_A},
- {Settings::NativeButton::X, SDL_CONTROLLER_BUTTON_Y},
- {Settings::NativeButton::Y, SDL_CONTROLLER_BUTTON_X},
- {Settings::NativeButton::LStick, SDL_CONTROLLER_BUTTON_LEFTSTICK},
- {Settings::NativeButton::RStick, SDL_CONTROLLER_BUTTON_RIGHTSTICK},
- {Settings::NativeButton::L, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
- {Settings::NativeButton::R, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
- {Settings::NativeButton::Plus, SDL_CONTROLLER_BUTTON_START},
- {Settings::NativeButton::Minus, SDL_CONTROLLER_BUTTON_BACK},
- {Settings::NativeButton::DLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT},
- {Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
- {Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
- {Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
- {Settings::NativeButton::SL, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
- {Settings::NativeButton::SR, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
- {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
- };
-}
-
-ButtonBindings SDLState::GetNintendoButtonBinding(
- const std::shared_ptr<SDLJoystick>& joystick) const {
- // Default SL/SR mapping for pro controllers
- auto sl_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;
- auto sr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
-
- if (joystick->IsJoyconLeft()) {
- sl_button = SDL_CONTROLLER_BUTTON_PADDLE2;
- sr_button = SDL_CONTROLLER_BUTTON_PADDLE4;
- }
- if (joystick->IsJoyconRight()) {
- sl_button = SDL_CONTROLLER_BUTTON_PADDLE3;
- sr_button = SDL_CONTROLLER_BUTTON_PADDLE1;
- }
-
- return {
- std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_A},
- {Settings::NativeButton::B, SDL_CONTROLLER_BUTTON_B},
- {Settings::NativeButton::X, SDL_CONTROLLER_BUTTON_X},
- {Settings::NativeButton::Y, SDL_CONTROLLER_BUTTON_Y},
- {Settings::NativeButton::LStick, SDL_CONTROLLER_BUTTON_LEFTSTICK},
- {Settings::NativeButton::RStick, SDL_CONTROLLER_BUTTON_RIGHTSTICK},
- {Settings::NativeButton::L, SDL_CONTROLLER_BUTTON_LEFTSHOULDER},
- {Settings::NativeButton::R, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER},
- {Settings::NativeButton::Plus, SDL_CONTROLLER_BUTTON_START},
- {Settings::NativeButton::Minus, SDL_CONTROLLER_BUTTON_BACK},
- {Settings::NativeButton::DLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT},
- {Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
- {Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
- {Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
- {Settings::NativeButton::SL, sl_button},
- {Settings::NativeButton::SR, sr_button},
- {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
- };
-}
-
-ButtonMapping SDLState::GetSingleControllerMapping(
- const std::shared_ptr<SDLJoystick>& joystick, const ButtonBindings& switch_to_sdl_button,
- const ZButtonBindings& switch_to_sdl_axis) const {
- ButtonMapping mapping;
- mapping.reserve(switch_to_sdl_button.size() + switch_to_sdl_axis.size());
- auto* controller = joystick->GetSDLGameController();
-
- for (const auto& [switch_button, sdl_button] : switch_to_sdl_button) {
- const auto& binding = SDL_GameControllerGetBindForButton(controller, sdl_button);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
- }
- for (const auto& [switch_button, sdl_axis] : switch_to_sdl_axis) {
- const auto& binding = SDL_GameControllerGetBindForAxis(controller, sdl_axis);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
- }
-
- return mapping;
-}
-
-ButtonMapping SDLState::GetDualControllerMapping(const std::shared_ptr<SDLJoystick>& joystick,
- const std::shared_ptr<SDLJoystick>& joystick2,
- const ButtonBindings& switch_to_sdl_button,
- const ZButtonBindings& switch_to_sdl_axis) const {
- ButtonMapping mapping;
- mapping.reserve(switch_to_sdl_button.size() + switch_to_sdl_axis.size());
- auto* controller = joystick->GetSDLGameController();
- auto* controller2 = joystick2->GetSDLGameController();
-
- for (const auto& [switch_button, sdl_button] : switch_to_sdl_button) {
- if (IsButtonOnLeftSide(switch_button)) {
- const auto& binding = SDL_GameControllerGetBindForButton(controller2, sdl_button);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick2->GetPort(), joystick2->GetGUID(), binding));
- continue;
- }
- const auto& binding = SDL_GameControllerGetBindForButton(controller, sdl_button);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
- }
- for (const auto& [switch_button, sdl_axis] : switch_to_sdl_axis) {
- if (IsButtonOnLeftSide(switch_button)) {
- const auto& binding = SDL_GameControllerGetBindForAxis(controller2, sdl_axis);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick2->GetPort(), joystick2->GetGUID(), binding));
- continue;
- }
- const auto& binding = SDL_GameControllerGetBindForAxis(controller, sdl_axis);
- mapping.insert_or_assign(
- switch_button,
- BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding));
- }
-
- return mapping;
-}
-
-bool SDLState::IsButtonOnLeftSide(Settings::NativeButton::Values button) const {
- switch (button) {
- case Settings::NativeButton::DDown:
- case Settings::NativeButton::DLeft:
- case Settings::NativeButton::DRight:
- case Settings::NativeButton::DUp:
- case Settings::NativeButton::L:
- case Settings::NativeButton::LStick:
- case Settings::NativeButton::Minus:
- case Settings::NativeButton::Screenshot:
- case Settings::NativeButton::ZL:
- return true;
- default:
- return false;
- }
-}
-
-AnalogMapping SDLState::GetAnalogMappingForDevice(const Common::ParamPackage& params) {
- if (!params.Has("guid") || !params.Has("port")) {
- return {};
- }
- const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
- const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
- auto* controller = joystick->GetSDLGameController();
- if (controller == nullptr) {
- return {};
- }
-
- AnalogMapping mapping = {};
- const auto& binding_left_x =
- SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTX);
- const auto& binding_left_y =
- SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTY);
- if (params.Has("guid2")) {
- joystick2->PreSetAxis(binding_left_x.value.axis);
- joystick2->PreSetAxis(binding_left_y.value.axis);
- const auto left_offset_x = -joystick2->GetAxis(binding_left_x.value.axis, 1.0f, 0);
- const auto left_offset_y = -joystick2->GetAxis(binding_left_y.value.axis, 1.0f, 0);
- mapping.insert_or_assign(
- Settings::NativeAnalog::LStick,
- BuildParamPackageForAnalog(joystick2->GetPort(), joystick2->GetGUID(),
- binding_left_x.value.axis, binding_left_y.value.axis,
- left_offset_x, left_offset_y));
- } else {
- joystick->PreSetAxis(binding_left_x.value.axis);
- joystick->PreSetAxis(binding_left_y.value.axis);
- const auto left_offset_x = -joystick->GetAxis(binding_left_x.value.axis, 1.0f, 0);
- const auto left_offset_y = -joystick->GetAxis(binding_left_y.value.axis, 1.0f, 0);
- mapping.insert_or_assign(
- Settings::NativeAnalog::LStick,
- BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
- binding_left_x.value.axis, binding_left_y.value.axis,
- left_offset_x, left_offset_y));
- }
- const auto& binding_right_x =
- SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTX);
- const auto& binding_right_y =
- SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTY);
- joystick->PreSetAxis(binding_right_x.value.axis);
- joystick->PreSetAxis(binding_right_y.value.axis);
- const auto right_offset_x = -joystick->GetAxis(binding_right_x.value.axis, 1.0f, 0);
- const auto right_offset_y = -joystick->GetAxis(binding_right_y.value.axis, 1.0f, 0);
- mapping.insert_or_assign(Settings::NativeAnalog::RStick,
- BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
- binding_right_x.value.axis,
- binding_right_y.value.axis, right_offset_x,
- right_offset_y));
- return mapping;
-}
-
-MotionMapping SDLState::GetMotionMappingForDevice(const Common::ParamPackage& params) {
- if (!params.Has("guid") || !params.Has("port")) {
- return {};
- }
- const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0));
- const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0));
- auto* controller = joystick->GetSDLGameController();
- if (controller == nullptr) {
- return {};
- }
-
- MotionMapping mapping = {};
- joystick->EnableMotion();
-
- if (joystick->HasGyro() || joystick->HasAccel()) {
- mapping.insert_or_assign(Settings::NativeMotion::MotionRight,
- BuildMotionParam(joystick->GetPort(), joystick->GetGUID()));
- }
- if (params.Has("guid2")) {
- joystick2->EnableMotion();
- if (joystick2->HasGyro() || joystick2->HasAccel()) {
- mapping.insert_or_assign(Settings::NativeMotion::MotionLeft,
- BuildMotionParam(joystick2->GetPort(), joystick2->GetGUID()));
- }
- } else {
- if (joystick->HasGyro() || joystick->HasAccel()) {
- mapping.insert_or_assign(Settings::NativeMotion::MotionLeft,
- BuildMotionParam(joystick->GetPort(), joystick->GetGUID()));
- }
- }
-
- return mapping;
-}
-namespace Polling {
-class SDLPoller : public InputCommon::Polling::DevicePoller {
-public:
- explicit SDLPoller(SDLState& state_) : state(state_) {}
-
- void Start([[maybe_unused]] const std::string& device_id) override {
- state.event_queue.Clear();
- state.polling = true;
- }
-
- void Stop() override {
- state.polling = false;
- }
-
-protected:
- SDLState& state;
-};
-
-class SDLButtonPoller final : public SDLPoller {
-public:
- explicit SDLButtonPoller(SDLState& state_) : SDLPoller(state_) {}
-
- Common::ParamPackage GetNextInput() override {
- SDL_Event event;
- while (state.event_queue.Pop(event)) {
- const auto package = FromEvent(event);
- if (package) {
- return *package;
- }
- }
- return {};
- }
- [[nodiscard]] std::optional<Common::ParamPackage> FromEvent(SDL_Event& event) {
- switch (event.type) {
- case SDL_JOYAXISMOTION:
- if (!axis_memory.count(event.jaxis.which) ||
- !axis_memory[event.jaxis.which].count(event.jaxis.axis)) {
- axis_memory[event.jaxis.which][event.jaxis.axis] = event.jaxis.value;
- axis_event_count[event.jaxis.which][event.jaxis.axis] = 1;
- break;
- } else {
- axis_event_count[event.jaxis.which][event.jaxis.axis]++;
- // The joystick and axis exist in our map if we take this branch, so no checks
- // needed
- if (std::abs(
- (event.jaxis.value - axis_memory[event.jaxis.which][event.jaxis.axis]) /
- 32767.0) < 0.5) {
- break;
- } else {
- if (axis_event_count[event.jaxis.which][event.jaxis.axis] == 2 &&
- IsAxisAtPole(event.jaxis.value) &&
- IsAxisAtPole(axis_memory[event.jaxis.which][event.jaxis.axis])) {
- // If we have exactly two events and both are near a pole, this is
- // likely a digital input masquerading as an analog axis; Instead of
- // trying to look at the direction the axis travelled, assume the first
- // event was press and the second was release; This should handle most
- // digital axes while deferring to the direction of travel for analog
- // axes
- event.jaxis.value = static_cast<Sint16>(
- std::copysign(32767, axis_memory[event.jaxis.which][event.jaxis.axis]));
- } else {
- // There are more than two events, so this is likely a true analog axis,
- // check the direction it travelled
- event.jaxis.value = static_cast<Sint16>(std::copysign(
- 32767,
- event.jaxis.value - axis_memory[event.jaxis.which][event.jaxis.axis]));
- }
- axis_memory.clear();
- axis_event_count.clear();
- }
- }
- [[fallthrough]];
- case SDL_JOYBUTTONUP:
- case SDL_JOYHATMOTION:
- return {SDLEventToButtonParamPackage(state, event)};
- }
- return std::nullopt;
- }
-
-private:
- // Determine whether an axis value is close to an extreme or center
- // Some controllers have a digital D-Pad as a pair of analog sticks, with 3 possible values per
- // axis, which is why the center must be considered a pole
- bool IsAxisAtPole(int16_t value) const {
- return std::abs(value) >= 32767 || std::abs(value) < 327;
- }
- std::unordered_map<SDL_JoystickID, std::unordered_map<uint8_t, int16_t>> axis_memory;
- std::unordered_map<SDL_JoystickID, std::unordered_map<uint8_t, uint32_t>> axis_event_count;
-};
-
-class SDLMotionPoller final : public SDLPoller {
-public:
- explicit SDLMotionPoller(SDLState& state_) : SDLPoller(state_) {}
-
- Common::ParamPackage GetNextInput() override {
- SDL_Event event;
- while (state.event_queue.Pop(event)) {
- const auto package = FromEvent(event);
- if (package) {
- return *package;
- }
- }
- return {};
- }
- [[nodiscard]] std::optional<Common::ParamPackage> FromEvent(const SDL_Event& event) const {
- switch (event.type) {
- case SDL_JOYAXISMOTION:
- if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
- break;
- }
- [[fallthrough]];
- case SDL_JOYBUTTONUP:
- case SDL_JOYHATMOTION:
- case SDL_CONTROLLERSENSORUPDATE:
- return {SDLEventToMotionParamPackage(state, event)};
- }
- return std::nullopt;
- }
-};
-
-/**
- * Attempts to match the press to a controller joy axis (left/right stick) and if a match
- * isn't found, checks if the event matches anything from SDLButtonPoller and uses that
- * instead
- */
-class SDLAnalogPreferredPoller final : public SDLPoller {
-public:
- explicit SDLAnalogPreferredPoller(SDLState& state_)
- : SDLPoller(state_), button_poller(state_) {}
-
- void Start(const std::string& device_id) override {
- SDLPoller::Start(device_id);
- // Reset stored axes
- first_axis = -1;
- }
-
- Common::ParamPackage GetNextInput() override {
- SDL_Event event;
- while (state.event_queue.Pop(event)) {
- if (event.type != SDL_JOYAXISMOTION) {
- // Check for a button press
- auto button_press = button_poller.FromEvent(event);
- if (button_press) {
- return *button_press;
- }
- continue;
- }
- const auto axis = event.jaxis.axis;
-
- // Filter out axis events that are below a threshold
- if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
- continue;
- }
-
- // Filter out axis events that are the same
- if (first_axis == axis) {
- continue;
- }
-
- // In order to return a complete analog param, we need inputs for both axes.
- // If the first axis isn't set we set the value then wait till next event
- if (first_axis == -1) {
- first_axis = axis;
- continue;
- }
-
- if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
- // Set offset to zero since the joystick is not on center
- auto params = BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
- first_axis, axis, 0, 0);
- first_axis = -1;
- return params;
- }
- }
- return {};
- }
-
-private:
- int first_axis = -1;
- SDLButtonPoller button_poller;
-};
-} // namespace Polling
-
-SDLState::Pollers SDLState::GetPollers(InputCommon::Polling::DeviceType type) {
- Pollers pollers;
-
- switch (type) {
- case InputCommon::Polling::DeviceType::AnalogPreferred:
- pollers.emplace_back(std::make_unique<Polling::SDLAnalogPreferredPoller>(*this));
- break;
- case InputCommon::Polling::DeviceType::Button:
- pollers.emplace_back(std::make_unique<Polling::SDLButtonPoller>(*this));
- break;
- case InputCommon::Polling::DeviceType::Motion:
- pollers.emplace_back(std::make_unique<Polling::SDLMotionPoller>(*this));
- break;
- }
-
- return pollers;
-}
-
-} // namespace InputCommon::SDL
diff --git a/src/input_common/tas/tas_input.cpp b/src/input_common/tas/tas_input.cpp
deleted file mode 100644
index 1598092b6..000000000
--- a/src/input_common/tas/tas_input.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2021 yuzu Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#include <cstring>
-#include <regex>
-
-#include "common/fs/file.h"
-#include "common/fs/fs_types.h"
-#include "common/fs/path_util.h"
-#include "common/logging/log.h"
-#include "common/settings.h"
-#include "input_common/tas/tas_input.h"
-
-namespace TasInput {
-
-// Supported keywords and buttons from a TAS file
-constexpr std::array<std::pair<std::string_view, TasButton>, 20> text_to_tas_button = {
- std::pair{"KEY_A", TasButton::BUTTON_A},
- {"KEY_B", TasButton::BUTTON_B},
- {"KEY_X", TasButton::BUTTON_X},
- {"KEY_Y", TasButton::BUTTON_Y},
- {"KEY_LSTICK", TasButton::STICK_L},
- {"KEY_RSTICK", TasButton::STICK_R},
- {"KEY_L", TasButton::TRIGGER_L},
- {"KEY_R", TasButton::TRIGGER_R},
- {"KEY_PLUS", TasButton::BUTTON_PLUS},
- {"KEY_MINUS", TasButton::BUTTON_MINUS},
- {"KEY_DLEFT", TasButton::BUTTON_LEFT},
- {"KEY_DUP", TasButton::BUTTON_UP},
- {"KEY_DRIGHT", TasButton::BUTTON_RIGHT},
- {"KEY_DDOWN", TasButton::BUTTON_DOWN},
- {"KEY_SL", TasButton::BUTTON_SL},
- {"KEY_SR", TasButton::BUTTON_SR},
- {"KEY_CAPTURE", TasButton::BUTTON_CAPTURE},
- {"KEY_HOME", TasButton::BUTTON_HOME},
- {"KEY_ZL", TasButton::TRIGGER_ZL},
- {"KEY_ZR", TasButton::TRIGGER_ZR},
-};
-
-Tas::Tas() {
- if (!Settings::values.tas_enable) {
- needs_reset = true;
- return;
- }
- LoadTasFiles();
-}
-
-Tas::~Tas() {
- Stop();
-};
-
-void Tas::LoadTasFiles() {
- script_length = 0;
- for (size_t i = 0; i < commands.size(); i++) {
- LoadTasFile(i);
- if (commands[i].size() > script_length) {
- script_length = commands[i].size();
- }
- }
-}
-
-void Tas::LoadTasFile(size_t player_index) {
- if (!commands[player_index].empty()) {
- commands[player_index].clear();
- }
- std::string file =
- Common::FS::ReadStringFromFile(Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) /
- fmt::format("script0-{}.txt", player_index + 1),
- Common::FS::FileType::BinaryFile);
- std::stringstream command_line(file);
- std::string line;
- int frame_no = 0;
- while (std::getline(command_line, line, '\n')) {
- if (line.empty()) {
- continue;
- }
- LOG_DEBUG(Input, "Loading line: {}", line);
- std::smatch m;
-
- std::stringstream linestream(line);
- std::string segment;
- std::vector<std::string> seglist;
-
- while (std::getline(linestream, segment, ' ')) {
- seglist.push_back(segment);
- }
-
- if (seglist.size() < 4) {
- continue;
- }
-
- while (frame_no < std::stoi(seglist.at(0))) {
- commands[player_index].push_back({});
- frame_no++;
- }
-
- TASCommand command = {
- .buttons = ReadCommandButtons(seglist.at(1)),
- .l_axis = ReadCommandAxis(seglist.at(2)),
- .r_axis = ReadCommandAxis(seglist.at(3)),
- };
- commands[player_index].push_back(command);
- frame_no++;
- }
- LOG_INFO(Input, "TAS file loaded! {} frames", frame_no);
-}
-
-void Tas::WriteTasFile(std::u8string file_name) {
- std::string output_text;
- for (size_t frame = 0; frame < record_commands.size(); frame++) {
- if (!output_text.empty()) {
- output_text += "\n";
- }
- const TASCommand& line = record_commands[frame];
- output_text += std::to_string(frame) + " " + WriteCommandButtons(line.buttons) + " " +
- WriteCommandAxis(line.l_axis) + " " + WriteCommandAxis(line.r_axis);
- }
- const auto bytes_written = Common::FS::WriteStringToFile(
- Common::FS::GetYuzuPath(Common::FS::YuzuPath::TASDir) / file_name,
- Common::FS::FileType::TextFile, output_text);
- if (bytes_written == output_text.size()) {
- LOG_INFO(Input, "TAS file written to file!");
- } else {
- LOG_ERROR(Input, "Writing the TAS-file has failed! {} / {} bytes written", bytes_written,
- output_text.size());
- }
-}
-
-std::pair<float, float> Tas::FlipAxisY(std::pair<float, float> old) {
- auto [x, y] = old;
- return {x, -y};
-}
-
-void Tas::RecordInput(u32 buttons, const std::array<std::pair<float, float>, 2>& axes) {
- last_input = {buttons, FlipAxisY(axes[0]), FlipAxisY(axes[1])};
-}
-
-std::tuple<TasState, size_t, size_t> Tas::GetStatus() const {
- TasState state;
- if (is_recording) {
- return {TasState::Recording, 0, record_commands.size()};
- }
-
- if (is_running) {
- state = TasState::Running;
- } else {
- state = TasState::Stopped;
- }
-
- return {state, current_command, script_length};
-}
-
-std::string Tas::DebugButtons(u32 buttons) const {
- return fmt::format("{{ {} }}", TasInput::Tas::ButtonsToString(buttons));
-}
-
-std::string Tas::DebugJoystick(float x, float y) const {
- return fmt::format("[ {} , {} ]", std::to_string(x), std::to_string(y));
-}
-
-std::string Tas::DebugInput(const TasData& data) const {
- return fmt::format("{{ {} , {} , {} }}", DebugButtons(data.buttons),
- DebugJoystick(data.axis[0], data.axis[1]),
- DebugJoystick(data.axis[2], data.axis[3]));
-}
-
-std::string Tas::DebugInputs(const std::array<TasData, PLAYER_NUMBER>& arr) const {
- std::string returns = "[ ";
- for (size_t i = 0; i < arr.size(); i++) {
- returns += DebugInput(arr[i]);
- if (i != arr.size() - 1) {
- returns += " , ";
- }
- }
- return returns + "]";
-}
-
-std::string Tas::ButtonsToString(u32 button) const {
- std::string returns;
- for (auto [text_button, tas_button] : text_to_tas_button) {
- if ((button & static_cast<u32>(tas_button)) != 0)
- returns += fmt::format(", {}", text_button.substr(4));
- }
- return returns.empty() ? "" : returns.substr(2);
-}
-
-void Tas::UpdateThread() {
- if (!Settings::values.tas_enable) {
- if (is_running) {
- Stop();
- }
- return;
- }
-
- if (is_recording) {
- record_commands.push_back(last_input);
- }
- if (needs_reset) {
- current_command = 0;
- needs_reset = false;
- LoadTasFiles();
- LOG_DEBUG(Input, "tas_reset done");
- }
-
- if (!is_running) {
- tas_data.fill({});
- return;
- }
- if (current_command < script_length) {
- LOG_DEBUG(Input, "Playing TAS {}/{}", current_command, script_length);
- size_t frame = current_command++;
- for (size_t i = 0; i < commands.size(); i++) {
- if (frame < commands[i].size()) {
- TASCommand command = commands[i][frame];
- tas_data[i].buttons = command.buttons;
- auto [l_axis_x, l_axis_y] = command.l_axis;
- tas_data[i].axis[0] = l_axis_x;
- tas_data[i].axis[1] = l_axis_y;
- auto [r_axis_x, r_axis_y] = command.r_axis;
- tas_data[i].axis[2] = r_axis_x;
- tas_data[i].axis[3] = r_axis_y;
- } else {
- tas_data[i] = {};
- }
- }
- } else {
- is_running = Settings::values.tas_loop.GetValue();
- current_command = 0;
- tas_data.fill({});
- if (!is_running) {
- SwapToStoredController();
- }
- }
- LOG_DEBUG(Input, "TAS inputs: {}", DebugInputs(tas_data));
-}
-
-TasAnalog Tas::ReadCommandAxis(const std::string& line) const {
- std::stringstream linestream(line);
- std::string segment;
- std::vector<std::string> seglist;
-
- while (std::getline(linestream, segment, ';')) {
- seglist.push_back(segment);
- }
-
- const float x = std::stof(seglist.at(0)) / 32767.0f;
- const float y = std::stof(seglist.at(1)) / 32767.0f;
-
- return {x, y};
-}
-
-u32 Tas::ReadCommandButtons(const std::string& data) const {
- std::stringstream button_text(data);
- std::string line;
- u32 buttons = 0;
- while (std::getline(button_text, line, ';')) {
- for (auto [text, tas_button] : text_to_tas_button) {
- if (text == line) {
- buttons |= static_cast<u32>(tas_button);
- break;
- }
- }
- }
- return buttons;
-}
-
-std::string Tas::WriteCommandAxis(TasAnalog data) const {
- auto [x, y] = data;
- std::string line;
- line += std::to_string(static_cast<int>(x * 32767));
- line += ";";
- line += std::to_string(static_cast<int>(y * 32767));
- return line;
-}
-
-std::string Tas::WriteCommandButtons(u32 data) const {
- if (data == 0) {
- return "NONE";
- }
-
- std::string line;
- u32 index = 0;
- while (data > 0) {
- if ((data & 1) == 1) {
- for (auto [text, tas_button] : text_to_tas_button) {
- if (tas_button == static_cast<TasButton>(1 << index)) {
- if (line.size() > 0) {
- line += ";";
- }
- line += text;
- break;
- }
- }
- }
- index++;
- data >>= 1;
- }
- return line;
-}
-
-void Tas::StartStop() {
- if (!Settings::values.tas_enable) {
- return;
- }
- if (is_running) {
- Stop();
- } else {
- is_running = true;
- SwapToTasController();
- }
-}
-
-void Tas::Stop() {
- is_running = false;
- SwapToStoredController();
-}
-
-void Tas::SwapToTasController() {
- if (!Settings::values.tas_swap_controllers) {
- return;
- }
- auto& players = Settings::values.players.GetValue();
- for (std::size_t index = 0; index < players.size(); index++) {
- auto& player = players[index];
- player_mappings[index] = player;
-
- // Only swap active controllers
- if (!player.connected) {
- continue;
- }
-
- Common::ParamPackage tas_param;
- tas_param.Set("pad", static_cast<u8>(index));
- auto button_mapping = GetButtonMappingForDevice(tas_param);
- auto analog_mapping = GetAnalogMappingForDevice(tas_param);
- auto& buttons = player.buttons;
- auto& analogs = player.analogs;
-
- for (std::size_t i = 0; i < buttons.size(); ++i) {
- buttons[i] = button_mapping[static_cast<Settings::NativeButton::Values>(i)].Serialize();
- }
- for (std::size_t i = 0; i < analogs.size(); ++i) {
- analogs[i] = analog_mapping[static_cast<Settings::NativeAnalog::Values>(i)].Serialize();
- }
- }
- is_old_input_saved = true;
- Settings::values.is_device_reload_pending.store(true);
-}
-
-void Tas::SwapToStoredController() {
- if (!is_old_input_saved) {
- return;
- }
- auto& players = Settings::values.players.GetValue();
- for (std::size_t index = 0; index < players.size(); index++) {
- players[index] = player_mappings[index];
- }
- is_old_input_saved = false;
- Settings::values.is_device_reload_pending.store(true);
-}
-
-void Tas::Reset() {
- if (!Settings::values.tas_enable) {
- return;
- }
- needs_reset = true;
-}
-
-bool Tas::Record() {
- if (!Settings::values.tas_enable) {
- return true;
- }
- is_recording = !is_recording;
- return is_recording;
-}
-
-void Tas::SaveRecording(bool overwrite_file) {
- if (is_recording) {
- return;
- }
- if (record_commands.empty()) {
- return;
- }
- WriteTasFile(u8"record.txt");
- if (overwrite_file) {
- WriteTasFile(u8"script0-1.txt");
- }
- needs_reset = true;
- record_commands.clear();
-}
-
-InputCommon::ButtonMapping Tas::GetButtonMappingForDevice(
- const Common::ParamPackage& params) const {
- // This list is missing ZL/ZR since those are not considered buttons.
- // We will add those afterwards
- // This list also excludes any button that can't be really mapped
- static constexpr std::array<std::pair<Settings::NativeButton::Values, TasButton>, 20>
- switch_to_tas_button = {
- std::pair{Settings::NativeButton::A, TasButton::BUTTON_A},
- {Settings::NativeButton::B, TasButton::BUTTON_B},
- {Settings::NativeButton::X, TasButton::BUTTON_X},
- {Settings::NativeButton::Y, TasButton::BUTTON_Y},
- {Settings::NativeButton::LStick, TasButton::STICK_L},
- {Settings::NativeButton::RStick, TasButton::STICK_R},
- {Settings::NativeButton::L, TasButton::TRIGGER_L},
- {Settings::NativeButton::R, TasButton::TRIGGER_R},
- {Settings::NativeButton::Plus, TasButton::BUTTON_PLUS},
- {Settings::NativeButton::Minus, TasButton::BUTTON_MINUS},
- {Settings::NativeButton::DLeft, TasButton::BUTTON_LEFT},
- {Settings::NativeButton::DUp, TasButton::BUTTON_UP},
- {Settings::NativeButton::DRight, TasButton::BUTTON_RIGHT},
- {Settings::NativeButton::DDown, TasButton::BUTTON_DOWN},
- {Settings::NativeButton::SL, TasButton::BUTTON_SL},
- {Settings::NativeButton::SR, TasButton::BUTTON_SR},
- {Settings::NativeButton::Screenshot, TasButton::BUTTON_CAPTURE},
- {Settings::NativeButton::Home, TasButton::BUTTON_HOME},
- {Settings::NativeButton::ZL, TasButton::TRIGGER_ZL},
- {Settings::NativeButton::ZR, TasButton::TRIGGER_ZR},
- };
-
- InputCommon::ButtonMapping mapping{};
- for (const auto& [switch_button, tas_button] : switch_to_tas_button) {
- Common::ParamPackage button_params({{"engine", "tas"}});
- button_params.Set("pad", params.Get("pad", 0));
- button_params.Set("button", static_cast<int>(tas_button));
- mapping.insert_or_assign(switch_button, std::move(button_params));
- }
-
- return mapping;
-}
-
-InputCommon::AnalogMapping Tas::GetAnalogMappingForDevice(
- const Common::ParamPackage& params) const {
-
- InputCommon::AnalogMapping mapping = {};
- Common::ParamPackage left_analog_params;
- left_analog_params.Set("engine", "tas");
- left_analog_params.Set("pad", params.Get("pad", 0));
- left_analog_params.Set("axis_x", static_cast<int>(TasAxes::StickX));
- left_analog_params.Set("axis_y", static_cast<int>(TasAxes::StickY));
- mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params));
- Common::ParamPackage right_analog_params;
- right_analog_params.Set("engine", "tas");
- right_analog_params.Set("pad", params.Get("pad", 0));
- right_analog_params.Set("axis_x", static_cast<int>(TasAxes::SubstickX));
- right_analog_params.Set("axis_y", static_cast<int>(TasAxes::SubstickY));
- mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params));
- return mapping;
-}
-
-const TasData& Tas::GetTasState(std::size_t pad) const {
- return tas_data[pad];
-}
-} // namespace TasInput
diff --git a/src/input_common/tas/tas_input.h b/src/input_common/tas/tas_input.h
deleted file mode 100644
index 3e2db8f00..000000000
--- a/src/input_common/tas/tas_input.h
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <array>
-
-#include "common/common_types.h"
-#include "common/settings_input.h"
-#include "core/frontend/input.h"
-#include "input_common/main.h"
-
-/*
-To play back TAS scripts on Yuzu, select the folder with scripts in the configuration menu below
-Tools -> Configure TAS. The file itself has normal text format and has to be called script0-1.txt
-for controller 1, script0-2.txt for controller 2 and so forth (with max. 8 players).
-
-A script file has the same format as TAS-nx uses, so final files will look like this:
-
-1 KEY_B 0;0 0;0
-6 KEY_ZL 0;0 0;0
-41 KEY_ZL;KEY_Y 0;0 0;0
-43 KEY_X;KEY_A 32767;0 0;0
-44 KEY_A 32767;0 0;0
-45 KEY_A 32767;0 0;0
-46 KEY_A 32767;0 0;0
-47 KEY_A 32767;0 0;0
-
-After placing the file at the correct location, it can be read into Yuzu with the (default) hotkey
-CTRL+F6 (refresh). In the bottom left corner, it will display the amount of frames the script file
-has. Playback can be started or stopped using CTRL+F5.
-
-However, for playback to actually work, the correct input device has to be selected: In the Controls
-menu, select TAS from the device list for the controller that the script should be played on.
-
-Recording a new script file is really simple: Just make sure that the proper device (not TAS) is
-connected on P1, and press CTRL+F7 to start recording. When done, just press the same keystroke
-again (CTRL+F7). The new script will be saved at the location previously selected, as the filename
-record.txt.
-
-For debugging purposes, the common controller debugger can be used (View -> Debugging -> Controller
-P1).
-*/
-
-namespace TasInput {
-
-constexpr size_t PLAYER_NUMBER = 8;
-
-using TasAnalog = std::pair<float, float>;
-
-enum class TasState {
- Running,
- Recording,
- Stopped,
-};
-
-enum class TasButton : u32 {
- BUTTON_A = 1U << 0,
- BUTTON_B = 1U << 1,
- BUTTON_X = 1U << 2,
- BUTTON_Y = 1U << 3,
- STICK_L = 1U << 4,
- STICK_R = 1U << 5,
- TRIGGER_L = 1U << 6,
- TRIGGER_R = 1U << 7,
- TRIGGER_ZL = 1U << 8,
- TRIGGER_ZR = 1U << 9,
- BUTTON_PLUS = 1U << 10,
- BUTTON_MINUS = 1U << 11,
- BUTTON_LEFT = 1U << 12,
- BUTTON_UP = 1U << 13,
- BUTTON_RIGHT = 1U << 14,
- BUTTON_DOWN = 1U << 15,
- BUTTON_SL = 1U << 16,
- BUTTON_SR = 1U << 17,
- BUTTON_HOME = 1U << 18,
- BUTTON_CAPTURE = 1U << 19,
-};
-
-enum class TasAxes : u8 {
- StickX,
- StickY,
- SubstickX,
- SubstickY,
- Undefined,
-};
-
-struct TasData {
- u32 buttons{};
- std::array<float, 4> axis{};
-};
-
-class Tas {
-public:
- Tas();
- ~Tas();
-
- // Changes the input status that will be stored in each frame
- void RecordInput(u32 buttons, const std::array<std::pair<float, float>, 2>& axes);
-
- // Main loop that records or executes input
- void UpdateThread();
-
- // Sets the flag to start or stop the TAS command excecution and swaps controllers profiles
- void StartStop();
-
- // Stop the TAS and reverts any controller profile
- void Stop();
-
- // Sets the flag to reload the file and start from the begining in the next update
- void Reset();
-
- /**
- * Sets the flag to enable or disable recording of inputs
- * @return Returns true if the current recording status is enabled
- */
- bool Record();
-
- // Saves contents of record_commands on a file if overwrite is enabled player 1 will be
- // overwritten with the recorded commands
- void SaveRecording(bool overwrite_file);
-
- /**
- * Returns the current status values of TAS playback/recording
- * @return Tuple of
- * TasState indicating the current state out of Running, Recording or Stopped ;
- * Current playback progress or amount of frames (so far) for Recording ;
- * Total length of script file currently loaded or amount of frames (so far) for Recording
- */
- std::tuple<TasState, size_t, size_t> GetStatus() const;
-
- // Retuns an array of the default button mappings
- InputCommon::ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) const;
-
- // Retuns an array of the default analog mappings
- InputCommon::AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) const;
- [[nodiscard]] const TasData& GetTasState(std::size_t pad) const;
-
-private:
- struct TASCommand {
- u32 buttons{};
- TasAnalog l_axis{};
- TasAnalog r_axis{};
- };
-
- // Loads TAS files from all players
- void LoadTasFiles();
-
- // Loads TAS file from the specified player
- void LoadTasFile(size_t player_index);
-
- // Writes a TAS file from the recorded commands
- void WriteTasFile(std::u8string file_name);
-
- /**
- * Parses a string containing the axis values with the following format "x;y"
- * X and Y have a range from -32767 to 32767
- * @return Returns a TAS analog object with axis values with range from -1.0 to 1.0
- */
- TasAnalog ReadCommandAxis(const std::string& line) const;
-
- /**
- * Parses a string containing the button values with the following format "a;b;c;d..."
- * Each button is represented by it's text format specified in text_to_tas_button array
- * @return Returns a u32 with each bit representing the status of a button
- */
- u32 ReadCommandButtons(const std::string& line) const;
-
- /**
- * Converts an u32 containing the button status into the text equivalent
- * @return Returns a string with the name of the buttons to be written to the file
- */
- std::string WriteCommandButtons(u32 data) const;
-
- /**
- * Converts an TAS analog object containing the axis status into the text equivalent
- * @return Returns a string with the value of the axis to be written to the file
- */
- std::string WriteCommandAxis(TasAnalog data) const;
-
- // Inverts the Y axis polarity
- std::pair<float, float> FlipAxisY(std::pair<float, float> old);
-
- /**
- * Converts an u32 containing the button status into the text equivalent
- * @return Returns a string with the name of the buttons to be printed on console
- */
- std::string DebugButtons(u32 buttons) const;
-
- /**
- * Converts an TAS analog object containing the axis status into the text equivalent
- * @return Returns a string with the value of the axis to be printed on console
- */
- std::string DebugJoystick(float x, float y) const;
-
- /**
- * Converts the given TAS status into the text equivalent
- * @return Returns a string with the value of the TAS status to be printed on console
- */
- std::string DebugInput(const TasData& data) const;
-
- /**
- * Converts the given TAS status of multiple players into the text equivalent
- * @return Returns a string with the value of the status of all TAS players to be printed on
- * console
- */
- std::string DebugInputs(const std::array<TasData, PLAYER_NUMBER>& arr) const;
-
- /**
- * Converts an u32 containing the button status into the text equivalent
- * @return Returns a string with the name of the buttons
- */
- std::string ButtonsToString(u32 button) const;
-
- // Stores current controller configuration and sets a TAS controller for every active controller
- // to the current config
- void SwapToTasController();
-
- // Sets the stored controller configuration to the current config
- void SwapToStoredController();
-
- size_t script_length{0};
- std::array<TasData, PLAYER_NUMBER> tas_data;
- bool is_old_input_saved{false};
- bool is_recording{false};
- bool is_running{false};
- bool needs_reset{false};
- std::array<std::vector<TASCommand>, PLAYER_NUMBER> commands{};
- std::vector<TASCommand> record_commands{};
- size_t current_command{0};
- TASCommand last_input{}; // only used for recording
-
- // Old settings for swapping controllers
- std::array<Settings::PlayerInput, 10> player_mappings;
-};
-} // namespace TasInput
diff --git a/src/input_common/tas/tas_poller.cpp b/src/input_common/tas/tas_poller.cpp
deleted file mode 100644
index 15810d6b0..000000000
--- a/src/input_common/tas/tas_poller.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2021 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <mutex>
-#include <utility>
-
-#include "common/settings.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/tas/tas_input.h"
-#include "input_common/tas/tas_poller.h"
-
-namespace InputCommon {
-
-class TasButton final : public Input::ButtonDevice {
-public:
- explicit TasButton(u32 button_, u32 pad_, const TasInput::Tas* tas_input_)
- : button(button_), pad(pad_), tas_input(tas_input_) {}
-
- bool GetStatus() const override {
- return (tas_input->GetTasState(pad).buttons & button) != 0;
- }
-
-private:
- const u32 button;
- const u32 pad;
- const TasInput::Tas* tas_input;
-};
-
-TasButtonFactory::TasButtonFactory(std::shared_ptr<TasInput::Tas> tas_input_)
- : tas_input(std::move(tas_input_)) {}
-
-std::unique_ptr<Input::ButtonDevice> TasButtonFactory::Create(const Common::ParamPackage& params) {
- const auto button_id = params.Get("button", 0);
- const auto pad = params.Get("pad", 0);
-
- return std::make_unique<TasButton>(button_id, pad, tas_input.get());
-}
-
-class TasAnalog final : public Input::AnalogDevice {
-public:
- explicit TasAnalog(u32 pad_, u32 axis_x_, u32 axis_y_, const TasInput::Tas* tas_input_)
- : pad(pad_), axis_x(axis_x_), axis_y(axis_y_), tas_input(tas_input_) {}
-
- float GetAxis(u32 axis) const {
- std::lock_guard lock{mutex};
- return tas_input->GetTasState(pad).axis.at(axis);
- }
-
- std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
- float x = GetAxis(analog_axis_x);
- float y = GetAxis(analog_axis_y);
-
- // Make sure the coordinates are in the unit circle,
- // otherwise normalize it.
- float r = x * x + y * y;
- if (r > 1.0f) {
- r = std::sqrt(r);
- x /= r;
- y /= r;
- }
-
- return {x, y};
- }
-
- std::tuple<float, float> GetStatus() const override {
- return GetAnalog(axis_x, axis_y);
- }
-
- Input::AnalogProperties GetAnalogProperties() const override {
- return {0.0f, 1.0f, 0.5f};
- }
-
-private:
- const u32 pad;
- const u32 axis_x;
- const u32 axis_y;
- const TasInput::Tas* tas_input;
- mutable std::mutex mutex;
-};
-
-/// An analog device factory that creates analog devices from GC Adapter
-TasAnalogFactory::TasAnalogFactory(std::shared_ptr<TasInput::Tas> tas_input_)
- : tas_input(std::move(tas_input_)) {}
-
-/**
- * Creates analog device from joystick axes
- * @param params contains parameters for creating the device:
- * - "port": the nth gcpad on the adapter
- * - "axis_x": the index of the axis to be bind as x-axis
- * - "axis_y": the index of the axis to be bind as y-axis
- */
-std::unique_ptr<Input::AnalogDevice> TasAnalogFactory::Create(const Common::ParamPackage& params) {
- const auto pad = static_cast<u32>(params.Get("pad", 0));
- const auto axis_x = static_cast<u32>(params.Get("axis_x", 0));
- const auto axis_y = static_cast<u32>(params.Get("axis_y", 1));
-
- return std::make_unique<TasAnalog>(pad, axis_x, axis_y, tas_input.get());
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/tas/tas_poller.h b/src/input_common/tas/tas_poller.h
deleted file mode 100644
index 09e426cef..000000000
--- a/src/input_common/tas/tas_poller.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include "core/frontend/input.h"
-#include "input_common/tas/tas_input.h"
-
-namespace InputCommon {
-
-/**
- * A button device factory representing a tas bot. It receives tas events and forward them
- * to all button devices it created.
- */
-class TasButtonFactory final : public Input::Factory<Input::ButtonDevice> {
-public:
- explicit TasButtonFactory(std::shared_ptr<TasInput::Tas> tas_input_);
-
- /**
- * Creates a button device from a button press
- * @param params contains parameters for creating the device:
- * - "code": the code of the key to bind with the button
- */
- std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override;
-
-private:
- std::shared_ptr<TasInput::Tas> tas_input;
-};
-
-/// An analog device factory that creates analog devices from tas
-class TasAnalogFactory final : public Input::Factory<Input::AnalogDevice> {
-public:
- explicit TasAnalogFactory(std::shared_ptr<TasInput::Tas> tas_input_);
-
- std::unique_ptr<Input::AnalogDevice> Create(const Common::ParamPackage& params) override;
-
-private:
- std::shared_ptr<TasInput::Tas> tas_input;
-};
-
-} // namespace InputCommon
diff --git a/src/input_common/touch_from_button.cpp b/src/input_common/touch_from_button.cpp
deleted file mode 100644
index 7878a56d7..000000000
--- a/src/input_common/touch_from_button.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2020 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <algorithm>
-#include "common/settings.h"
-#include "core/frontend/framebuffer_layout.h"
-#include "input_common/touch_from_button.h"
-
-namespace InputCommon {
-
-class TouchFromButtonDevice final : public Input::TouchDevice {
-public:
- TouchFromButtonDevice() {
- const auto button_index =
- static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue());
- const auto& buttons = Settings::values.touch_from_button_maps[button_index].buttons;
-
- for (const auto& config_entry : buttons) {
- const Common::ParamPackage package{config_entry};
- map.emplace_back(
- Input::CreateDevice<Input::ButtonDevice>(config_entry),
- std::clamp(package.Get("x", 0), 0, static_cast<int>(Layout::ScreenUndocked::Width)),
- std::clamp(package.Get("y", 0), 0,
- static_cast<int>(Layout::ScreenUndocked::Height)));
- }
- }
-
- Input::TouchStatus GetStatus() const override {
- Input::TouchStatus touch_status{};
- for (std::size_t id = 0; id < map.size() && id < touch_status.size(); ++id) {
- const bool state = std::get<0>(map[id])->GetStatus();
- if (state) {
- const float x = static_cast<float>(std::get<1>(map[id])) /
- static_cast<int>(Layout::ScreenUndocked::Width);
- const float y = static_cast<float>(std::get<2>(map[id])) /
- static_cast<int>(Layout::ScreenUndocked::Height);
- touch_status[id] = {x, y, true};
- }
- }
- return touch_status;
- }
-
-private:
- // A vector of the mapped button, its x and its y-coordinate
- std::vector<std::tuple<std::unique_ptr<Input::ButtonDevice>, int, int>> map;
-};
-
-std::unique_ptr<Input::TouchDevice> TouchFromButtonFactory::Create(const Common::ParamPackage&) {
- return std::make_unique<TouchFromButtonDevice>();
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/udp/client.cpp b/src/input_common/udp/client.cpp
deleted file mode 100644
index b9512aa2e..000000000
--- a/src/input_common/udp/client.cpp
+++ /dev/null
@@ -1,526 +0,0 @@
-// Copyright 2018 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <chrono>
-#include <cstring>
-#include <functional>
-#include <random>
-#include <thread>
-#include <boost/asio.hpp>
-#include "common/logging/log.h"
-#include "common/settings.h"
-#include "input_common/udp/client.h"
-#include "input_common/udp/protocol.h"
-
-using boost::asio::ip::udp;
-
-namespace InputCommon::CemuhookUDP {
-
-struct SocketCallback {
- std::function<void(Response::Version)> version;
- std::function<void(Response::PortInfo)> port_info;
- std::function<void(Response::PadData)> pad_data;
-};
-
-class Socket {
-public:
- using clock = std::chrono::system_clock;
-
- explicit Socket(const std::string& host, u16 port, SocketCallback callback_)
- : callback(std::move(callback_)), timer(io_service),
- socket(io_service, udp::endpoint(udp::v4(), 0)), client_id(GenerateRandomClientId()) {
- boost::system::error_code ec{};
- auto ipv4 = boost::asio::ip::make_address_v4(host, ec);
- if (ec.value() != boost::system::errc::success) {
- LOG_ERROR(Input, "Invalid IPv4 address \"{}\" provided to socket", host);
- ipv4 = boost::asio::ip::address_v4{};
- }
-
- send_endpoint = {udp::endpoint(ipv4, port)};
- }
-
- void Stop() {
- io_service.stop();
- }
-
- void Loop() {
- io_service.run();
- }
-
- void StartSend(const clock::time_point& from) {
- timer.expires_at(from + std::chrono::seconds(3));
- timer.async_wait([this](const boost::system::error_code& error) { HandleSend(error); });
- }
-
- void StartReceive() {
- socket.async_receive_from(
- boost::asio::buffer(receive_buffer), receive_endpoint,
- [this](const boost::system::error_code& error, std::size_t bytes_transferred) {
- HandleReceive(error, bytes_transferred);
- });
- }
-
-private:
- u32 GenerateRandomClientId() const {
- std::random_device device;
- return device();
- }
-
- void HandleReceive(const boost::system::error_code&, std::size_t bytes_transferred) {
- if (auto type = Response::Validate(receive_buffer.data(), bytes_transferred)) {
- switch (*type) {
- case Type::Version: {
- Response::Version version;
- std::memcpy(&version, &receive_buffer[sizeof(Header)], sizeof(Response::Version));
- callback.version(std::move(version));
- break;
- }
- case Type::PortInfo: {
- Response::PortInfo port_info;
- std::memcpy(&port_info, &receive_buffer[sizeof(Header)],
- sizeof(Response::PortInfo));
- callback.port_info(std::move(port_info));
- break;
- }
- case Type::PadData: {
- Response::PadData pad_data;
- std::memcpy(&pad_data, &receive_buffer[sizeof(Header)], sizeof(Response::PadData));
- SanitizeMotion(pad_data);
- callback.pad_data(std::move(pad_data));
- break;
- }
- }
- }
- StartReceive();
- }
-
- void HandleSend(const boost::system::error_code&) {
- boost::system::error_code _ignored{};
- // Send a request for getting port info for the pad
- const Request::PortInfo port_info{4, {0, 1, 2, 3}};
- const auto port_message = Request::Create(port_info, client_id);
- std::memcpy(&send_buffer1, &port_message, PORT_INFO_SIZE);
- socket.send_to(boost::asio::buffer(send_buffer1), send_endpoint, {}, _ignored);
-
- // Send a request for getting pad data for the pad
- const Request::PadData pad_data{
- Request::PadData::Flags::AllPorts,
- 0,
- EMPTY_MAC_ADDRESS,
- };
- const auto pad_message = Request::Create(pad_data, client_id);
- std::memcpy(send_buffer2.data(), &pad_message, PAD_DATA_SIZE);
- socket.send_to(boost::asio::buffer(send_buffer2), send_endpoint, {}, _ignored);
- StartSend(timer.expiry());
- }
-
- void SanitizeMotion(Response::PadData& data) {
- // Zero out any non number value
- if (!std::isnormal(data.gyro.pitch)) {
- data.gyro.pitch = 0;
- }
- if (!std::isnormal(data.gyro.roll)) {
- data.gyro.roll = 0;
- }
- if (!std::isnormal(data.gyro.yaw)) {
- data.gyro.yaw = 0;
- }
- if (!std::isnormal(data.accel.x)) {
- data.accel.x = 0;
- }
- if (!std::isnormal(data.accel.y)) {
- data.accel.y = 0;
- }
- if (!std::isnormal(data.accel.z)) {
- data.accel.z = 0;
- }
- }
-
- SocketCallback callback;
- boost::asio::io_service io_service;
- boost::asio::basic_waitable_timer<clock> timer;
- udp::socket socket;
-
- const u32 client_id;
-
- static constexpr std::size_t PORT_INFO_SIZE = sizeof(Message<Request::PortInfo>);
- static constexpr std::size_t PAD_DATA_SIZE = sizeof(Message<Request::PadData>);
- std::array<u8, PORT_INFO_SIZE> send_buffer1;
- std::array<u8, PAD_DATA_SIZE> send_buffer2;
- udp::endpoint send_endpoint;
-
- std::array<u8, MAX_PACKET_SIZE> receive_buffer;
- udp::endpoint receive_endpoint;
-};
-
-static void SocketLoop(Socket* socket) {
- socket->StartReceive();
- socket->StartSend(Socket::clock::now());
- socket->Loop();
-}
-
-Client::Client() {
- LOG_INFO(Input, "Udp Initialization started");
- finger_id.fill(MAX_TOUCH_FINGERS);
- ReloadSockets();
-}
-
-Client::~Client() {
- Reset();
-}
-
-Client::ClientConnection::ClientConnection() = default;
-
-Client::ClientConnection::~ClientConnection() = default;
-
-std::vector<Common::ParamPackage> Client::GetInputDevices() const {
- std::vector<Common::ParamPackage> devices;
- for (std::size_t pad = 0; pad < pads.size(); pad++) {
- if (!DeviceConnected(pad)) {
- continue;
- }
- std::string name = fmt::format("UDP Controller {}", pad);
- devices.emplace_back(Common::ParamPackage{
- {"class", "cemuhookudp"},
- {"display", std::move(name)},
- {"port", std::to_string(pad)},
- });
- }
- return devices;
-}
-
-bool Client::DeviceConnected(std::size_t pad) const {
- // Use last timestamp to detect if the socket has stopped sending data
- const auto now = std::chrono::steady_clock::now();
- const auto time_difference = static_cast<u64>(
- std::chrono::duration_cast<std::chrono::milliseconds>(now - pads[pad].last_update).count());
- return time_difference < 1000 && pads[pad].connected;
-}
-
-void Client::ReloadSockets() {
- Reset();
-
- std::stringstream servers_ss(static_cast<std::string>(Settings::values.udp_input_servers));
- std::string server_token;
- std::size_t client = 0;
- while (std::getline(servers_ss, server_token, ',')) {
- if (client == MAX_UDP_CLIENTS) {
- break;
- }
- std::stringstream server_ss(server_token);
- std::string token;
- std::getline(server_ss, token, ':');
- std::string udp_input_address = token;
- std::getline(server_ss, token, ':');
- char* temp;
- const u16 udp_input_port = static_cast<u16>(std::strtol(token.c_str(), &temp, 0));
- if (*temp != '\0') {
- LOG_ERROR(Input, "Port number is not valid {}", token);
- continue;
- }
-
- const std::size_t client_number = GetClientNumber(udp_input_address, udp_input_port);
- if (client_number != MAX_UDP_CLIENTS) {
- LOG_ERROR(Input, "Duplicated UDP servers found");
- continue;
- }
- StartCommunication(client++, udp_input_address, udp_input_port);
- }
-}
-
-std::size_t Client::GetClientNumber(std::string_view host, u16 port) const {
- for (std::size_t client = 0; client < clients.size(); client++) {
- if (clients[client].active == -1) {
- continue;
- }
- if (clients[client].host == host && clients[client].port == port) {
- return client;
- }
- }
- return MAX_UDP_CLIENTS;
-}
-
-void Client::OnVersion([[maybe_unused]] Response::Version data) {
- LOG_TRACE(Input, "Version packet received: {}", data.version);
-}
-
-void Client::OnPortInfo([[maybe_unused]] Response::PortInfo data) {
- LOG_TRACE(Input, "PortInfo packet received: {}", data.model);
-}
-
-void Client::OnPadData(Response::PadData data, std::size_t client) {
- const std::size_t pad_index = (client * PADS_PER_CLIENT) + data.info.id;
-
- if (pad_index >= pads.size()) {
- LOG_ERROR(Input, "Invalid pad id {}", data.info.id);
- return;
- }
-
- LOG_TRACE(Input, "PadData packet received");
- if (data.packet_counter == pads[pad_index].packet_sequence) {
- LOG_WARNING(
- Input,
- "PadData packet dropped because its stale info. Current count: {} Packet count: {}",
- pads[pad_index].packet_sequence, data.packet_counter);
- pads[pad_index].connected = false;
- return;
- }
-
- clients[client].active = 1;
- pads[pad_index].connected = true;
- pads[pad_index].packet_sequence = data.packet_counter;
-
- const auto now = std::chrono::steady_clock::now();
- const auto time_difference = static_cast<u64>(
- std::chrono::duration_cast<std::chrono::microseconds>(now - pads[pad_index].last_update)
- .count());
- pads[pad_index].last_update = now;
-
- const Common::Vec3f raw_gyroscope = {data.gyro.pitch, data.gyro.roll, -data.gyro.yaw};
- pads[pad_index].motion.SetAcceleration({data.accel.x, -data.accel.z, data.accel.y});
- // Gyroscope values are not it the correct scale from better joy.
- // Dividing by 312 allows us to make one full turn = 1 turn
- // This must be a configurable valued called sensitivity
- pads[pad_index].motion.SetGyroscope(raw_gyroscope / 312.0f);
- pads[pad_index].motion.UpdateRotation(time_difference);
- pads[pad_index].motion.UpdateOrientation(time_difference);
-
- {
- std::lock_guard guard(pads[pad_index].status.update_mutex);
- pads[pad_index].status.motion_status = pads[pad_index].motion.GetMotion();
-
- for (std::size_t id = 0; id < data.touch.size(); ++id) {
- UpdateTouchInput(data.touch[id], client, id);
- }
-
- if (configuring) {
- const Common::Vec3f gyroscope = pads[pad_index].motion.GetGyroscope();
- const Common::Vec3f accelerometer = pads[pad_index].motion.GetAcceleration();
- UpdateYuzuSettings(client, data.info.id, accelerometer, gyroscope);
- }
- }
-}
-
-void Client::StartCommunication(std::size_t client, const std::string& host, u16 port) {
- SocketCallback callback{[this](Response::Version version) { OnVersion(version); },
- [this](Response::PortInfo info) { OnPortInfo(info); },
- [this, client](Response::PadData data) { OnPadData(data, client); }};
- LOG_INFO(Input, "Starting communication with UDP input server on {}:{}", host, port);
- clients[client].host = host;
- clients[client].port = port;
- clients[client].active = 0;
- clients[client].socket = std::make_unique<Socket>(host, port, callback);
- clients[client].thread = std::thread{SocketLoop, clients[client].socket.get()};
-
- // Set motion parameters
- // SetGyroThreshold value should be dependent on GyroscopeZeroDriftMode
- // Real HW values are unknown, 0.0001 is an approximate to Standard
- for (std::size_t pad = 0; pad < PADS_PER_CLIENT; pad++) {
- pads[client * PADS_PER_CLIENT + pad].motion.SetGyroThreshold(0.0001f);
- }
-}
-
-void Client::Reset() {
- for (auto& client : clients) {
- if (client.thread.joinable()) {
- client.active = -1;
- client.socket->Stop();
- client.thread.join();
- }
- }
-}
-
-void Client::UpdateYuzuSettings(std::size_t client, std::size_t pad_index,
- const Common::Vec3<float>& acc, const Common::Vec3<float>& gyro) {
- if (gyro.Length() > 0.2f) {
- LOG_DEBUG(Input, "UDP Controller {}: gyro=({}, {}, {}), accel=({}, {}, {})", client,
- gyro[0], gyro[1], gyro[2], acc[0], acc[1], acc[2]);
- }
- UDPPadStatus pad{
- .host = clients[client].host,
- .port = clients[client].port,
- .pad_index = pad_index,
- };
- for (std::size_t i = 0; i < 3; ++i) {
- if (gyro[i] > 5.0f || gyro[i] < -5.0f) {
- pad.motion = static_cast<PadMotion>(i);
- pad.motion_value = gyro[i];
- pad_queue.Push(pad);
- }
- if (acc[i] > 1.75f || acc[i] < -1.75f) {
- pad.motion = static_cast<PadMotion>(i + 3);
- pad.motion_value = acc[i];
- pad_queue.Push(pad);
- }
- }
-}
-
-std::optional<std::size_t> Client::GetUnusedFingerID() const {
- std::size_t first_free_id = 0;
- while (first_free_id < MAX_TOUCH_FINGERS) {
- if (!std::get<2>(touch_status[first_free_id])) {
- return first_free_id;
- } else {
- first_free_id++;
- }
- }
- return std::nullopt;
-}
-
-void Client::UpdateTouchInput(Response::TouchPad& touch_pad, std::size_t client, std::size_t id) {
- // TODO: Use custom calibration per device
- const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue());
- const u16 min_x = static_cast<u16>(touch_param.Get("min_x", 100));
- const u16 min_y = static_cast<u16>(touch_param.Get("min_y", 50));
- const u16 max_x = static_cast<u16>(touch_param.Get("max_x", 1800));
- const u16 max_y = static_cast<u16>(touch_param.Get("max_y", 850));
- const std::size_t touch_id = client * 2 + id;
- if (touch_pad.is_active) {
- if (finger_id[touch_id] == MAX_TOUCH_FINGERS) {
- const auto first_free_id = GetUnusedFingerID();
- if (!first_free_id) {
- // Invalid finger id skip to next input
- return;
- }
- finger_id[touch_id] = *first_free_id;
- }
- auto& [x, y, pressed] = touch_status[finger_id[touch_id]];
- x = static_cast<float>(std::clamp(static_cast<u16>(touch_pad.x), min_x, max_x) - min_x) /
- static_cast<float>(max_x - min_x);
- y = static_cast<float>(std::clamp(static_cast<u16>(touch_pad.y), min_y, max_y) - min_y) /
- static_cast<float>(max_y - min_y);
- pressed = true;
- return;
- }
-
- if (finger_id[touch_id] != MAX_TOUCH_FINGERS) {
- touch_status[finger_id[touch_id]] = {};
- finger_id[touch_id] = MAX_TOUCH_FINGERS;
- }
-}
-
-void Client::BeginConfiguration() {
- pad_queue.Clear();
- configuring = true;
-}
-
-void Client::EndConfiguration() {
- pad_queue.Clear();
- configuring = false;
-}
-
-DeviceStatus& Client::GetPadState(const std::string& host, u16 port, std::size_t pad) {
- const std::size_t client_number = GetClientNumber(host, port);
- if (client_number == MAX_UDP_CLIENTS || pad >= PADS_PER_CLIENT) {
- return pads[0].status;
- }
- return pads[(client_number * PADS_PER_CLIENT) + pad].status;
-}
-
-const DeviceStatus& Client::GetPadState(const std::string& host, u16 port, std::size_t pad) const {
- const std::size_t client_number = GetClientNumber(host, port);
- if (client_number == MAX_UDP_CLIENTS || pad >= PADS_PER_CLIENT) {
- return pads[0].status;
- }
- return pads[(client_number * PADS_PER_CLIENT) + pad].status;
-}
-
-Input::TouchStatus& Client::GetTouchState() {
- return touch_status;
-}
-
-const Input::TouchStatus& Client::GetTouchState() const {
- return touch_status;
-}
-
-Common::SPSCQueue<UDPPadStatus>& Client::GetPadQueue() {
- return pad_queue;
-}
-
-const Common::SPSCQueue<UDPPadStatus>& Client::GetPadQueue() const {
- return pad_queue;
-}
-
-void TestCommunication(const std::string& host, u16 port,
- const std::function<void()>& success_callback,
- const std::function<void()>& failure_callback) {
- std::thread([=] {
- Common::Event success_event;
- SocketCallback callback{
- .version = [](Response::Version) {},
- .port_info = [](Response::PortInfo) {},
- .pad_data = [&](Response::PadData) { success_event.Set(); },
- };
- Socket socket{host, port, std::move(callback)};
- std::thread worker_thread{SocketLoop, &socket};
- const bool result =
- success_event.WaitUntil(std::chrono::steady_clock::now() + std::chrono::seconds(10));
- socket.Stop();
- worker_thread.join();
- if (result) {
- success_callback();
- } else {
- failure_callback();
- }
- }).detach();
-}
-
-CalibrationConfigurationJob::CalibrationConfigurationJob(
- const std::string& host, u16 port, std::function<void(Status)> status_callback,
- std::function<void(u16, u16, u16, u16)> data_callback) {
-
- std::thread([=, this] {
- Status current_status{Status::Initialized};
- SocketCallback callback{
- [](Response::Version) {}, [](Response::PortInfo) {},
- [&](Response::PadData data) {
- static constexpr u16 CALIBRATION_THRESHOLD = 100;
- static constexpr u16 MAX_VALUE = UINT16_MAX;
-
- if (current_status == Status::Initialized) {
- // Receiving data means the communication is ready now
- current_status = Status::Ready;
- status_callback(current_status);
- }
- const auto& touchpad_0 = data.touch[0];
- if (touchpad_0.is_active == 0) {
- return;
- }
- LOG_DEBUG(Input, "Current touch: {} {}", touchpad_0.x, touchpad_0.y);
- const u16 min_x = std::min(MAX_VALUE, static_cast<u16>(touchpad_0.x));
- const u16 min_y = std::min(MAX_VALUE, static_cast<u16>(touchpad_0.y));
- if (current_status == Status::Ready) {
- // First touch - min data (min_x/min_y)
- current_status = Status::Stage1Completed;
- status_callback(current_status);
- }
- if (touchpad_0.x - min_x > CALIBRATION_THRESHOLD &&
- touchpad_0.y - min_y > CALIBRATION_THRESHOLD) {
- // Set the current position as max value and finishes configuration
- const u16 max_x = touchpad_0.x;
- const u16 max_y = touchpad_0.y;
- current_status = Status::Completed;
- data_callback(min_x, min_y, max_x, max_y);
- status_callback(current_status);
-
- complete_event.Set();
- }
- }};
- Socket socket{host, port, std::move(callback)};
- std::thread worker_thread{SocketLoop, &socket};
- complete_event.Wait();
- socket.Stop();
- worker_thread.join();
- }).detach();
-}
-
-CalibrationConfigurationJob::~CalibrationConfigurationJob() {
- Stop();
-}
-
-void CalibrationConfigurationJob::Stop() {
- complete_event.Set();
-}
-
-} // namespace InputCommon::CemuhookUDP
diff --git a/src/input_common/udp/udp.cpp b/src/input_common/udp/udp.cpp
deleted file mode 100644
index 9829da6f0..000000000
--- a/src/input_common/udp/udp.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <mutex>
-#include <utility>
-#include "common/assert.h"
-#include "common/threadsafe_queue.h"
-#include "input_common/udp/client.h"
-#include "input_common/udp/udp.h"
-
-namespace InputCommon {
-
-class UDPMotion final : public Input::MotionDevice {
-public:
- explicit UDPMotion(std::string ip_, u16 port_, u16 pad_, CemuhookUDP::Client* client_)
- : ip(std::move(ip_)), port(port_), pad(pad_), client(client_) {}
-
- Input::MotionStatus GetStatus() const override {
- return client->GetPadState(ip, port, pad).motion_status;
- }
-
-private:
- const std::string ip;
- const u16 port;
- const u16 pad;
- CemuhookUDP::Client* client;
- mutable std::mutex mutex;
-};
-
-/// A motion device factory that creates motion devices from a UDP client
-UDPMotionFactory::UDPMotionFactory(std::shared_ptr<CemuhookUDP::Client> client_)
- : client(std::move(client_)) {}
-
-/**
- * Creates motion device
- * @param params contains parameters for creating the device:
- * - "port": the UDP port number
- */
-std::unique_ptr<Input::MotionDevice> UDPMotionFactory::Create(const Common::ParamPackage& params) {
- auto ip = params.Get("ip", "127.0.0.1");
- const auto port = static_cast<u16>(params.Get("port", 26760));
- const auto pad = static_cast<u16>(params.Get("pad_index", 0));
-
- return std::make_unique<UDPMotion>(std::move(ip), port, pad, client.get());
-}
-
-void UDPMotionFactory::BeginConfiguration() {
- polling = true;
- client->BeginConfiguration();
-}
-
-void UDPMotionFactory::EndConfiguration() {
- polling = false;
- client->EndConfiguration();
-}
-
-Common::ParamPackage UDPMotionFactory::GetNextInput() {
- Common::ParamPackage params;
- CemuhookUDP::UDPPadStatus pad;
- auto& queue = client->GetPadQueue();
- while (queue.Pop(pad)) {
- if (pad.motion == CemuhookUDP::PadMotion::Undefined || std::abs(pad.motion_value) < 1) {
- continue;
- }
- params.Set("engine", "cemuhookudp");
- params.Set("ip", pad.host);
- params.Set("port", static_cast<u16>(pad.port));
- params.Set("pad_index", static_cast<u16>(pad.pad_index));
- params.Set("motion", static_cast<u16>(pad.motion));
- return params;
- }
- return params;
-}
-
-class UDPTouch final : public Input::TouchDevice {
-public:
- explicit UDPTouch(std::string ip_, u16 port_, u16 pad_, CemuhookUDP::Client* client_)
- : ip(std::move(ip_)), port(port_), pad(pad_), client(client_) {}
-
- Input::TouchStatus GetStatus() const override {
- return client->GetTouchState();
- }
-
-private:
- const std::string ip;
- [[maybe_unused]] const u16 port;
- [[maybe_unused]] const u16 pad;
- CemuhookUDP::Client* client;
- mutable std::mutex mutex;
-};
-
-/// A motion device factory that creates motion devices from a UDP client
-UDPTouchFactory::UDPTouchFactory(std::shared_ptr<CemuhookUDP::Client> client_)
- : client(std::move(client_)) {}
-
-/**
- * Creates motion device
- * @param params contains parameters for creating the device:
- * - "port": the UDP port number
- */
-std::unique_ptr<Input::TouchDevice> UDPTouchFactory::Create(const Common::ParamPackage& params) {
- auto ip = params.Get("ip", "127.0.0.1");
- const auto port = static_cast<u16>(params.Get("port", 26760));
- const auto pad = static_cast<u16>(params.Get("pad_index", 0));
-
- return std::make_unique<UDPTouch>(std::move(ip), port, pad, client.get());
-}
-
-} // namespace InputCommon
diff --git a/src/input_common/udp/udp.h b/src/input_common/udp/udp.h
deleted file mode 100644
index ea3fd4175..000000000
--- a/src/input_common/udp/udp.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2020 yuzu Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include "core/frontend/input.h"
-#include "input_common/udp/client.h"
-
-namespace InputCommon {
-
-/// A motion device factory that creates motion devices from udp clients
-class UDPMotionFactory final : public Input::Factory<Input::MotionDevice> {
-public:
- explicit UDPMotionFactory(std::shared_ptr<CemuhookUDP::Client> client_);
-
- std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput();
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<CemuhookUDP::Client> client;
- bool polling = false;
-};
-
-/// A touch device factory that creates touch devices from udp clients
-class UDPTouchFactory final : public Input::Factory<Input::TouchDevice> {
-public:
- explicit UDPTouchFactory(std::shared_ptr<CemuhookUDP::Client> client_);
-
- std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage& params) override;
-
- Common::ParamPackage GetNextInput();
-
- /// For device input configuration/polling
- void BeginConfiguration();
- void EndConfiguration();
-
- bool IsPolling() const {
- return polling;
- }
-
-private:
- std::shared_ptr<CemuhookUDP::Client> client;
- bool polling = false;
-};
-
-} // namespace InputCommon
diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt
index bc3df80c8..4c76ce1ea 100644
--- a/src/shader_recompiler/CMakeLists.txt
+++ b/src/shader_recompiler/CMakeLists.txt
@@ -1,7 +1,5 @@
add_library(shader_recompiler STATIC
backend/bindings.h
- backend/glasm/emit_context.cpp
- backend/glasm/emit_context.h
backend/glasm/emit_glasm.cpp
backend/glasm/emit_glasm.h
backend/glasm/emit_glasm_barriers.cpp
@@ -22,10 +20,10 @@ add_library(shader_recompiler STATIC
backend/glasm/emit_glasm_special.cpp
backend/glasm/emit_glasm_undefined.cpp
backend/glasm/emit_glasm_warp.cpp
+ backend/glasm/glasm_emit_context.cpp
+ backend/glasm/glasm_emit_context.h
backend/glasm/reg_alloc.cpp
backend/glasm/reg_alloc.h
- backend/glsl/emit_context.cpp
- backend/glsl/emit_context.h
backend/glsl/emit_glsl.cpp
backend/glsl/emit_glsl.h
backend/glsl/emit_glsl_atomic.cpp
@@ -47,10 +45,10 @@ add_library(shader_recompiler STATIC
backend/glsl/emit_glsl_special.cpp
backend/glsl/emit_glsl_undefined.cpp
backend/glsl/emit_glsl_warp.cpp
+ backend/glsl/glsl_emit_context.cpp
+ backend/glsl/glsl_emit_context.h
backend/glsl/var_alloc.cpp
backend/glsl/var_alloc.h
- backend/spirv/emit_context.cpp
- backend/spirv/emit_context.h
backend/spirv/emit_spirv.cpp
backend/spirv/emit_spirv.h
backend/spirv/emit_spirv_atomic.cpp
@@ -72,6 +70,8 @@ add_library(shader_recompiler STATIC
backend/spirv/emit_spirv_special.cpp
backend/spirv/emit_spirv_undefined.cpp
backend/spirv/emit_spirv_warp.cpp
+ backend/spirv/spirv_emit_context.cpp
+ backend/spirv/spirv_emit_context.h
environment.h
exception.h
frontend/ir/abstract_syntax_list.h
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index 004658546..42eff443f 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
@@ -9,9 +9,9 @@
#include "common/div_ceil.h"
#include "common/settings.h"
#include "shader_recompiler/backend/bindings.h"
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/ir_emitter.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp
index e69de29bb..c0b97683e 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_barriers.cpp
@@ -0,0 +1,22 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
+
+namespace Shader::Backend::GLASM {
+
+void EmitBarrier(EmitContext& ctx) {
+ ctx.Add("BAR;");
+}
+
+void EmitWorkgroupMemoryBarrier(EmitContext& ctx) {
+ ctx.Add("MEMBAR.CTA;");
+}
+
+void EmitDeviceMemoryBarrier(EmitContext& ctx) {
+ ctx.Add("MEMBAR;");
+}
+
+} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp
index 9201ccd39..3bfcbbe65 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_bitwise_conversion.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLASM {
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp
index bff0b7c1c..babbe6654 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_composite.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLASM {
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
index 02c9dc6d7..081b2c8e0 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
#include "shader_recompiler/shader_info.h"
@@ -335,6 +335,35 @@ void EmitSetFragDepth(EmitContext& ctx, ScalarF32 value) {
ctx.Add("MOV.F result.depth.z,{};", value);
}
+void EmitWorkgroupId(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {},invocation.groupid;", inst);
+}
+
+void EmitLocalInvocationId(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {},invocation.localid;", inst);
+}
+
+void EmitInvocationId(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,primitive_invocation.x;", inst);
+}
+
+void EmitSampleId(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,fragment.sampleid.x;", inst);
+}
+
+void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,fragment.helperthread.x;", inst);
+}
+
+void EmitYDirection(EmitContext& ctx, IR::Inst& inst) {
+ ctx.uses_y_direction = true;
+ ctx.Add("MOV.F {}.x,y_direction[0].w;", inst);
+}
+
+void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.F {}.x,scaling[0].z;", inst);
+}
+
void EmitLoadLocal(EmitContext& ctx, IR::Inst& inst, ScalarU32 word_offset) {
ctx.Add("MOV.U {},lmem[{}].x;", inst, word_offset);
}
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp
index e69de29bb..8a14fc8d9 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_control_flow.cpp
@@ -0,0 +1,18 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
+
+namespace Shader::Backend::GLASM {
+
+void EmitJoin(EmitContext&) {
+ throw NotImplementedException("Join shouldn't be emitted");
+}
+
+void EmitDemoteToHelperInvocation(EmitContext& ctx) {
+ ctx.Add("KIL TR.x;");
+}
+
+} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp
index ccdf1cbc8..4cff70fe4 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_convert.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
#include "shader_recompiler/frontend/ir/value.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp
index 4ed58619d..356640471 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
#include "shader_recompiler/frontend/ir/value.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
index d325d31c7..237a5af3f 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
@@ -4,8 +4,8 @@
#include <utility>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
#include "shader_recompiler/frontend/ir/value.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
index 8aa494a4d..f698b8b9b 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLASM {
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp
index e69de29bb..eed7bfec2 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_logical.cpp
@@ -0,0 +1,26 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
+
+namespace Shader::Backend::GLASM {
+
+void EmitLogicalOr(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
+ ctx.Add("OR.S {},{},{};", inst, a, b);
+}
+
+void EmitLogicalAnd(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
+ ctx.Add("AND.S {},{},{};", inst, a, b);
+}
+
+void EmitLogicalXor(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
+ ctx.Add("XOR.S {},{},{};", inst, a, b);
+}
+
+void EmitLogicalNot(EmitContext& ctx, IR::Inst& inst, ScalarS32 value) {
+ ctx.Add("SEQ.S {},{},0;", inst, value);
+}
+
+} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp
index af9fac7c1..f135b67f5 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/runtime_info.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
index 681aeda8d..86287ee3f 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/frontend/ir/value.h"
@@ -17,110 +17,6 @@ namespace Shader::Backend::GLASM {
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)
-static void DefinePhi(EmitContext& ctx, IR::Inst& phi) {
- switch (phi.Type()) {
- case IR::Type::U1:
- case IR::Type::U32:
- case IR::Type::F32:
- ctx.reg_alloc.Define(phi);
- break;
- case IR::Type::U64:
- case IR::Type::F64:
- ctx.reg_alloc.LongDefine(phi);
- break;
- default:
- throw NotImplementedException("Phi node type {}", phi.Type());
- }
-}
-
-void EmitPhi(EmitContext& ctx, IR::Inst& phi) {
- const size_t num_args{phi.NumArgs()};
- for (size_t i = 0; i < num_args; ++i) {
- ctx.reg_alloc.Consume(phi.Arg(i));
- }
- if (!phi.Definition<Id>().is_valid) {
- // The phi node wasn't forward defined
- DefinePhi(ctx, phi);
- }
-}
-
-void EmitVoid(EmitContext&) {}
-
-void EmitReference(EmitContext& ctx, const IR::Value& value) {
- ctx.reg_alloc.Consume(value);
-}
-
-void EmitPhiMove(EmitContext& ctx, const IR::Value& phi_value, const IR::Value& value) {
- IR::Inst& phi{RegAlloc::AliasInst(*phi_value.Inst())};
- if (!phi.Definition<Id>().is_valid) {
- // The phi node wasn't forward defined
- DefinePhi(ctx, phi);
- }
- const Register phi_reg{ctx.reg_alloc.Consume(IR::Value{&phi})};
- const Value eval_value{ctx.reg_alloc.Consume(value)};
-
- if (phi_reg == eval_value) {
- return;
- }
- switch (phi.Flags<IR::Type>()) {
- case IR::Type::U1:
- case IR::Type::U32:
- case IR::Type::F32:
- ctx.Add("MOV.S {}.x,{};", phi_reg, ScalarS32{eval_value});
- break;
- case IR::Type::U64:
- case IR::Type::F64:
- ctx.Add("MOV.U64 {}.x,{};", phi_reg, ScalarRegister{eval_value});
- break;
- default:
- throw NotImplementedException("Phi node type {}", phi.Type());
- }
-}
-
-void EmitJoin(EmitContext& ctx) {
- NotImplemented();
-}
-
-void EmitDemoteToHelperInvocation(EmitContext& ctx) {
- ctx.Add("KIL TR.x;");
-}
-
-void EmitBarrier(EmitContext& ctx) {
- ctx.Add("BAR;");
-}
-
-void EmitWorkgroupMemoryBarrier(EmitContext& ctx) {
- ctx.Add("MEMBAR.CTA;");
-}
-
-void EmitDeviceMemoryBarrier(EmitContext& ctx) {
- ctx.Add("MEMBAR;");
-}
-
-void EmitPrologue(EmitContext& ctx) {
- // TODO
-}
-
-void EmitEpilogue(EmitContext& ctx) {
- // TODO
-}
-
-void EmitEmitVertex(EmitContext& ctx, ScalarS32 stream) {
- if (stream.type == Type::U32 && stream.imm_u32 == 0) {
- ctx.Add("EMIT;");
- } else {
- ctx.Add("EMITS {};", stream);
- }
-}
-
-void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream) {
- if (!stream.IsImmediate()) {
- LOG_WARNING(Shader_GLASM, "Stream is not immediate");
- }
- ctx.reg_alloc.Consume(stream);
- ctx.Add("ENDPRIM;");
-}
-
void EmitGetRegister(EmitContext& ctx) {
NotImplemented();
}
@@ -185,55 +81,6 @@ void EmitSetOFlag(EmitContext& ctx) {
NotImplemented();
}
-void EmitWorkgroupId(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {},invocation.groupid;", inst);
-}
-
-void EmitLocalInvocationId(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {},invocation.localid;", inst);
-}
-
-void EmitInvocationId(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,primitive_invocation.x;", inst);
-}
-
-void EmitSampleId(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,fragment.sampleid.x;", inst);
-}
-
-void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,fragment.helperthread.x;", inst);
-}
-
-void EmitYDirection(EmitContext& ctx, IR::Inst& inst) {
- ctx.uses_y_direction = true;
- ctx.Add("MOV.F {}.x,y_direction[0].w;", inst);
-}
-
-void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.F {}.x,scaling[0].z;", inst);
-}
-
-void EmitUndefU1(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,0;", inst);
-}
-
-void EmitUndefU8(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,0;", inst);
-}
-
-void EmitUndefU16(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,0;", inst);
-}
-
-void EmitUndefU32(EmitContext& ctx, IR::Inst& inst) {
- ctx.Add("MOV.S {}.x,0;", inst);
-}
-
-void EmitUndefU64(EmitContext& ctx, IR::Inst& inst) {
- ctx.LongAdd("MOV.S64 {}.x,0;", inst);
-}
-
void EmitGetZeroFromOp(EmitContext& ctx) {
NotImplemented();
}
@@ -258,20 +105,4 @@ void EmitGetInBoundsFromOp(EmitContext& ctx) {
NotImplemented();
}
-void EmitLogicalOr(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
- ctx.Add("OR.S {},{},{};", inst, a, b);
-}
-
-void EmitLogicalAnd(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
- ctx.Add("AND.S {},{},{};", inst, a, b);
-}
-
-void EmitLogicalXor(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) {
- ctx.Add("XOR.S {},{},{};", inst, a, b);
-}
-
-void EmitLogicalNot(EmitContext& ctx, IR::Inst& inst, ScalarS32 value) {
- ctx.Add("SEQ.S {},{},0;", inst, value);
-}
-
} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_select.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_select.cpp
index 68fff613c..dc441c56d 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_select.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_select.cpp
@@ -3,8 +3,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLASM {
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp
index c1498f449..39e1c6c3a 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_shared_memory.cpp
@@ -3,8 +3,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLASM {
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_special.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_special.cpp
index e69de29bb..e7a5fb13a 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_special.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_special.cpp
@@ -0,0 +1,95 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
+#include "shader_recompiler/frontend/ir/value.h"
+
+namespace Shader::Backend::GLASM {
+
+static void DefinePhi(EmitContext& ctx, IR::Inst& phi) {
+ switch (phi.Type()) {
+ case IR::Type::U1:
+ case IR::Type::U32:
+ case IR::Type::F32:
+ ctx.reg_alloc.Define(phi);
+ break;
+ case IR::Type::U64:
+ case IR::Type::F64:
+ ctx.reg_alloc.LongDefine(phi);
+ break;
+ default:
+ throw NotImplementedException("Phi node type {}", phi.Type());
+ }
+}
+
+void EmitPhi(EmitContext& ctx, IR::Inst& phi) {
+ const size_t num_args{phi.NumArgs()};
+ for (size_t i = 0; i < num_args; ++i) {
+ ctx.reg_alloc.Consume(phi.Arg(i));
+ }
+ if (!phi.Definition<Id>().is_valid) {
+ // The phi node wasn't forward defined
+ DefinePhi(ctx, phi);
+ }
+}
+
+void EmitVoid(EmitContext&) {}
+
+void EmitReference(EmitContext& ctx, const IR::Value& value) {
+ ctx.reg_alloc.Consume(value);
+}
+
+void EmitPhiMove(EmitContext& ctx, const IR::Value& phi_value, const IR::Value& value) {
+ IR::Inst& phi{RegAlloc::AliasInst(*phi_value.Inst())};
+ if (!phi.Definition<Id>().is_valid) {
+ // The phi node wasn't forward defined
+ DefinePhi(ctx, phi);
+ }
+ const Register phi_reg{ctx.reg_alloc.Consume(IR::Value{&phi})};
+ const Value eval_value{ctx.reg_alloc.Consume(value)};
+
+ if (phi_reg == eval_value) {
+ return;
+ }
+ switch (phi.Flags<IR::Type>()) {
+ case IR::Type::U1:
+ case IR::Type::U32:
+ case IR::Type::F32:
+ ctx.Add("MOV.S {}.x,{};", phi_reg, ScalarS32{eval_value});
+ break;
+ case IR::Type::U64:
+ case IR::Type::F64:
+ ctx.Add("MOV.U64 {}.x,{};", phi_reg, ScalarRegister{eval_value});
+ break;
+ default:
+ throw NotImplementedException("Phi node type {}", phi.Type());
+ }
+}
+
+void EmitPrologue(EmitContext&) {
+ // TODO
+}
+
+void EmitEpilogue(EmitContext&) {
+ // TODO
+}
+
+void EmitEmitVertex(EmitContext& ctx, ScalarS32 stream) {
+ if (stream.type == Type::U32 && stream.imm_u32 == 0) {
+ ctx.Add("EMIT;");
+ } else {
+ ctx.Add("EMITS {};", stream);
+ }
+}
+
+void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream) {
+ if (!stream.IsImmediate()) {
+ LOG_WARNING(Shader_GLASM, "Stream is not immediate");
+ }
+ ctx.reg_alloc.Consume(stream);
+ ctx.Add("ENDPRIM;");
+}
+
+} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp
index e69de29bb..875e9d991 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_undefined.cpp
@@ -0,0 +1,30 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
+
+namespace Shader::Backend::GLASM {
+
+void EmitUndefU1(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,0;", inst);
+}
+
+void EmitUndefU8(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,0;", inst);
+}
+
+void EmitUndefU16(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,0;", inst);
+}
+
+void EmitUndefU32(EmitContext& ctx, IR::Inst& inst) {
+ ctx.Add("MOV.S {}.x,0;", inst);
+}
+
+void EmitUndefU64(EmitContext& ctx, IR::Inst& inst) {
+ ctx.LongAdd("MOV.S64 {}.x,0;", inst);
+}
+
+} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp
index 544d475b4..32e0dd923 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_warp.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_context.cpp b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp
index 8fd459dfe..0401953f7 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.cpp
+++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp
@@ -5,8 +5,8 @@
#include <string_view>
#include "shader_recompiler/backend/bindings.h"
-#include "shader_recompiler/backend/glasm/emit_context.h"
#include "shader_recompiler/backend/glasm/emit_glasm.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/profile.h"
#include "shader_recompiler/runtime_info.h"
diff --git a/src/shader_recompiler/backend/glasm/emit_context.h b/src/shader_recompiler/backend/glasm/glasm_emit_context.h
index 8433e5c00..8433e5c00 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.h
+++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.h
diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.cpp b/src/shader_recompiler/backend/glasm/reg_alloc.cpp
index 4c046db6e..201e428c1 100644
--- a/src/shader_recompiler/backend/glasm/reg_alloc.cpp
+++ b/src/shader_recompiler/backend/glasm/reg_alloc.cpp
@@ -6,7 +6,7 @@
#include <fmt/format.h>
-#include "shader_recompiler/backend/glasm/emit_context.h"
+#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/backend/glasm/reg_alloc.h"
#include "shader_recompiler/exception.h"
#include "shader_recompiler/frontend/ir/value.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
index 8a430d573..78b2eeaa2 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
@@ -9,9 +9,9 @@
#include "common/div_ceil.h"
#include "common/settings.h"
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/ir_emitter.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
index 772acc5a4..dc377b053 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_atomic.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp
index e1d1b558e..8a9faa394 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_barriers.cpp
@@ -2,8 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp
index 3c1714e89..0f2668d9e 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_bitwise_conversion.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
index 49a66e3ec..98cc57e58 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
index 4c26f3829..1920047f4 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
#include "shader_recompiler/runtime_info.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp
index 53f8896be..c86465e8b 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_control_flow.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/exception.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp
index eeae6562c..ce6ea1bb7 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_convert.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp
index d423bfb1b..b765a251b 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_floating_point.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
#include "shader_recompiler/frontend/ir/value.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp
index 2f78d0267..fae2e397a 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
index 88c1d4c5e..44060df33 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp
index 338ff4bd6..742fec9cf 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_logical.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp
index e3957491f..9fd41b4fd 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp
index f420fe388..4ebdfb3bc 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#ifdef _MSC_VER
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_select.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_select.cpp
index 49fba9073..b1e486e5f 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_select.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_select.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
index 518b78f06..74ae345e5 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
index 67f9dad68..b8ddafe48 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp
index 15bf02dd6..cace1db85 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_undefined.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
namespace Shader::Backend::GLSL {
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
index cd285e2c8..6e01979b4 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl_warp.cpp
@@ -4,8 +4,8 @@
#include <string_view>
-#include "shader_recompiler/backend/glsl/emit_context.h"
#include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h"
#include "shader_recompiler/profile.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp
index 97bd59302..1de017e76 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp
@@ -3,7 +3,7 @@
// Refer to the license.txt file included.
#include "shader_recompiler/backend/bindings.h"
-#include "shader_recompiler/backend/glsl/emit_context.h"
+#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/profile.h"
#include "shader_recompiler/runtime_info.h"
diff --git a/src/shader_recompiler/backend/glsl/emit_context.h b/src/shader_recompiler/backend/glsl/glsl_emit_context.h
index d9b639d29..d9b639d29 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.h
+++ b/src/shader_recompiler/backend/glsl/glsl_emit_context.h
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index d7a86e270..6ce7ed12a 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -11,6 +11,7 @@
#include "common/settings.h"
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/program.h"
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index 4b25534ce..b412957c7 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -6,13 +6,11 @@
#include <vector>
-#include <sirit/sirit.h>
-
#include "common/common_types.h"
#include "shader_recompiler/backend/bindings.h"
-#include "shader_recompiler/backend/spirv/emit_context.h"
#include "shader_recompiler/frontend/ir/program.h"
#include "shader_recompiler/profile.h"
+#include "shader_recompiler/runtime_info.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
index 9af8bb9e1..0d37b405c 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
index e0b52a001..9ce95a41b 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
namespace Shader::Backend::SPIRV {
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 bb11f4f4e..02d1e63f7 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
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 10ff4ecab..5c3e1ee2b 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
namespace Shader::Backend::SPIRV {
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 bac683ae1..ad84966b5 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
@@ -7,6 +7,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
index d33486f28..1eca3aa85 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
index fd42b7a16..832de2452 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
index 61cf25f9c..0cdc46495 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 4d168a96d..d18d5f1d5 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -6,6 +6,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
index d7f1a365a..a96190bc6 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
#include "shader_recompiler/frontend/ir/modifiers.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
index 50277eec3..44521f539 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
index b9a9500fc..47745f7ee 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
index 679ee2684..175f4be19 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
@@ -6,6 +6,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
index c5b4f4720..48caf1ffc 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
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 9a79fc7a2..330c9052c 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
index 9e7eb3cb1..d96a17583 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
index c9f469e90..b5766fc52 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
index cef52c56e..7034228bf 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
@@ -4,6 +4,7 @@
#include "shader_recompiler/backend/spirv/emit_spirv.h"
#include "shader_recompiler/backend/spirv/emit_spirv_instructions.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
index 723455462..4b6f792bf 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
@@ -13,8 +13,8 @@
#include "common/common_types.h"
#include "common/div_ceil.h"
-#include "shader_recompiler/backend/spirv/emit_context.h"
#include "shader_recompiler/backend/spirv/emit_spirv.h"
+#include "shader_recompiler/backend/spirv/spirv_emit_context.h"
namespace Shader::Backend::SPIRV {
namespace {
diff --git a/src/shader_recompiler/backend/spirv/emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h
index 63f8185d9..63f8185d9 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.h
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h
diff --git a/src/shader_recompiler/environment.h b/src/shader_recompiler/environment.h
index 8369d0d84..b4df73e8a 100644
--- a/src/shader_recompiler/environment.h
+++ b/src/shader_recompiler/environment.h
@@ -1,3 +1,7 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
#pragma once
#include <array>
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 91a30fef7..6a6325e38 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -3,6 +3,7 @@ add_subdirectory(host_shaders)
if(LIBVA_FOUND)
set_source_files_properties(command_classes/codecs/codec.cpp
PROPERTIES COMPILE_DEFINITIONS LIBVA_FOUND=1)
+ list(APPEND FFmpeg_LIBRARIES ${LIBVA_LIBRARIES})
endif()
add_library(video_core STATIC
diff --git a/src/video_core/command_classes/codecs/codec.cpp b/src/video_core/command_classes/codecs/codec.cpp
index 916277811..2a532b883 100644
--- a/src/video_core/command_classes/codecs/codec.cpp
+++ b/src/video_core/command_classes/codecs/codec.cpp
@@ -2,6 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
+#include <cstdio>
#include <fstream>
#include <vector>
#include "common/assert.h"
@@ -15,12 +17,28 @@
extern "C" {
#include <libavutil/opt.h>
+#ifdef LIBVA_FOUND
+// for querying VAAPI driver information
+#include <libavutil/hwcontext_vaapi.h>
+#endif
}
namespace Tegra {
namespace {
constexpr AVPixelFormat PREFERRED_GPU_FMT = AV_PIX_FMT_NV12;
constexpr AVPixelFormat PREFERRED_CPU_FMT = AV_PIX_FMT_YUV420P;
+constexpr std::array PREFERRED_GPU_DECODERS = {
+ AV_HWDEVICE_TYPE_CUDA,
+#ifdef _WIN32
+ AV_HWDEVICE_TYPE_D3D11VA,
+ AV_HWDEVICE_TYPE_DXVA2,
+#elif defined(__linux__)
+ AV_HWDEVICE_TYPE_VAAPI,
+ AV_HWDEVICE_TYPE_VDPAU,
+#endif
+ // last resort for Linux Flatpak (w/ NVIDIA)
+ AV_HWDEVICE_TYPE_VULKAN,
+};
void AVPacketDeleter(AVPacket* ptr) {
av_packet_free(&ptr);
@@ -59,46 +77,50 @@ Codec::~Codec() {
av_buffer_unref(&av_gpu_decoder);
}
+// List all the currently available hwcontext in ffmpeg
+static std::vector<AVHWDeviceType> ListSupportedContexts() {
+ std::vector<AVHWDeviceType> contexts{};
+ AVHWDeviceType current_device_type = AV_HWDEVICE_TYPE_NONE;
+ do {
+ current_device_type = av_hwdevice_iterate_types(current_device_type);
+ contexts.push_back(current_device_type);
+ } while (current_device_type != AV_HWDEVICE_TYPE_NONE);
+ return contexts;
+}
+
bool Codec::CreateGpuAvDevice() {
-#if defined(LIBVA_FOUND)
- static constexpr std::array<const char*, 3> VAAPI_DRIVERS = {
- "i915",
- "iHD",
- "amdgpu",
- };
- AVDictionary* hwdevice_options = nullptr;
- av_dict_set(&hwdevice_options, "connection_type", "drm", 0);
- for (const auto& driver : VAAPI_DRIVERS) {
- av_dict_set(&hwdevice_options, "kernel_driver", driver, 0);
- const int hwdevice_error = av_hwdevice_ctx_create(&av_gpu_decoder, AV_HWDEVICE_TYPE_VAAPI,
- nullptr, hwdevice_options, 0);
- if (hwdevice_error >= 0) {
- LOG_INFO(Service_NVDRV, "Using VA-API with {}", driver);
- av_dict_free(&hwdevice_options);
- av_codec_ctx->pix_fmt = AV_PIX_FMT_VAAPI;
- return true;
- }
- LOG_DEBUG(Service_NVDRV, "VA-API av_hwdevice_ctx_create failed {}", hwdevice_error);
- }
- LOG_DEBUG(Service_NVDRV, "VA-API av_hwdevice_ctx_create failed for all drivers");
- av_dict_free(&hwdevice_options);
-#endif
static constexpr auto HW_CONFIG_METHOD = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX;
- static constexpr std::array GPU_DECODER_TYPES{
- AV_HWDEVICE_TYPE_CUDA,
-#ifdef _WIN32
- AV_HWDEVICE_TYPE_D3D11VA,
-#else
- AV_HWDEVICE_TYPE_VDPAU,
-#endif
- };
- for (const auto& type : GPU_DECODER_TYPES) {
+ static const auto supported_contexts = ListSupportedContexts();
+ for (const auto& type : PREFERRED_GPU_DECODERS) {
+ if (std::none_of(supported_contexts.begin(), supported_contexts.end(),
+ [&type](const auto& context) { return context == type; })) {
+ LOG_DEBUG(Service_NVDRV, "{} explicitly unsupported", av_hwdevice_get_type_name(type));
+ continue;
+ }
const int hwdevice_res = av_hwdevice_ctx_create(&av_gpu_decoder, type, nullptr, nullptr, 0);
if (hwdevice_res < 0) {
LOG_DEBUG(Service_NVDRV, "{} av_hwdevice_ctx_create failed {}",
av_hwdevice_get_type_name(type), hwdevice_res);
continue;
}
+#ifdef LIBVA_FOUND
+ if (type == AV_HWDEVICE_TYPE_VAAPI) {
+ // we need to determine if this is an impersonated VAAPI driver
+ AVHWDeviceContext* hwctx =
+ static_cast<AVHWDeviceContext*>(static_cast<void*>(av_gpu_decoder->data));
+ AVVAAPIDeviceContext* vactx = static_cast<AVVAAPIDeviceContext*>(hwctx->hwctx);
+ const char* vendor_name = vaQueryVendorString(vactx->display);
+ if (strstr(vendor_name, "VDPAU backend")) {
+ // VDPAU impersonated VAAPI impl's are super buggy, we need to skip them
+ LOG_DEBUG(Service_NVDRV, "Skipping vdapu impersonated VAAPI driver");
+ continue;
+ } else {
+ // according to some user testing, certain vaapi driver (Intel?) could be buggy
+ // so let's log the driver name which may help the developers/supporters
+ LOG_DEBUG(Service_NVDRV, "Using VAAPI driver: {}", vendor_name);
+ }
+ }
+#endif
for (int i = 0;; i++) {
const AVCodecHWConfig* config = avcodec_get_hw_config(av_codec, i);
if (!config) {
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index ab7c21a49..8788f5148 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -185,16 +185,6 @@ struct GPU::Impl {
return *dma_pusher;
}
- /// Returns a reference to the GPU CDMA pusher.
- [[nodiscard]] Tegra::CDmaPusher& CDmaPusher() {
- return *cdma_pusher;
- }
-
- /// Returns a const reference to the GPU CDMA pusher.
- [[nodiscard]] const Tegra::CDmaPusher& CDmaPusher() const {
- return *cdma_pusher;
- }
-
/// Returns a reference to the underlying renderer.
[[nodiscard]] VideoCore::RendererBase& Renderer() {
return *renderer;
@@ -338,25 +328,27 @@ struct GPU::Impl {
}
/// Push GPU command buffer entries to be processed
- void PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
+ void PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries) {
if (!use_nvdec) {
return;
}
- if (!cdma_pusher) {
- cdma_pusher = std::make_unique<Tegra::CDmaPusher>(gpu);
+ if (!cdma_pushers.contains(id)) {
+ cdma_pushers.insert_or_assign(id, std::make_unique<Tegra::CDmaPusher>(gpu));
}
// SubmitCommandBuffer would make the nvdec operations async, this is not currently working
// TODO(ameerj): RE proper async nvdec operation
// gpu_thread.SubmitCommandBuffer(std::move(entries));
-
- cdma_pusher->ProcessEntries(std::move(entries));
+ cdma_pushers[id]->ProcessEntries(std::move(entries));
}
/// Frees the CDMAPusher instance to free up resources
- void ClearCdmaInstance() {
- cdma_pusher.reset();
+ void ClearCdmaInstance(u32 id) {
+ const auto iter = cdma_pushers.find(id);
+ if (iter != cdma_pushers.end()) {
+ cdma_pushers.erase(iter);
+ }
}
/// Swap buffers (render frame)
@@ -659,7 +651,7 @@ struct GPU::Impl {
Core::System& system;
std::unique_ptr<Tegra::MemoryManager> memory_manager;
std::unique_ptr<Tegra::DmaPusher> dma_pusher;
- std::unique_ptr<Tegra::CDmaPusher> cdma_pusher;
+ std::map<u32, std::unique_ptr<Tegra::CDmaPusher>> cdma_pushers;
std::unique_ptr<VideoCore::RendererBase> renderer;
VideoCore::RasterizerInterface* rasterizer = nullptr;
const bool use_nvdec;
@@ -811,14 +803,6 @@ const Tegra::DmaPusher& GPU::DmaPusher() const {
return impl->DmaPusher();
}
-Tegra::CDmaPusher& GPU::CDmaPusher() {
- return impl->CDmaPusher();
-}
-
-const Tegra::CDmaPusher& GPU::CDmaPusher() const {
- return impl->CDmaPusher();
-}
-
VideoCore::RendererBase& GPU::Renderer() {
return impl->Renderer();
}
@@ -887,12 +871,12 @@ void GPU::PushGPUEntries(Tegra::CommandList&& entries) {
impl->PushGPUEntries(std::move(entries));
}
-void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
- impl->PushCommandBuffer(entries);
+void GPU::PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries) {
+ impl->PushCommandBuffer(id, entries);
}
-void GPU::ClearCdmaInstance() {
- impl->ClearCdmaInstance();
+void GPU::ClearCdmaInstance(u32 id) {
+ impl->ClearCdmaInstance(id);
}
void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index 05e5c94f3..500411176 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -83,6 +83,7 @@ enum class DepthFormat : u32 {
S8_UINT_Z24_UNORM = 0x14,
D24X8_UNORM = 0x15,
D24S8_UNORM = 0x16,
+ S8_UINT = 0x17,
D24C8_UNORM = 0x18,
D32_FLOAT_S8X24_UINT = 0x19,
};
@@ -241,10 +242,10 @@ public:
void PushGPUEntries(Tegra::CommandList&& entries);
/// Push GPU command buffer entries to be processed
- void PushCommandBuffer(Tegra::ChCommandHeaderList& entries);
+ void PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries);
/// Frees the CDMAPusher instance to free up resources
- void ClearCdmaInstance();
+ void ClearCdmaInstance(u32 id);
/// Swap buffers (render frame)
void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);
diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt
index d779a967a..fd3e41434 100644
--- a/src/video_core/host_shaders/CMakeLists.txt
+++ b/src/video_core/host_shaders/CMakeLists.txt
@@ -10,6 +10,8 @@ set(SHADER_FILES
astc_decoder.comp
block_linear_unswizzle_2d.comp
block_linear_unswizzle_3d.comp
+ convert_abgr8_to_d24s8.frag
+ convert_d24s8_to_abgr8.frag
convert_depth_to_float.frag
convert_float_to_depth.frag
full_screen_triangle.vert
diff --git a/src/video_core/host_shaders/convert_abgr8_to_d24s8.frag b/src/video_core/host_shaders/convert_abgr8_to_d24s8.frag
new file mode 100644
index 000000000..ea055ddad
--- /dev/null
+++ b/src/video_core/host_shaders/convert_abgr8_to_d24s8.frag
@@ -0,0 +1,18 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#version 450
+#extension GL_ARB_shader_stencil_export : require
+
+layout(binding = 0) uniform sampler2D color_texture;
+
+void main() {
+ ivec2 coord = ivec2(gl_FragCoord.xy);
+ uvec4 color = uvec4(texelFetch(color_texture, coord, 0).abgr * (exp2(8) - 1.0f));
+ uvec4 bytes = color << uvec4(24, 16, 8, 0);
+ uint depth_stencil_unorm = bytes.x | bytes.y | bytes.z | bytes.w;
+
+ gl_FragDepth = float(depth_stencil_unorm & 0x00FFFFFFu) / (exp2(24.0) - 1.0f);
+ gl_FragStencilRefARB = int(depth_stencil_unorm >> 24);
+}
diff --git a/src/video_core/host_shaders/convert_d24s8_to_abgr8.frag b/src/video_core/host_shaders/convert_d24s8_to_abgr8.frag
new file mode 100644
index 000000000..94368fb59
--- /dev/null
+++ b/src/video_core/host_shaders/convert_d24s8_to_abgr8.frag
@@ -0,0 +1,23 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#version 450
+
+layout(binding = 0) uniform sampler2D depth_tex;
+layout(binding = 1) uniform isampler2D stencil_tex;
+
+layout(location = 0) out vec4 color;
+
+void main() {
+ ivec2 coord = ivec2(gl_FragCoord.xy);
+ uint depth = uint(textureLod(depth_tex, coord, 0).r * (exp2(24.0) - 1.0f));
+ uint stencil = uint(textureLod(stencil_tex, coord, 0).r);
+
+ highp uint depth_val =
+ uint(textureLod(depth_tex, coord, 0).r * (exp2(32.0) - 1.0));
+ lowp uint stencil_val = textureLod(stencil_tex, coord, 0).r;
+ highp uvec4 components =
+ uvec4(stencil_val, (uvec3(depth_val) >> uvec3(24u, 16u, 8u)) & 0x000000FFu);
+ color.abgr = vec4(components) / (exp2(8.0) - 1.0);
+}
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index 6956535e5..14e6522f2 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -9,6 +9,7 @@
#include <glad/glad.h>
+#include "common/bit_util.h"
#include "common/literals.h"
#include "common/settings.h"
#include "video_core/renderer_opengl/gl_device.h"
@@ -148,6 +149,8 @@ GLenum AttachmentType(PixelFormat format) {
switch (const SurfaceType type = VideoCore::Surface::GetFormatType(format); type) {
case SurfaceType::Depth:
return GL_DEPTH_ATTACHMENT;
+ case SurfaceType::Stencil:
+ return GL_STENCIL_ATTACHMENT;
case SurfaceType::DepthStencil:
return GL_DEPTH_STENCIL_ATTACHMENT;
default:
@@ -317,13 +320,12 @@ void AttachTexture(GLuint fbo, GLenum attachment, const ImageView* image_view) {
}
}
-OGLTexture MakeImage(const VideoCommon::ImageInfo& info, GLenum gl_internal_format) {
+OGLTexture MakeImage(const VideoCommon::ImageInfo& info, GLenum gl_internal_format,
+ GLsizei gl_num_levels) {
const GLenum target = ImageTarget(info);
const GLsizei width = info.size.width;
const GLsizei height = info.size.height;
const GLsizei depth = info.size.depth;
- const int max_host_mip_levels = std::bit_width(info.size.width);
- const GLsizei num_levels = std::min(info.resources.levels, max_host_mip_levels);
const GLsizei num_layers = info.resources.layers;
const GLsizei num_samples = info.num_samples;
@@ -335,10 +337,10 @@ OGLTexture MakeImage(const VideoCommon::ImageInfo& info, GLenum gl_internal_form
}
switch (target) {
case GL_TEXTURE_1D_ARRAY:
- glTextureStorage2D(handle, num_levels, gl_internal_format, width, num_layers);
+ glTextureStorage2D(handle, gl_num_levels, gl_internal_format, width, num_layers);
break;
case GL_TEXTURE_2D_ARRAY:
- glTextureStorage3D(handle, num_levels, gl_internal_format, width, height, num_layers);
+ glTextureStorage3D(handle, gl_num_levels, gl_internal_format, width, height, num_layers);
break;
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: {
// TODO: Where should 'fixedsamplelocations' come from?
@@ -348,10 +350,10 @@ OGLTexture MakeImage(const VideoCommon::ImageInfo& info, GLenum gl_internal_form
break;
}
case GL_TEXTURE_RECTANGLE:
- glTextureStorage2D(handle, num_levels, gl_internal_format, width, height);
+ glTextureStorage2D(handle, gl_num_levels, gl_internal_format, width, height);
break;
case GL_TEXTURE_3D:
- glTextureStorage3D(handle, num_levels, gl_internal_format, width, height, depth);
+ glTextureStorage3D(handle, gl_num_levels, gl_internal_format, width, height, depth);
break;
case GL_TEXTURE_BUFFER:
UNREACHABLE();
@@ -397,9 +399,6 @@ OGLTexture MakeImage(const VideoCommon::ImageInfo& info, GLenum gl_internal_form
return GL_R32UI;
}
-[[nodiscard]] u32 NextPow2(u32 value) {
- return 1U << (32U - std::countl_zero(value - 1U));
-}
} // Anonymous namespace
ImageBufferMap::~ImageBufferMap() {
@@ -526,8 +525,8 @@ void TextureCacheRuntime::CopyImage(Image& dst_image, Image& src_image,
}
}
-void TextureCacheRuntime::ConvertImage(Image& dst, Image& src,
- std::span<const VideoCommon::ImageCopy> copies) {
+void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src,
+ std::span<const VideoCommon::ImageCopy> copies) {
LOG_DEBUG(Render_OpenGL, "Converting {} to {}", src.info.format, dst.info.format);
format_conversion_pass.ConvertImage(dst, src, copies);
}
@@ -696,7 +695,9 @@ Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_,
gl_format = tuple.format;
gl_type = tuple.type;
}
- texture = MakeImage(info, gl_internal_format);
+ const int max_host_mip_levels = std::bit_width(info.size.width);
+ gl_num_levels = std::min(info.resources.levels, max_host_mip_levels);
+ texture = MakeImage(info, gl_internal_format, gl_num_levels);
current_texture = texture.handle;
if (runtime->device.HasDebuggingToolAttached()) {
const std::string name = VideoCommon::Name(*this);
@@ -724,6 +725,9 @@ void Image::UploadMemory(const ImageBufferMap& map,
u32 current_image_height = std::numeric_limits<u32>::max();
for (const VideoCommon::BufferImageCopy& copy : copies) {
+ if (copy.image_subresource.base_level >= gl_num_levels) {
+ continue;
+ }
if (current_row_length != copy.buffer_row_length) {
current_row_length = copy.buffer_row_length;
glPixelStorei(GL_UNPACK_ROW_LENGTH, current_row_length);
@@ -753,6 +757,9 @@ void Image::DownloadMemory(ImageBufferMap& map,
u32 current_image_height = std::numeric_limits<u32>::max();
for (const VideoCommon::BufferImageCopy& copy : copies) {
+ if (copy.image_subresource.base_level >= gl_num_levels) {
+ continue;
+ }
if (current_row_length != copy.buffer_row_length) {
current_row_length = copy.buffer_row_length;
glPixelStorei(GL_PACK_ROW_LENGTH, current_row_length);
@@ -792,7 +799,7 @@ GLuint Image::StorageHandle() noexcept {
}
store_view.Create();
glTextureView(store_view.handle, ImageTarget(info), current_texture, GL_RGBA8, 0,
- info.resources.levels, 0, info.resources.layers);
+ gl_num_levels, 0, info.resources.layers);
return store_view.handle;
default:
return current_texture;
@@ -907,6 +914,8 @@ void Image::Scale(bool up_scale) {
return GL_COLOR_ATTACHMENT0;
case SurfaceType::Depth:
return GL_DEPTH_ATTACHMENT;
+ case SurfaceType::Stencil:
+ return GL_STENCIL_ATTACHMENT;
case SurfaceType::DepthStencil:
return GL_DEPTH_STENCIL_ATTACHMENT;
default:
@@ -920,8 +929,10 @@ void Image::Scale(bool up_scale) {
return GL_COLOR_BUFFER_BIT;
case SurfaceType::Depth:
return GL_DEPTH_BUFFER_BIT;
+ case SurfaceType::Stencil:
+ return GL_STENCIL_BUFFER_BIT;
case SurfaceType::DepthStencil:
- return GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
+ return GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
default:
UNREACHABLE();
return GL_COLOR_BUFFER_BIT;
@@ -933,8 +944,10 @@ void Image::Scale(bool up_scale) {
return 0;
case SurfaceType::Depth:
return 1;
- case SurfaceType::DepthStencil:
+ case SurfaceType::Stencil:
return 2;
+ case SurfaceType::DepthStencil:
+ return 3;
default:
UNREACHABLE();
return 0;
@@ -956,7 +969,7 @@ void Image::Scale(bool up_scale) {
auto dst_info = info;
dst_info.size.width = scaled_width;
dst_info.size.height = scaled_height;
- upscaled_backup = MakeImage(dst_info, gl_internal_format);
+ upscaled_backup = MakeImage(dst_info, gl_internal_format, gl_num_levels);
}
const u32 src_width = up_scale ? original_width : scaled_width;
const u32 src_height = up_scale ? original_height : scaled_height;
@@ -1264,10 +1277,20 @@ Framebuffer::Framebuffer(TextureCacheRuntime& runtime, std::span<ImageView*, NUM
}
if (const ImageView* const image_view = depth_buffer; image_view) {
- if (GetFormatType(image_view->format) == SurfaceType::DepthStencil) {
+ switch (GetFormatType(image_view->format)) {
+ case SurfaceType::Depth:
+ buffer_bits |= GL_DEPTH_BUFFER_BIT;
+ break;
+ case SurfaceType::Stencil:
+ buffer_bits |= GL_STENCIL_BUFFER_BIT;
+ break;
+ case SurfaceType::DepthStencil:
buffer_bits |= GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
- } else {
+ break;
+ default:
+ UNREACHABLE();
buffer_bits |= GL_DEPTH_BUFFER_BIT;
+ break;
}
const GLenum attachment = AttachmentType(image_view->format);
AttachTexture(handle, attachment, image_view);
@@ -1308,7 +1331,7 @@ void FormatConversionPass::ConvertImage(Image& dst_image, Image& src_image,
const u32 copy_size = region.width * region.height * region.depth * img_bpp;
if (pbo_size < copy_size) {
intermediate_pbo.Create();
- pbo_size = NextPow2(copy_size);
+ pbo_size = Common::NextPow2(copy_size);
glNamedBufferData(intermediate_pbo.handle, pbo_size, nullptr, GL_STREAM_COPY);
}
// Copy from source to PBO
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index 578f8d523..37d5e6a6b 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -84,9 +84,13 @@ public:
u64 GetDeviceLocalMemory() const;
+ bool ShouldReinterpret([[maybe_unused]] Image& dst, [[maybe_unused]] Image& src) {
+ return true;
+ }
+
void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
- void ConvertImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
+ void ReinterpretImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled) {
UNIMPLEMENTED();
@@ -164,8 +168,8 @@ private:
std::array<GLuint, Shader::NUM_TEXTURE_TYPES> null_image_views{};
- std::array<OGLFramebuffer, 3> rescale_draw_fbos;
- std::array<OGLFramebuffer, 3> rescale_read_fbos;
+ std::array<OGLFramebuffer, 4> rescale_draw_fbos;
+ std::array<OGLFramebuffer, 4> rescale_read_fbos;
const Settings::ResolutionScalingInfo& resolution;
};
@@ -221,6 +225,7 @@ private:
GLenum gl_internal_format = GL_NONE;
GLenum gl_format = GL_NONE;
GLenum gl_type = GL_NONE;
+ GLsizei gl_num_levels{};
TextureCacheRuntime* runtime{};
GLuint current_texture{};
};
@@ -338,7 +343,6 @@ struct TextureCacheParams {
static constexpr bool FRAMEBUFFER_BLITS = true;
static constexpr bool HAS_EMULATED_COPIES = true;
static constexpr bool HAS_DEVICE_MEMORY_INFO = true;
- static constexpr bool HAS_PIXEL_FORMAT_CONVERSIONS = true;
using Runtime = OpenGL::TextureCacheRuntime;
using Image = OpenGL::Image;
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h
index 39158aa3e..daba42ed9 100644
--- a/src/video_core/renderer_opengl/maxwell_to_gl.h
+++ b/src/video_core/renderer_opengl/maxwell_to_gl.h
@@ -108,6 +108,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB
{GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV}, // E5B9G9R9_FLOAT
{GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, // D32_FLOAT
{GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, // D16_UNORM
+ {GL_STENCIL_INDEX8, GL_STENCIL, GL_UNSIGNED_BYTE}, // S8_UINT
{GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // D24_UNORM_S8_UINT
{GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, // S8_UINT_D24_UNORM
{GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL,
diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp
index b3884a4f5..9a38b6b34 100644
--- a/src/video_core/renderer_vulkan/blit_image.cpp
+++ b/src/video_core/renderer_vulkan/blit_image.cpp
@@ -4,6 +4,8 @@
#include <algorithm>
+#include "video_core/host_shaders/convert_abgr8_to_d24s8_frag_spv.h"
+#include "video_core/host_shaders/convert_d24s8_to_abgr8_frag_spv.h"
#include "video_core/host_shaders/convert_depth_to_float_frag_spv.h"
#include "video_core/host_shaders/convert_float_to_depth_frag_spv.h"
#include "video_core/host_shaders/full_screen_triangle_vert_spv.h"
@@ -354,6 +356,8 @@ BlitImageHelper::BlitImageHelper(const Device& device_, VKScheduler& scheduler_,
blit_color_to_color_frag(BuildShader(device, VULKAN_BLIT_COLOR_FLOAT_FRAG_SPV)),
convert_depth_to_float_frag(BuildShader(device, CONVERT_DEPTH_TO_FLOAT_FRAG_SPV)),
convert_float_to_depth_frag(BuildShader(device, CONVERT_FLOAT_TO_DEPTH_FRAG_SPV)),
+ convert_abgr8_to_d24s8_frag(BuildShader(device, CONVERT_ABGR8_TO_D24S8_FRAG_SPV)),
+ convert_d24s8_to_abgr8_frag(BuildShader(device, CONVERT_D24S8_TO_ABGR8_FRAG_SPV)),
linear_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_LINEAR>)),
nearest_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_NEAREST>)) {
if (device.IsExtShaderStencilExportSupported()) {
@@ -448,6 +452,22 @@ void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer,
Convert(*convert_r16_to_d16_pipeline, dst_framebuffer, src_image_view, up_scale, down_shift);
}
+void BlitImageHelper::ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift) {
+ ConvertPipelineDepthTargetEx(convert_abgr8_to_d24s8_pipeline, dst_framebuffer->RenderPass(),
+ convert_abgr8_to_d24s8_frag, true);
+ ConvertColor(*convert_abgr8_to_d24s8_pipeline, dst_framebuffer, src_image_view, up_scale,
+ down_shift);
+}
+
+void BlitImageHelper::ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift) {
+ ConvertPipelineColorTargetEx(convert_d24s8_to_abgr8_pipeline, dst_framebuffer->RenderPass(),
+ convert_d24s8_to_abgr8_frag, false);
+ ConvertDepthStencil(*convert_d24s8_to_abgr8_pipeline, dst_framebuffer, src_image_view, up_scale,
+ down_shift);
+}
+
void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
const ImageView& src_image_view, u32 up_scale, u32 down_shift) {
const VkPipelineLayout layout = *one_texture_pipeline_layout;
@@ -495,6 +515,101 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb
scheduler.InvalidateState();
}
+void BlitImageHelper::ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift) {
+ const VkPipelineLayout layout = *one_texture_pipeline_layout;
+ const VkImageView src_view = src_image_view.ColorView();
+ const VkSampler sampler = *nearest_sampler;
+ const VkExtent2D extent{
+ .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U),
+ .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U),
+ };
+ scheduler.RequestRenderpass(dst_framebuffer);
+ scheduler.Record([pipeline, layout, sampler, src_view, extent, up_scale, down_shift,
+ this](vk::CommandBuffer cmdbuf) {
+ const VkOffset2D offset{
+ .x = 0,
+ .y = 0,
+ };
+ const VkViewport viewport{
+ .x = 0.0f,
+ .y = 0.0f,
+ .width = static_cast<float>(extent.width),
+ .height = static_cast<float>(extent.height),
+ .minDepth = 0.0f,
+ .maxDepth = 0.0f,
+ };
+ const VkRect2D scissor{
+ .offset = offset,
+ .extent = extent,
+ };
+ const PushConstants push_constants{
+ .tex_scale = {viewport.width, viewport.height},
+ .tex_offset = {0.0f, 0.0f},
+ };
+ const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit();
+ UpdateOneTextureDescriptorSet(device, descriptor_set, sampler, src_view);
+
+ // TODO: Barriers
+ cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+ cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set,
+ nullptr);
+ cmdbuf.SetViewport(0, viewport);
+ cmdbuf.SetScissor(0, scissor);
+ cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants);
+ cmdbuf.Draw(3, 1, 0, 0);
+ });
+ scheduler.InvalidateState();
+}
+
+void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift) {
+ const VkPipelineLayout layout = *two_textures_pipeline_layout;
+ const VkImageView src_depth_view = src_image_view.DepthView();
+ const VkImageView src_stencil_view = src_image_view.StencilView();
+ const VkSampler sampler = *nearest_sampler;
+ const VkExtent2D extent{
+ .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U),
+ .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U),
+ };
+ scheduler.RequestRenderpass(dst_framebuffer);
+ scheduler.Record([pipeline, layout, sampler, src_depth_view, src_stencil_view, extent, up_scale,
+ down_shift, this](vk::CommandBuffer cmdbuf) {
+ const VkOffset2D offset{
+ .x = 0,
+ .y = 0,
+ };
+ const VkViewport viewport{
+ .x = 0.0f,
+ .y = 0.0f,
+ .width = static_cast<float>(extent.width),
+ .height = static_cast<float>(extent.height),
+ .minDepth = 0.0f,
+ .maxDepth = 0.0f,
+ };
+ const VkRect2D scissor{
+ .offset = offset,
+ .extent = extent,
+ };
+ const PushConstants push_constants{
+ .tex_scale = {viewport.width, viewport.height},
+ .tex_offset = {0.0f, 0.0f},
+ };
+ const VkDescriptorSet descriptor_set = two_textures_descriptor_allocator.Commit();
+ UpdateTwoTexturesDescriptorSet(device, descriptor_set, sampler, src_depth_view,
+ src_stencil_view);
+ // TODO: Barriers
+ cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+ cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set,
+ nullptr);
+ cmdbuf.SetViewport(0, viewport);
+ cmdbuf.SetScissor(0, scissor);
+ cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants);
+ cmdbuf.Draw(3, 1, 0, 0);
+ });
+ scheduler.InvalidateState();
+}
+
VkPipeline BlitImageHelper::FindOrEmplaceColorPipeline(const BlitImagePipelineKey& key) {
const auto it = std::ranges::find(blit_color_keys, key);
if (it != blit_color_keys.end()) {
@@ -636,4 +751,44 @@ void BlitImageHelper::ConvertColorToDepthPipeline(vk::Pipeline& pipeline, VkRend
});
}
+void BlitImageHelper::ConvertPipelineEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool is_target_depth,
+ bool single_texture) {
+ if (pipeline) {
+ return;
+ }
+ const std::array stages = MakeStages(*full_screen_vert, *module);
+ pipeline = device.GetLogical().CreateGraphicsPipeline({
+ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .stageCount = static_cast<u32>(stages.size()),
+ .pStages = stages.data(),
+ .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
+ .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
+ .pTessellationState = nullptr,
+ .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+ .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
+ .pMultisampleState = &PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
+ .pDepthStencilState = is_target_depth ? &PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO : nullptr,
+ .pColorBlendState = &PIPELINE_COLOR_BLEND_STATE_GENERIC_CREATE_INFO,
+ .pDynamicState = &PIPELINE_DYNAMIC_STATE_CREATE_INFO,
+ .layout = single_texture ? *one_texture_pipeline_layout : *two_textures_pipeline_layout,
+ .renderPass = renderpass,
+ .subpass = 0,
+ .basePipelineHandle = VK_NULL_HANDLE,
+ .basePipelineIndex = 0,
+ });
+}
+
+void BlitImageHelper::ConvertPipelineColorTargetEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool single_texture) {
+ ConvertPipelineEx(pipeline, renderpass, module, false, single_texture);
+}
+
+void BlitImageHelper::ConvertPipelineDepthTargetEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool single_texture) {
+ ConvertPipelineEx(pipeline, renderpass, module, true, single_texture);
+}
+
} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h
index d77f76678..b1a717090 100644
--- a/src/video_core/renderer_vulkan/blit_image.h
+++ b/src/video_core/renderer_vulkan/blit_image.h
@@ -56,10 +56,22 @@ public:
void ConvertR16ToD16(const Framebuffer* dst_framebuffer, const ImageView& src_image_view,
u32 up_scale, u32 down_shift);
+ void ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer, ImageView& src_image_view,
+ u32 up_scale, u32 down_shift);
+
+ void ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view,
+ u32 up_scale, u32 down_shift);
+
private:
void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
const ImageView& src_image_view, u32 up_scale, u32 down_shift);
+ void ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift);
+
+ void ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
+ ImageView& src_image_view, u32 up_scale, u32 down_shift);
+
[[nodiscard]] VkPipeline FindOrEmplaceColorPipeline(const BlitImagePipelineKey& key);
[[nodiscard]] VkPipeline FindOrEmplaceDepthStencilPipeline(const BlitImagePipelineKey& key);
@@ -68,6 +80,15 @@ private:
void ConvertColorToDepthPipeline(vk::Pipeline& pipeline, VkRenderPass renderpass);
+ void ConvertPipelineEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool is_target_depth, bool single_texture);
+
+ void ConvertPipelineColorTargetEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool single_texture);
+
+ void ConvertPipelineDepthTargetEx(vk::Pipeline& pipeline, VkRenderPass renderpass,
+ vk::ShaderModule& module, bool single_texture);
+
const Device& device;
VKScheduler& scheduler;
StateTracker& state_tracker;
@@ -83,6 +104,8 @@ private:
vk::ShaderModule blit_depth_stencil_frag;
vk::ShaderModule convert_depth_to_float_frag;
vk::ShaderModule convert_float_to_depth_frag;
+ vk::ShaderModule convert_abgr8_to_d24s8_frag;
+ vk::ShaderModule convert_d24s8_to_abgr8_frag;
vk::Sampler linear_sampler;
vk::Sampler nearest_sampler;
@@ -94,6 +117,8 @@ private:
vk::Pipeline convert_r32_to_d32_pipeline;
vk::Pipeline convert_d16_to_r16_pipeline;
vk::Pipeline convert_r16_to_d16_pipeline;
+ vk::Pipeline convert_abgr8_to_d24s8_pipeline;
+ vk::Pipeline convert_d24s8_to_abgr8_pipeline;
};
} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
index 68a23b602..751e4792b 100644
--- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
+++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp
@@ -162,7 +162,7 @@ struct FormatTuple {
{VK_FORMAT_UNDEFINED}, // R16_SINT
{VK_FORMAT_R16G16_UNORM, Attachable | Storage}, // R16G16_UNORM
{VK_FORMAT_R16G16_SFLOAT, Attachable | Storage}, // R16G16_FLOAT
- {VK_FORMAT_UNDEFINED}, // R16G16_UINT
+ {VK_FORMAT_R16G16_UINT, Attachable | Storage}, // R16G16_UINT
{VK_FORMAT_R16G16_SINT, Attachable | Storage}, // R16G16_SINT
{VK_FORMAT_R16G16_SNORM, Attachable | Storage}, // R16G16_SNORM
{VK_FORMAT_UNDEFINED}, // R32G32B32_FLOAT
@@ -176,8 +176,8 @@ struct FormatTuple {
{VK_FORMAT_R32_UINT, Attachable | Storage}, // R32_UINT
{VK_FORMAT_R32_SINT, Attachable | Storage}, // R32_SINT
{VK_FORMAT_ASTC_8x8_UNORM_BLOCK}, // ASTC_2D_8X8_UNORM
- {VK_FORMAT_UNDEFINED}, // ASTC_2D_8X5_UNORM
- {VK_FORMAT_UNDEFINED}, // ASTC_2D_5X4_UNORM
+ {VK_FORMAT_ASTC_8x5_UNORM_BLOCK}, // ASTC_2D_8X5_UNORM
+ {VK_FORMAT_ASTC_5x4_UNORM_BLOCK}, // ASTC_2D_5X4_UNORM
{VK_FORMAT_B8G8R8A8_SRGB, Attachable}, // B8G8R8A8_SRGB
{VK_FORMAT_BC1_RGBA_SRGB_BLOCK}, // BC1_RGBA_SRGB
{VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB
@@ -208,6 +208,9 @@ struct FormatTuple {
{VK_FORMAT_D32_SFLOAT, Attachable}, // D32_FLOAT
{VK_FORMAT_D16_UNORM, Attachable}, // D16_UNORM
+ // Stencil formats
+ {VK_FORMAT_S8_UINT, Attachable}, // S8_UINT
+
// DepthStencil formats
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // D24_UNORM_S8_UINT
{VK_FORMAT_D24_UNORM_S8_UINT, Attachable}, // S8_UINT_D24_UNORM (emulated)
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 407fd2a15..197cba8e3 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -8,6 +8,7 @@
#include <vector>
#include "common/bit_cast.h"
+#include "common/bit_util.h"
#include "common/settings.h"
#include "video_core/engines/fermi_2d.h"
@@ -102,6 +103,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
break;
case VideoCore::Surface::SurfaceType::Depth:
+ case VideoCore::Surface::SurfaceType::Stencil:
case VideoCore::Surface::SurfaceType::DepthStencil:
usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
break;
@@ -173,6 +175,8 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
return VK_IMAGE_ASPECT_COLOR_BIT;
case VideoCore::Surface::SurfaceType::Depth:
return VK_IMAGE_ASPECT_DEPTH_BIT;
+ case VideoCore::Surface::SurfaceType::Stencil:
+ return VK_IMAGE_ASPECT_STENCIL_BIT;
case VideoCore::Surface::SurfaceType::DepthStencil:
return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
default:
@@ -195,6 +199,8 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
case PixelFormat::D16_UNORM:
case PixelFormat::D32_FLOAT:
return VK_IMAGE_ASPECT_DEPTH_BIT;
+ case PixelFormat::S8_UINT:
+ return VK_IMAGE_ASPECT_STENCIL_BIT;
default:
return VK_IMAGE_ASPECT_COLOR_BIT;
}
@@ -308,6 +314,19 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
};
}
+[[nodiscard]] VkBufferImageCopy MakeBufferImageCopy(const VideoCommon::ImageCopy& copy, bool is_src,
+ VkImageAspectFlags aspect_mask) noexcept {
+ return VkBufferImageCopy{
+ .bufferOffset = 0,
+ .bufferRowLength = 0,
+ .bufferImageHeight = 0,
+ .imageSubresource = MakeImageSubresourceLayers(
+ is_src ? copy.src_subresource : copy.dst_subresource, aspect_mask),
+ .imageOffset = MakeOffset3D(is_src ? copy.src_offset : copy.dst_offset),
+ .imageExtent = MakeExtent3D(copy.extent),
+ };
+}
+
[[maybe_unused]] [[nodiscard]] std::vector<VkBufferCopy> TransformBufferCopies(
std::span<const VideoCommon::BufferCopy> copies, size_t buffer_offset) {
std::vector<VkBufferCopy> result(copies.size());
@@ -754,6 +773,173 @@ StagingBufferRef TextureCacheRuntime::DownloadStagingBuffer(size_t size) {
return staging_buffer_pool.Request(size, MemoryUsage::Download);
}
+bool TextureCacheRuntime::ShouldReinterpret(Image& dst, Image& src) {
+ if (VideoCore::Surface::GetFormatType(dst.info.format) ==
+ VideoCore::Surface::SurfaceType::DepthStencil &&
+ !device.IsExtShaderStencilExportSupported()) {
+ return true;
+ }
+ if (VideoCore::Surface::GetFormatType(src.info.format) ==
+ VideoCore::Surface::SurfaceType::DepthStencil &&
+ !device.IsExtShaderStencilExportSupported()) {
+ return true;
+ }
+ if (dst.info.format == PixelFormat::D32_FLOAT_S8_UINT ||
+ src.info.format == PixelFormat::D32_FLOAT_S8_UINT) {
+ return true;
+ }
+ return false;
+}
+
+VkBuffer TextureCacheRuntime::GetTemporaryBuffer(size_t needed_size) {
+ const auto level = (8 * sizeof(size_t)) - std::countl_zero(needed_size - 1ULL);
+ if (buffer_commits[level]) {
+ return *buffers[level];
+ }
+ const auto new_size = Common::NextPow2(needed_size);
+ static constexpr VkBufferUsageFlags flags =
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
+ VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
+ buffers[level] = device.GetLogical().CreateBuffer({
+ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .size = new_size,
+ .usage = flags,
+ .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
+ .queueFamilyIndexCount = 0,
+ .pQueueFamilyIndices = nullptr,
+ });
+ buffer_commits[level] = std::make_unique<MemoryCommit>(
+ memory_allocator.Commit(buffers[level], MemoryUsage::DeviceLocal));
+ return *buffers[level];
+}
+
+void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src,
+ std::span<const VideoCommon::ImageCopy> copies) {
+ std::vector<VkBufferImageCopy> vk_in_copies(copies.size());
+ std::vector<VkBufferImageCopy> vk_out_copies(copies.size());
+ const VkImageAspectFlags src_aspect_mask = src.AspectMask();
+ const VkImageAspectFlags dst_aspect_mask = dst.AspectMask();
+
+ std::ranges::transform(copies, vk_in_copies.begin(), [src_aspect_mask](const auto& copy) {
+ return MakeBufferImageCopy(copy, true, src_aspect_mask);
+ });
+ std::ranges::transform(copies, vk_out_copies.begin(), [dst_aspect_mask](const auto& copy) {
+ return MakeBufferImageCopy(copy, false, dst_aspect_mask);
+ });
+ const u32 img_bpp = BytesPerBlock(src.info.format);
+ size_t total_size = 0;
+ for (const auto& copy : copies) {
+ total_size += copy.extent.width * copy.extent.height * copy.extent.depth * img_bpp;
+ }
+ const VkBuffer copy_buffer = GetTemporaryBuffer(total_size);
+ const VkImage dst_image = dst.Handle();
+ const VkImage src_image = src.Handle();
+ scheduler.RequestOutsideRenderPassOperationContext();
+ scheduler.Record([dst_image, src_image, copy_buffer, src_aspect_mask, dst_aspect_mask,
+ vk_in_copies, vk_out_copies](vk::CommandBuffer cmdbuf) {
+ RangedBarrierRange dst_range;
+ RangedBarrierRange src_range;
+ for (const VkBufferImageCopy& copy : vk_in_copies) {
+ src_range.AddLayers(copy.imageSubresource);
+ }
+ for (const VkBufferImageCopy& copy : vk_out_copies) {
+ dst_range.AddLayers(copy.imageSubresource);
+ }
+ static constexpr VkMemoryBarrier READ_BARRIER{
+ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT,
+ .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
+ };
+ static constexpr VkMemoryBarrier WRITE_BARRIER{
+ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+ .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
+ };
+ const std::array pre_barriers{
+ VkImageMemoryBarrier{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
+ .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = src_image,
+ .subresourceRange = src_range.SubresourceRange(src_aspect_mask),
+ },
+ };
+ const std::array middle_in_barrier{
+ VkImageMemoryBarrier{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ .newLayout = VK_IMAGE_LAYOUT_GENERAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = src_image,
+ .subresourceRange = src_range.SubresourceRange(src_aspect_mask),
+ },
+ };
+ const std::array middle_out_barrier{
+ VkImageMemoryBarrier{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+ .oldLayout = VK_IMAGE_LAYOUT_GENERAL,
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = dst_image,
+ .subresourceRange = dst_range.SubresourceRange(dst_aspect_mask),
+ },
+ };
+ const std::array post_barriers{
+ VkImageMemoryBarrier{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = nullptr,
+ .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+ .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
+ .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ .newLayout = VK_IMAGE_LAYOUT_GENERAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = dst_image,
+ .subresourceRange = dst_range.SubresourceRange(dst_aspect_mask),
+ },
+ };
+ cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0, {}, {}, pre_barriers);
+
+ cmdbuf.CopyImageToBuffer(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, copy_buffer,
+ vk_in_copies);
+ cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+ 0, WRITE_BARRIER, nullptr, middle_in_barrier);
+
+ cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0, READ_BARRIER, {}, middle_out_barrier);
+ cmdbuf.CopyBufferToImage(copy_buffer, dst_image, VK_IMAGE_LAYOUT_GENERAL, vk_out_copies);
+ cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+ 0, {}, {}, post_barriers);
+ });
+}
+
void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst, ImageView& src,
const Region2D& dst_region, const Region2D& src_region,
Tegra::Engines::Fermi2D::Filter filter,
@@ -881,6 +1067,11 @@ void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, Im
return blit_image_helper.ConvertD16ToR16(dst, src_view, up_scale, down_shift);
}
break;
+ case PixelFormat::A8B8G8R8_UNORM:
+ if (src_view.format == PixelFormat::S8_UINT_D24_UNORM) {
+ return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view, up_scale, down_shift);
+ }
+ break;
case PixelFormat::R32_FLOAT:
if (src_view.format == PixelFormat::D32_FLOAT) {
return blit_image_helper.ConvertD32ToR32(dst, src_view, up_scale, down_shift);
@@ -891,6 +1082,9 @@ void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, Im
return blit_image_helper.ConvertR16ToD16(dst, src_view, up_scale, down_shift);
}
break;
+ case PixelFormat::S8_UINT_D24_UNORM:
+ return blit_image_helper.ConvertABGR8ToD24S8(dst, src_view, up_scale, down_shift);
+ break;
case PixelFormat::D32_FLOAT:
if (src_view.format == PixelFormat::R32_FLOAT) {
return blit_image_helper.ConvertR32ToD32(dst, src_view, up_scale, down_shift);
@@ -1386,6 +1580,14 @@ VkImageView ImageView::StencilView() {
return *stencil_view;
}
+VkImageView ImageView::ColorView() {
+ if (color_view) {
+ return *color_view;
+ }
+ color_view = MakeView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT);
+ return *color_view;
+}
+
VkImageView ImageView::StorageView(Shader::TextureType texture_type,
Shader::ImageFormat image_format) {
if (image_format == Shader::ImageFormat::Typeless) {
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index f5f8f9a74..753e3e8a1 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -61,6 +61,10 @@ public:
void CopyImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
+ bool ShouldReinterpret(Image& dst, Image& src);
+
+ void ReinterpretImage(Image& dst, Image& src, std::span<const VideoCommon::ImageCopy> copies);
+
void ConvertImage(Framebuffer* dst, ImageView& dst_view, ImageView& src_view, bool rescaled);
bool CanAccelerateImageUpload(Image&) const noexcept {
@@ -82,6 +86,8 @@ public:
return true;
}
+ [[nodiscard]] VkBuffer GetTemporaryBuffer(size_t needed_size);
+
const Device& device;
VKScheduler& scheduler;
MemoryAllocator& memory_allocator;
@@ -90,6 +96,10 @@ public:
ASTCDecoderPass& astc_decoder_pass;
RenderPassCache& render_pass_cache;
const Settings::ResolutionScalingInfo& resolution;
+
+ constexpr static size_t indexing_slots = 8 * sizeof(size_t);
+ std::array<vk::Buffer, indexing_slots> buffers{};
+ std::array<std::unique_ptr<MemoryCommit>, indexing_slots> buffer_commits{};
};
class Image : public VideoCommon::ImageBase {
@@ -174,6 +184,8 @@ public:
[[nodiscard]] VkImageView StencilView();
+ [[nodiscard]] VkImageView ColorView();
+
[[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type,
Shader::ImageFormat image_format);
@@ -214,6 +226,7 @@ private:
std::unique_ptr<StorageViews> storage_views;
vk::ImageView depth_view;
vk::ImageView stencil_view;
+ vk::ImageView color_view;
VkImage image_handle = VK_NULL_HANDLE;
VkImageView render_target = VK_NULL_HANDLE;
VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT;
@@ -316,7 +329,6 @@ struct TextureCacheParams {
static constexpr bool FRAMEBUFFER_BLITS = false;
static constexpr bool HAS_EMULATED_COPIES = false;
static constexpr bool HAS_DEVICE_MEMORY_INFO = true;
- static constexpr bool HAS_PIXEL_FORMAT_CONVERSIONS = false;
using Runtime = Vulkan::TextureCacheRuntime;
using Image = Vulkan::Image;
diff --git a/src/video_core/shader_notify.cpp b/src/video_core/shader_notify.cpp
index dc6995b46..bcaf5f575 100644
--- a/src/video_core/shader_notify.cpp
+++ b/src/video_core/shader_notify.cpp
@@ -18,7 +18,7 @@ int ShaderNotify::ShadersBuilding() noexcept {
const int now_complete = num_complete.load(std::memory_order::relaxed);
const int now_building = num_building.load(std::memory_order::relaxed);
if (now_complete == now_building) {
- const auto now = std::chrono::high_resolution_clock::now();
+ const auto now = std::chrono::steady_clock::now();
if (completed && num_complete == num_when_completed) {
if (now - complete_time > TIME_TO_STOP_REPORTING) {
report_base = now_complete;
diff --git a/src/video_core/shader_notify.h b/src/video_core/shader_notify.h
index ad363bfb5..4d8d52071 100644
--- a/src/video_core/shader_notify.h
+++ b/src/video_core/shader_notify.h
@@ -28,6 +28,6 @@ private:
bool completed{};
int num_when_completed{};
- std::chrono::high_resolution_clock::time_point complete_time;
+ std::chrono::steady_clock::time_point complete_time;
};
} // namespace VideoCore
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp
index 58d262446..a36015c8c 100644
--- a/src/video_core/surface.cpp
+++ b/src/video_core/surface.cpp
@@ -82,6 +82,8 @@ PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
return PixelFormat::D32_FLOAT;
case Tegra::DepthFormat::D16_UNORM:
return PixelFormat::D16_UNORM;
+ case Tegra::DepthFormat::S8_UINT:
+ return PixelFormat::S8_UINT;
case Tegra::DepthFormat::D32_FLOAT_S8X24_UINT:
return PixelFormat::D32_FLOAT_S8_UINT;
default:
@@ -214,6 +216,11 @@ SurfaceType GetFormatType(PixelFormat pixel_format) {
}
if (static_cast<std::size_t>(pixel_format) <
+ static_cast<std::size_t>(PixelFormat::MaxStencilFormat)) {
+ return SurfaceType::Stencil;
+ }
+
+ if (static_cast<std::size_t>(pixel_format) <
static_cast<std::size_t>(PixelFormat::MaxDepthStencilFormat)) {
return SurfaceType::DepthStencil;
}
diff --git a/src/video_core/surface.h b/src/video_core/surface.h
index 2ce7c7d33..33e8d24ab 100644
--- a/src/video_core/surface.h
+++ b/src/video_core/surface.h
@@ -110,8 +110,12 @@ enum class PixelFormat {
MaxDepthFormat,
+ // Stencil formats
+ S8_UINT = MaxDepthFormat,
+ MaxStencilFormat,
+
// DepthStencil formats
- D24_UNORM_S8_UINT = MaxDepthFormat,
+ D24_UNORM_S8_UINT = MaxStencilFormat,
S8_UINT_D24_UNORM,
D32_FLOAT_S8_UINT,
@@ -125,8 +129,9 @@ constexpr std::size_t MaxPixelFormat = static_cast<std::size_t>(PixelFormat::Max
enum class SurfaceType {
ColorTexture = 0,
Depth = 1,
- DepthStencil = 2,
- Invalid = 3,
+ Stencil = 2,
+ DepthStencil = 3,
+ Invalid = 4,
};
enum class SurfaceTarget {
@@ -229,6 +234,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
1, // E5B9G9R9_FLOAT
1, // D32_FLOAT
1, // D16_UNORM
+ 1, // S8_UINT
1, // D24_UNORM_S8_UINT
1, // S8_UINT_D24_UNORM
1, // D32_FLOAT_S8_UINT
@@ -328,6 +334,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
1, // E5B9G9R9_FLOAT
1, // D32_FLOAT
1, // D16_UNORM
+ 1, // S8_UINT
1, // D24_UNORM_S8_UINT
1, // S8_UINT_D24_UNORM
1, // D32_FLOAT_S8_UINT
@@ -427,6 +434,7 @@ constexpr std::array<u32, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
32, // E5B9G9R9_FLOAT
32, // D32_FLOAT
16, // D16_UNORM
+ 8, // S8_UINT
32, // D24_UNORM_S8_UINT
32, // S8_UINT_D24_UNORM
64, // D32_FLOAT_S8_UINT
diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp
index ddfb726fe..afa807d5d 100644
--- a/src/video_core/texture_cache/format_lookup_table.cpp
+++ b/src/video_core/texture_cache/format_lookup_table.cpp
@@ -139,6 +139,8 @@ PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red,
return PixelFormat::D16_UNORM;
case Hash(TextureFormat::S8D24, UINT, UNORM, UNORM, UNORM, LINEAR):
return PixelFormat::S8_UINT_D24_UNORM;
+ case Hash(TextureFormat::S8D24, UINT, UNORM, UINT, UINT, LINEAR):
+ return PixelFormat::S8_UINT_D24_UNORM;
case Hash(TextureFormat::R8G24, UINT, UNORM, UNORM, UNORM, LINEAR):
return PixelFormat::S8_UINT_D24_UNORM;
case Hash(TextureFormat::D32S8, FLOAT, UINT, UNORM, UNORM, LINEAR):
diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h
index c6cf0583f..b2c81057b 100644
--- a/src/video_core/texture_cache/formatter.h
+++ b/src/video_core/texture_cache/formatter.h
@@ -194,6 +194,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
return "D32_FLOAT";
case PixelFormat::D16_UNORM:
return "D16_UNORM";
+ case PixelFormat::S8_UINT:
+ return "S8_UINT";
case PixelFormat::D24_UNORM_S8_UINT:
return "D24_UNORM_S8_UINT";
case PixelFormat::S8_UINT_D24_UNORM:
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 241f71a91..5aaeb16ca 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -472,9 +472,10 @@ template <class P>
void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
const Tegra::Engines::Fermi2D::Surface& src,
const Tegra::Engines::Fermi2D::Config& copy) {
- const BlitImages images = GetBlitImages(dst, src);
+ const BlitImages images = GetBlitImages(dst, src, copy);
const ImageId dst_id = images.dst_id;
const ImageId src_id = images.src_id;
+
PrepareImage(src_id, false, false);
PrepareImage(dst_id, true, false);
@@ -758,14 +759,18 @@ ImageId TextureCache<P>::FindImage(const ImageInfo& info, GPUVAddr gpu_addr,
return ImageId{};
}
}
- const bool broken_views = runtime.HasBrokenTextureViewFormats();
+ const bool broken_views =
+ runtime.HasBrokenTextureViewFormats() || True(options & RelaxedOptions::ForceBrokenViews);
const bool native_bgr = runtime.HasNativeBgr();
- ImageId image_id;
+ const bool flexible_formats = True(options & RelaxedOptions::Format);
+ ImageId image_id{};
+ boost::container::small_vector<ImageId, 1> image_ids;
const auto lambda = [&](ImageId existing_image_id, ImageBase& existing_image) {
if (True(existing_image.flags & ImageFlagBits::Remapped)) {
return false;
}
- if (info.type == ImageType::Linear || existing_image.info.type == ImageType::Linear) {
+ if (info.type == ImageType::Linear || existing_image.info.type == ImageType::Linear)
+ [[unlikely]] {
const bool strict_size = False(options & RelaxedOptions::Size) &&
True(existing_image.flags & ImageFlagBits::Strong);
const ImageInfo& existing = existing_image.info;
@@ -774,17 +779,27 @@ ImageId TextureCache<P>::FindImage(const ImageInfo& info, GPUVAddr gpu_addr,
IsPitchLinearSameSize(existing, info, strict_size) &&
IsViewCompatible(existing.format, info.format, broken_views, native_bgr)) {
image_id = existing_image_id;
- return true;
+ image_ids.push_back(existing_image_id);
+ return !flexible_formats && existing.format == info.format;
}
} else if (IsSubresource(info, existing_image, gpu_addr, options, broken_views,
native_bgr)) {
image_id = existing_image_id;
- return true;
+ image_ids.push_back(existing_image_id);
+ return !flexible_formats && existing_image.info.format == info.format;
}
return false;
};
ForEachImageInRegion(*cpu_addr, CalculateGuestSizeInBytes(info), lambda);
- return image_id;
+ if (image_ids.size() <= 1) [[likely]] {
+ return image_id;
+ }
+ auto image_ids_compare = [this](ImageId a, ImageId b) {
+ auto& image_a = slot_images[a];
+ auto& image_b = slot_images[b];
+ return image_a.modification_tick < image_b.modification_tick;
+ };
+ return *std::ranges::max_element(image_ids, image_ids_compare);
}
template <class P>
@@ -1076,31 +1091,66 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, VA
template <class P>
typename TextureCache<P>::BlitImages TextureCache<P>::GetBlitImages(
- const Tegra::Engines::Fermi2D::Surface& dst, const Tegra::Engines::Fermi2D::Surface& src) {
- static constexpr auto FIND_OPTIONS = RelaxedOptions::Format | RelaxedOptions::Samples;
+ const Tegra::Engines::Fermi2D::Surface& dst, const Tegra::Engines::Fermi2D::Surface& src,
+ const Tegra::Engines::Fermi2D::Config& copy) {
+
+ static constexpr auto FIND_OPTIONS = RelaxedOptions::Samples;
const GPUVAddr dst_addr = dst.Address();
const GPUVAddr src_addr = src.Address();
ImageInfo dst_info(dst);
ImageInfo src_info(src);
+ const bool can_be_depth_blit =
+ dst_info.format == src_info.format && copy.filter == Tegra::Engines::Fermi2D::Filter::Point;
ImageId dst_id;
ImageId src_id;
+ RelaxedOptions try_options = FIND_OPTIONS;
+ if (can_be_depth_blit) {
+ try_options |= RelaxedOptions::Format;
+ }
do {
has_deleted_images = false;
- dst_id = FindImage(dst_info, dst_addr, FIND_OPTIONS);
- src_id = FindImage(src_info, src_addr, FIND_OPTIONS);
- const ImageBase* const dst_image = dst_id ? &slot_images[dst_id] : nullptr;
+ src_id = FindImage(src_info, src_addr, try_options);
+ dst_id = FindImage(dst_info, dst_addr, try_options);
const ImageBase* const src_image = src_id ? &slot_images[src_id] : nullptr;
- DeduceBlitImages(dst_info, src_info, dst_image, src_image);
- if (GetFormatType(dst_info.format) != GetFormatType(src_info.format)) {
- continue;
+ if (src_image && src_image->info.num_samples > 1) {
+ RelaxedOptions find_options{FIND_OPTIONS | RelaxedOptions::ForceBrokenViews};
+ src_id = FindOrInsertImage(src_info, src_addr, find_options);
+ dst_id = FindOrInsertImage(dst_info, dst_addr, find_options);
+ if (has_deleted_images) {
+ continue;
+ }
+ break;
}
- if (!dst_id) {
- dst_id = InsertImage(dst_info, dst_addr, RelaxedOptions{});
+ if (can_be_depth_blit) {
+ const ImageBase* const dst_image = dst_id ? &slot_images[dst_id] : nullptr;
+ DeduceBlitImages(dst_info, src_info, dst_image, src_image);
+ if (GetFormatType(dst_info.format) != GetFormatType(src_info.format)) {
+ continue;
+ }
}
if (!src_id) {
src_id = InsertImage(src_info, src_addr, RelaxedOptions{});
}
+ if (!dst_id) {
+ dst_id = InsertImage(dst_info, dst_addr, RelaxedOptions{});
+ }
} while (has_deleted_images);
+ const ImageBase& src_image = slot_images[src_id];
+ const ImageBase& dst_image = slot_images[dst_id];
+ const bool native_bgr = runtime.HasNativeBgr();
+ if (GetFormatType(dst_info.format) != GetFormatType(dst_image.info.format) ||
+ GetFormatType(src_info.format) != GetFormatType(src_image.info.format) ||
+ !VideoCore::Surface::IsViewCompatible(dst_info.format, dst_image.info.format, false,
+ native_bgr) ||
+ !VideoCore::Surface::IsViewCompatible(src_info.format, src_image.info.format, false,
+ native_bgr)) {
+ // Make sure the images match the expected format.
+ do {
+ has_deleted_images = false;
+ src_id = FindOrInsertImage(src_info, src_addr, RelaxedOptions{});
+ dst_id = FindOrInsertImage(dst_info, dst_addr, RelaxedOptions{});
+ } while (has_deleted_images);
+ }
return BlitImages{
.dst_id = dst_id,
.src_id = src_id,
@@ -1157,7 +1207,14 @@ template <class P>
ImageViewId TextureCache<P>::FindRenderTargetView(const ImageInfo& info, GPUVAddr gpu_addr,
bool is_clear) {
const auto options = is_clear ? RelaxedOptions::Samples : RelaxedOptions{};
- const ImageId image_id = FindOrInsertImage(info, gpu_addr, options);
+ ImageId image_id{};
+ bool delete_state = has_deleted_images;
+ do {
+ has_deleted_images = false;
+ image_id = FindOrInsertImage(info, gpu_addr, options);
+ delete_state |= has_deleted_images;
+ } while (has_deleted_images);
+ has_deleted_images = delete_state;
if (!image_id) {
return NULL_IMAGE_VIEW_ID;
}
@@ -1759,8 +1816,8 @@ void TextureCache<P>::CopyImage(ImageId dst_id, ImageId src_id, std::vector<Imag
}
UNIMPLEMENTED_IF(dst.info.type != ImageType::e2D);
UNIMPLEMENTED_IF(src.info.type != ImageType::e2D);
- if constexpr (HAS_PIXEL_FORMAT_CONVERSIONS) {
- return runtime.ConvertImage(dst, src, copies);
+ if (runtime.ShouldReinterpret(dst, src)) {
+ return runtime.ReinterpretImage(dst, src, copies);
}
for (const ImageCopy& copy : copies) {
UNIMPLEMENTED_IF(copy.dst_subresource.num_layers != 1);
@@ -1780,7 +1837,13 @@ void TextureCache<P>::CopyImage(ImageId dst_id, ImageId src_id, std::vector<Imag
const SubresourceExtent src_extent{.levels = 1, .layers = 1};
const SubresourceRange dst_range{.base = dst_base, .extent = dst_extent};
const SubresourceRange src_range{.base = src_base, .extent = src_extent};
- const ImageViewInfo dst_view_info(ImageViewType::e2D, dst.info.format, dst_range);
+ PixelFormat dst_format = dst.info.format;
+ if (GetFormatType(src.info.format) == SurfaceType::DepthStencil &&
+ GetFormatType(dst_format) == SurfaceType::ColorTexture &&
+ BytesPerBlock(dst_format) == 4) {
+ dst_format = PixelFormat::A8B8G8R8_UNORM;
+ }
+ const ImageViewInfo dst_view_info(ImageViewType::e2D, dst_format, dst_range);
const ImageViewInfo src_view_info(ImageViewType::e2D, src.info.format, src_range);
const auto [dst_framebuffer_id, dst_view_id] = RenderTargetFromImage(dst_id, dst_view_info);
Framebuffer* const dst_framebuffer = &slot_framebuffers[dst_framebuffer_id];
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h
index a9504c0e8..7107887a6 100644
--- a/src/video_core/texture_cache/texture_cache_base.h
+++ b/src/video_core/texture_cache/texture_cache_base.h
@@ -59,8 +59,6 @@ class TextureCache {
static constexpr bool HAS_EMULATED_COPIES = P::HAS_EMULATED_COPIES;
/// True when the API can provide info about the memory of the device.
static constexpr bool HAS_DEVICE_MEMORY_INFO = P::HAS_DEVICE_MEMORY_INFO;
- /// True when the API provides utilities for pixel format conversions.
- static constexpr bool HAS_PIXEL_FORMAT_CONVERSIONS = P::HAS_PIXEL_FORMAT_CONVERSIONS;
static constexpr u64 DEFAULT_EXPECTED_MEMORY = 1_GiB;
static constexpr u64 DEFAULT_CRITICAL_MEMORY = 2_GiB;
@@ -254,7 +252,8 @@ private:
/// Return a blit image pair from the given guest blit parameters
[[nodiscard]] BlitImages GetBlitImages(const Tegra::Engines::Fermi2D::Surface& dst,
- const Tegra::Engines::Fermi2D::Surface& src);
+ const Tegra::Engines::Fermi2D::Surface& src,
+ const Tegra::Engines::Fermi2D::Config& copy);
/// Find or create a sampler from a guest descriptor sampler
[[nodiscard]] SamplerId FindSampler(const TSCEntry& config);
diff --git a/src/video_core/texture_cache/types.h b/src/video_core/texture_cache/types.h
index 5c274abdf..5ac27b3a7 100644
--- a/src/video_core/texture_cache/types.h
+++ b/src/video_core/texture_cache/types.h
@@ -54,6 +54,7 @@ enum class RelaxedOptions : u32 {
Size = 1 << 0,
Format = 1 << 1,
Samples = 1 << 2,
+ ForceBrokenViews = 1 << 3,
};
DECLARE_ENUM_FLAG_OPERATORS(RelaxedOptions)
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp
index ddc9fb13a..7bd31b211 100644
--- a/src/video_core/texture_cache/util.cpp
+++ b/src/video_core/texture_cache/util.cpp
@@ -1151,6 +1151,7 @@ bool IsSubresource(const ImageInfo& candidate, const ImageBase& image, GPUVAddr
void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase* dst,
const ImageBase* src) {
+ const auto original_dst_format = dst_info.format;
if (src && GetFormatType(src->info.format) != SurfaceType::ColorTexture) {
src_info.format = src->info.format;
}
@@ -1161,7 +1162,13 @@ void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase*
dst_info.format = src->info.format;
}
if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
- src_info.format = dst->info.format;
+ if (src) {
+ if (GetFormatType(src->info.format) == SurfaceType::ColorTexture) {
+ dst_info.format = original_dst_format;
+ }
+ } else {
+ src_info.format = dst->info.format;
+ }
}
}
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp
index e852c817e..329bf4def 100644
--- a/src/video_core/video_core.cpp
+++ b/src/video_core/video_core.cpp
@@ -55,10 +55,4 @@ std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Cor
}
}
-float GetResolutionScaleFactor(const RendererBase& renderer) {
- return Settings::values.resolution_info.active
- ? Settings::values.resolution_info.up_factor
- : renderer.GetRenderWindow().GetFramebufferLayout().GetScalingRatio();
-}
-
} // namespace VideoCore
diff --git a/src/video_core/video_core.h b/src/video_core/video_core.h
index f86877e86..084df641f 100644
--- a/src/video_core/video_core.h
+++ b/src/video_core/video_core.h
@@ -25,6 +25,4 @@ class RendererBase;
/// Creates an emulated GPU instance using the given system context.
std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system);
-float GetResolutionScaleFactor(const RendererBase& renderer);
-
} // namespace VideoCore
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index 95106f88f..7bf5b6578 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -21,6 +21,13 @@
namespace Vulkan {
namespace {
namespace Alternatives {
+constexpr std::array STENCIL8_UINT{
+ VK_FORMAT_D16_UNORM_S8_UINT,
+ VK_FORMAT_D24_UNORM_S8_UINT,
+ VK_FORMAT_D32_SFLOAT_S8_UINT,
+ VK_FORMAT_UNDEFINED,
+};
+
constexpr std::array DEPTH24_UNORM_STENCIL8_UINT{
VK_FORMAT_D32_SFLOAT_S8_UINT,
VK_FORMAT_D16_UNORM_S8_UINT,
@@ -74,6 +81,8 @@ void SetNext(void**& next, T& data) {
constexpr const VkFormat* GetFormatAlternatives(VkFormat format) {
switch (format) {
+ case VK_FORMAT_S8_UINT:
+ return Alternatives::STENCIL8_UINT.data();
case VK_FORMAT_D24_UNORM_S8_UINT:
return Alternatives::DEPTH24_UNORM_STENCIL8_UINT.data();
case VK_FORMAT_D16_UNORM_S8_UINT:
@@ -121,6 +130,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
VK_FORMAT_R16G16_UNORM,
VK_FORMAT_R16G16_SNORM,
VK_FORMAT_R16G16_SFLOAT,
+ VK_FORMAT_R16G16_UINT,
VK_FORMAT_R16G16_SINT,
VK_FORMAT_R16_UNORM,
VK_FORMAT_R16_SNORM,
@@ -145,6 +155,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica
VK_FORMAT_R4G4B4A4_UNORM_PACK16,
VK_FORMAT_D32_SFLOAT,
VK_FORMAT_D16_UNORM,
+ VK_FORMAT_S8_UINT,
VK_FORMAT_D16_UNORM_S8_UINT,
VK_FORMAT_D24_UNORM_S8_UINT,
VK_FORMAT_D32_SFLOAT_S8_UINT,
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index d62fd566f..732e8c276 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -90,9 +90,6 @@ add_executable(yuzu
configuration/configure_motion_touch.cpp
configuration/configure_motion_touch.h
configuration/configure_motion_touch.ui
- configuration/configure_mouse_advanced.cpp
- configuration/configure_mouse_advanced.h
- configuration/configure_mouse_advanced.ui
configuration/configure_per_game.cpp
configuration/configure_per_game.h
configuration/configure_per_game.ui
@@ -155,6 +152,8 @@ add_executable(yuzu
main.ui
uisettings.cpp
uisettings.h
+ util/controller_navigation.cpp
+ util/controller_navigation.h
util/limitable_input_dialog.cpp
util/limitable_input_dialog.h
util/overlay_dialog.cpp
diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp
index bf8445a89..c5685db2e 100644
--- a/src/yuzu/applets/qt_controller.cpp
+++ b/src/yuzu/applets/qt_controller.cpp
@@ -6,8 +6,12 @@
#include <thread>
#include "common/assert.h"
+#include "common/param_package.h"
#include "common/string_util.h"
#include "core/core.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
#include "core/hle/lock.h"
#include "core/hle/service/hid/controllers/npad.h"
#include "core/hle/service/hid/hid.h"
@@ -23,49 +27,32 @@
namespace {
-constexpr std::size_t HANDHELD_INDEX = 8;
-
-constexpr std::array<std::array<bool, 4>, 8> led_patterns{{
- {true, false, false, false},
- {true, true, false, false},
- {true, true, true, false},
- {true, true, true, true},
- {true, false, false, true},
- {true, false, true, false},
- {true, false, true, true},
- {false, true, true, false},
-}};
-
-void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index,
- bool connected, Core::System& system) {
- if (!system.IsPoweredOn()) {
- return;
+void UpdateController(Core::HID::EmulatedController* controller,
+ Core::HID::NpadStyleIndex controller_type, bool connected) {
+ if (controller->IsConnected(true)) {
+ controller->Disconnect();
+ }
+ controller->SetNpadStyleIndex(controller_type);
+ if (connected) {
+ controller->Connect();
}
-
- auto& npad =
- system.ServiceManager()
- .GetService<Service::HID::Hid>("hid")
- ->GetAppletResource()
- ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad);
-
- npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected);
}
// Returns true if the given controller type is compatible with the given parameters.
-bool IsControllerCompatible(Settings::ControllerType controller_type,
+bool IsControllerCompatible(Core::HID::NpadStyleIndex controller_type,
Core::Frontend::ControllerParameters parameters) {
switch (controller_type) {
- case Settings::ControllerType::ProController:
+ case Core::HID::NpadStyleIndex::ProController:
return parameters.allow_pro_controller;
- case Settings::ControllerType::DualJoyconDetached:
+ case Core::HID::NpadStyleIndex::JoyconDual:
return parameters.allow_dual_joycons;
- case Settings::ControllerType::LeftJoycon:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
return parameters.allow_left_joycon;
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
return parameters.allow_right_joycon;
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::Handheld:
return parameters.enable_single_mode && parameters.allow_handheld;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
return parameters.allow_gamecube_controller;
default:
return false;
@@ -196,7 +183,7 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
connect(emulated_controllers[i], qOverload<int>(&QComboBox::currentIndexChanged),
[this, i](int index) {
UpdateDockedState(GetControllerTypeFromIndex(index, i) ==
- Settings::ControllerType::Handheld);
+ Core::HID::NpadStyleIndex::Handheld);
});
}
}
@@ -230,7 +217,9 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
resize(0, 0);
}
-QtControllerSelectorDialog::~QtControllerSelectorDialog() = default;
+QtControllerSelectorDialog::~QtControllerSelectorDialog() {
+ system.HIDCore().DisableAllControllerConfiguration();
+}
int QtControllerSelectorDialog::exec() {
if (parameters_met && parameters.enable_single_mode) {
@@ -249,17 +238,20 @@ void QtControllerSelectorDialog::ApplyConfiguration() {
}
void QtControllerSelectorDialog::LoadConfiguration() {
+ system.HIDCore().EnableAllControllerConfiguration();
+
+ const auto* handheld = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
for (std::size_t index = 0; index < NUM_PLAYERS; ++index) {
+ const auto* controller = system.HIDCore().GetEmulatedControllerByIndex(index);
const auto connected =
- Settings::values.players.GetValue()[index].connected ||
- (index == 0 && Settings::values.players.GetValue()[HANDHELD_INDEX].connected);
+ controller->IsConnected(true) || (index == 0 && handheld->IsConnected(true));
player_groupboxes[index]->setChecked(connected);
connected_controller_checkboxes[index]->setChecked(connected);
- emulated_controllers[index]->setCurrentIndex(GetIndexFromControllerType(
- Settings::values.players.GetValue()[index].controller_type, index));
+ emulated_controllers[index]->setCurrentIndex(
+ GetIndexFromControllerType(controller->GetNpadStyleIndex(true), index));
}
- UpdateDockedState(Settings::values.players.GetValue()[HANDHELD_INDEX].connected);
+ UpdateDockedState(handheld->IsConnected(true));
ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue());
ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
@@ -415,33 +407,33 @@ void QtControllerSelectorDialog::SetEmulatedControllers(std::size_t player_index
emulated_controllers[player_index]->clear();
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::ProController);
+ Core::HID::NpadStyleIndex::ProController);
emulated_controllers[player_index]->addItem(tr("Pro Controller"));
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::DualJoyconDetached);
+ Core::HID::NpadStyleIndex::JoyconDual);
emulated_controllers[player_index]->addItem(tr("Dual Joycons"));
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::LeftJoycon);
+ Core::HID::NpadStyleIndex::JoyconLeft);
emulated_controllers[player_index]->addItem(tr("Left Joycon"));
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::RightJoycon);
+ Core::HID::NpadStyleIndex::JoyconRight);
emulated_controllers[player_index]->addItem(tr("Right Joycon"));
if (player_index == 0) {
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::Handheld);
+ Core::HID::NpadStyleIndex::Handheld);
emulated_controllers[player_index]->addItem(tr("Handheld"));
}
pairs.emplace_back(emulated_controllers[player_index]->count(),
- Settings::ControllerType::GameCube);
+ Core::HID::NpadStyleIndex::GameCube);
emulated_controllers[player_index]->addItem(tr("GameCube Controller"));
}
-Settings::ControllerType QtControllerSelectorDialog::GetControllerTypeFromIndex(
+Core::HID::NpadStyleIndex QtControllerSelectorDialog::GetControllerTypeFromIndex(
int index, std::size_t player_index) const {
const auto& pairs = index_controller_type_pairs[player_index];
@@ -449,13 +441,13 @@ Settings::ControllerType QtControllerSelectorDialog::GetControllerTypeFromIndex(
[index](const auto& pair) { return pair.first == index; });
if (it == pairs.end()) {
- return Settings::ControllerType::ProController;
+ return Core::HID::NpadStyleIndex::ProController;
}
return it->second;
}
-int QtControllerSelectorDialog::GetIndexFromControllerType(Settings::ControllerType type,
+int QtControllerSelectorDialog::GetIndexFromControllerType(Core::HID::NpadStyleIndex type,
std::size_t player_index) const {
const auto& pairs = index_controller_type_pairs[player_index];
@@ -479,16 +471,16 @@ void QtControllerSelectorDialog::UpdateControllerIcon(std::size_t player_index)
const QString stylesheet = [this, player_index] {
switch (GetControllerTypeFromIndex(emulated_controllers[player_index]->currentIndex(),
player_index)) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::GameCube:
return QStringLiteral("image: url(:/controller/applet_pro_controller%0); ");
- case Settings::ControllerType::DualJoyconDetached:
+ case Core::HID::NpadStyleIndex::JoyconDual:
return QStringLiteral("image: url(:/controller/applet_dual_joycon%0); ");
- case Settings::ControllerType::LeftJoycon:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
return QStringLiteral("image: url(:/controller/applet_joycon_left%0); ");
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
return QStringLiteral("image: url(:/controller/applet_joycon_right%0); ");
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::Handheld:
return QStringLiteral("image: url(:/controller/applet_handheld%0); ");
default:
return QString{};
@@ -516,54 +508,38 @@ void QtControllerSelectorDialog::UpdateControllerIcon(std::size_t player_index)
}
void QtControllerSelectorDialog::UpdateControllerState(std::size_t player_index) {
- auto& player = Settings::values.players.GetValue()[player_index];
+ auto* controller = system.HIDCore().GetEmulatedControllerByIndex(player_index);
const auto controller_type = GetControllerTypeFromIndex(
emulated_controllers[player_index]->currentIndex(), player_index);
const auto player_connected = player_groupboxes[player_index]->isChecked() &&
- controller_type != Settings::ControllerType::Handheld;
+ controller_type != Core::HID::NpadStyleIndex::Handheld;
- if (player.controller_type == controller_type && player.connected == player_connected) {
- // Set vibration devices in the event that the input device has changed.
- ConfigureVibration::SetVibrationDevices(player_index);
+ if (controller->GetNpadStyleIndex(true) == controller_type &&
+ controller->IsConnected(true) == player_connected) {
return;
}
// Disconnect the controller first.
- UpdateController(controller_type, player_index, false, system);
-
- player.controller_type = controller_type;
- player.connected = player_connected;
-
- ConfigureVibration::SetVibrationDevices(player_index);
+ UpdateController(controller, controller_type, false);
// Handheld
if (player_index == 0) {
- auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX];
- if (controller_type == Settings::ControllerType::Handheld) {
- handheld = player;
+ if (controller_type == Core::HID::NpadStyleIndex::Handheld) {
+ auto* handheld =
+ system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ UpdateController(handheld, Core::HID::NpadStyleIndex::Handheld,
+ player_groupboxes[player_index]->isChecked());
}
- handheld.connected = player_groupboxes[player_index]->isChecked() &&
- controller_type == Settings::ControllerType::Handheld;
- UpdateController(Settings::ControllerType::Handheld, 8, handheld.connected, system);
- }
-
- if (!player.connected) {
- return;
}
- // This emulates a delay between disconnecting and reconnecting controllers as some games
- // do not respond to a change in controller type if it was instantaneous.
- using namespace std::chrono_literals;
- std::this_thread::sleep_for(60ms);
-
- UpdateController(controller_type, player_index, player_connected, system);
+ UpdateController(controller, controller_type, player_connected);
}
void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) {
if (!player_groupboxes[player_index]->isChecked() ||
GetControllerTypeFromIndex(emulated_controllers[player_index]->currentIndex(),
- player_index) == Settings::ControllerType::Handheld) {
+ player_index) == Core::HID::NpadStyleIndex::Handheld) {
led_patterns_boxes[player_index][0]->setChecked(false);
led_patterns_boxes[player_index][1]->setChecked(false);
led_patterns_boxes[player_index][2]->setChecked(false);
@@ -571,10 +547,12 @@ void QtControllerSelectorDialog::UpdateLEDPattern(std::size_t player_index) {
return;
}
- led_patterns_boxes[player_index][0]->setChecked(led_patterns[player_index][0]);
- led_patterns_boxes[player_index][1]->setChecked(led_patterns[player_index][1]);
- led_patterns_boxes[player_index][2]->setChecked(led_patterns[player_index][2]);
- led_patterns_boxes[player_index][3]->setChecked(led_patterns[player_index][3]);
+ const auto* controller = system.HIDCore().GetEmulatedControllerByIndex(player_index);
+ const auto led_pattern = controller->GetLedPattern();
+ led_patterns_boxes[player_index][0]->setChecked(led_pattern.position1);
+ led_patterns_boxes[player_index][1]->setChecked(led_pattern.position2);
+ led_patterns_boxes[player_index][2]->setChecked(led_pattern.position3);
+ led_patterns_boxes[player_index][3]->setChecked(led_pattern.position4);
}
void QtControllerSelectorDialog::UpdateBorderColor(std::size_t player_index) {
@@ -654,10 +632,9 @@ void QtControllerSelectorDialog::DisableUnsupportedPlayers() {
}
for (std::size_t index = max_supported_players; index < NUM_PLAYERS; ++index) {
+ auto* controller = system.HIDCore().GetEmulatedControllerByIndex(index);
// Disconnect any unsupported players here and disable or hide them if applicable.
- Settings::values.players.GetValue()[index].connected = false;
- UpdateController(Settings::values.players.GetValue()[index].controller_type, index, false,
- system);
+ UpdateController(controller, controller->GetNpadStyleIndex(true), false);
// Hide the player widgets when max_supported_controllers is less than or equal to 4.
if (max_supported_players <= 4) {
player_widgets[index]->hide();
diff --git a/src/yuzu/applets/qt_controller.h b/src/yuzu/applets/qt_controller.h
index 037325f50..7ab9ced3d 100644
--- a/src/yuzu/applets/qt_controller.h
+++ b/src/yuzu/applets/qt_controller.h
@@ -7,7 +7,6 @@
#include <array>
#include <memory>
#include <QDialog>
-#include "core/core.h"
#include "core/frontend/applets/controller.h"
class GMainWindow;
@@ -23,14 +22,19 @@ namespace InputCommon {
class InputSubsystem;
}
-namespace Settings {
-enum class ControllerType;
-}
-
namespace Ui {
class QtControllerSelectorDialog;
}
+namespace Core {
+class System;
+}
+
+namespace Core::HID {
+class HIDCore;
+enum class NpadStyleIndex : u8;
+} // namespace Core::HID
+
class QtControllerSelectorDialog final : public QDialog {
Q_OBJECT
@@ -70,10 +74,10 @@ private:
void SetEmulatedControllers(std::size_t player_index);
// Gets the Controller Type for a given controller combobox index per player.
- Settings::ControllerType GetControllerTypeFromIndex(int index, std::size_t player_index) const;
+ Core::HID::NpadStyleIndex GetControllerTypeFromIndex(int index, std::size_t player_index) const;
// Gets the controller combobox index for a given Controller Type per player.
- int GetIndexFromControllerType(Settings::ControllerType type, std::size_t player_index) const;
+ int GetIndexFromControllerType(Core::HID::NpadStyleIndex type, std::size_t player_index) const;
// Updates the controller icons per player.
void UpdateControllerIcon(std::size_t player_index);
@@ -135,7 +139,7 @@ private:
std::array<QComboBox*, NUM_PLAYERS> emulated_controllers;
/// Pairs of emulated controller index and Controller Type enum per player.
- std::array<std::vector<std::pair<int, Settings::ControllerType>>, NUM_PLAYERS>
+ std::array<std::vector<std::pair<int, Core::HID::NpadStyleIndex>>, NUM_PLAYERS>
index_controller_type_pairs;
// Labels representing the number of connected controllers
diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp
index a56638e21..7b19f1f8d 100644
--- a/src/yuzu/applets/qt_profile_select.cpp
+++ b/src/yuzu/applets/qt_profile_select.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include <mutex>
+#include <QApplication>
#include <QDialogButtonBox>
#include <QHeaderView>
#include <QLabel>
@@ -16,6 +17,7 @@
#include "core/hle/lock.h"
#include "yuzu/applets/qt_profile_select.h"
#include "yuzu/main.h"
+#include "yuzu/util/controller_navigation.h"
namespace {
QString FormatUserEntryText(const QString& username, Common::UUID uuid) {
@@ -45,7 +47,7 @@ QPixmap GetIcon(Common::UUID uuid) {
}
} // Anonymous namespace
-QtProfileSelectionDialog::QtProfileSelectionDialog(QWidget* parent)
+QtProfileSelectionDialog::QtProfileSelectionDialog(Core::HID::HIDCore& hid_core, QWidget* parent)
: QDialog(parent), profile_manager(std::make_unique<Service::Account::ProfileManager>()) {
outer_layout = new QVBoxLayout;
@@ -65,6 +67,7 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(QWidget* parent)
tree_view = new QTreeView;
item_model = new QStandardItemModel(tree_view);
tree_view->setModel(item_model);
+ controller_navigation = new ControllerNavigation(hid_core, this);
tree_view->setAlternatingRowColors(true);
tree_view->setSelectionMode(QHeaderView::SingleSelection);
@@ -91,6 +94,14 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(QWidget* parent)
scroll_area->setLayout(layout);
connect(tree_view, &QTreeView::clicked, this, &QtProfileSelectionDialog::SelectUser);
+ connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent,
+ [this](Qt::Key key) {
+ if (!this->isActiveWindow()) {
+ return;
+ }
+ QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier);
+ QCoreApplication::postEvent(tree_view, event);
+ });
const auto& profiles = profile_manager->GetAllUsers();
for (const auto& user : profiles) {
@@ -113,7 +124,9 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(QWidget* parent)
resize(550, 400);
}
-QtProfileSelectionDialog::~QtProfileSelectionDialog() = default;
+QtProfileSelectionDialog::~QtProfileSelectionDialog() {
+ controller_navigation->UnloadController();
+};
int QtProfileSelectionDialog::exec() {
// Skip profile selection when there's only one.
diff --git a/src/yuzu/applets/qt_profile_select.h b/src/yuzu/applets/qt_profile_select.h
index 4e9037488..56496ed31 100644
--- a/src/yuzu/applets/qt_profile_select.h
+++ b/src/yuzu/applets/qt_profile_select.h
@@ -11,6 +11,7 @@
#include "core/frontend/applets/profile_select.h"
#include "core/hle/service/acc/profile_manager.h"
+class ControllerNavigation;
class GMainWindow;
class QDialogButtonBox;
class QGraphicsScene;
@@ -20,11 +21,15 @@ class QStandardItem;
class QStandardItemModel;
class QVBoxLayout;
+namespace Core::HID {
+class HIDCore;
+} // namespace Core::HID
+
class QtProfileSelectionDialog final : public QDialog {
Q_OBJECT
public:
- explicit QtProfileSelectionDialog(QWidget* parent);
+ explicit QtProfileSelectionDialog(Core::HID::HIDCore& hid_core, QWidget* parent);
~QtProfileSelectionDialog() override;
int exec() override;
@@ -51,6 +56,7 @@ private:
QDialogButtonBox* buttons;
std::unique_ptr<Service::Account::ProfileManager> profile_manager;
+ ControllerNavigation* controller_navigation = nullptr;
};
class QtProfileSelector final : public QObject, public Core::Frontend::ProfileSelectApplet {
diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp
index a83a11a95..c3857fc98 100644
--- a/src/yuzu/applets/qt_software_keyboard.cpp
+++ b/src/yuzu/applets/qt_software_keyboard.cpp
@@ -10,7 +10,10 @@
#include "common/settings.h"
#include "common/string_util.h"
#include "core/core.h"
-#include "core/frontend/input_interpreter.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/input_interpreter.h"
#include "ui_qt_software_keyboard.h"
#include "yuzu/applets/qt_software_keyboard.h"
#include "yuzu/main.h"
@@ -472,11 +475,26 @@ void QtSoftwareKeyboardDialog::open() {
row = 0;
column = 0;
- const auto* const curr_button =
- keyboard_buttons[static_cast<int>(bottom_osk_index)][row][column];
+ switch (bottom_osk_index) {
+ case BottomOSKIndex::LowerCase:
+ case BottomOSKIndex::UpperCase: {
+ const auto* const curr_button =
+ keyboard_buttons[static_cast<std::size_t>(bottom_osk_index)][row][column];
+
+ // This is a workaround for setFocus() randomly not showing focus in the UI
+ QCursor::setPos(curr_button->mapToGlobal(curr_button->rect().center()));
+ break;
+ }
+ case BottomOSKIndex::NumberPad: {
+ const auto* const curr_button = numberpad_buttons[row][column];
- // This is a workaround for setFocus() randomly not showing focus in the UI
- QCursor::setPos(curr_button->mapToGlobal(curr_button->rect().center()));
+ // This is a workaround for setFocus() randomly not showing focus in the UI
+ QCursor::setPos(curr_button->mapToGlobal(curr_button->rect().center()));
+ break;
+ }
+ default:
+ break;
+ }
StartInputThread();
}
@@ -484,7 +502,7 @@ void QtSoftwareKeyboardDialog::open() {
void QtSoftwareKeyboardDialog::reject() {
// Pressing the ESC key in a dialog calls QDialog::reject().
// We will override this behavior to the "Cancel" action on the software keyboard.
- TranslateButtonPress(HIDButton::X);
+ TranslateButtonPress(Core::HID::NpadButton::X);
}
void QtSoftwareKeyboardDialog::keyPressEvent(QKeyEvent* event) {
@@ -722,7 +740,7 @@ void QtSoftwareKeyboardDialog::SetTextDrawType() {
connect(
ui->line_edit_osk, &QLineEdit::returnPressed, this,
- [this] { TranslateButtonPress(HIDButton::Plus); }, Qt::QueuedConnection);
+ [this] { TranslateButtonPress(Core::HID::NpadButton::Plus); }, Qt::QueuedConnection);
ui->line_edit_osk->setPlaceholderText(
QString::fromStdU16String(initialize_parameters.guide_text));
@@ -795,9 +813,10 @@ void QtSoftwareKeyboardDialog::SetTextDrawType() {
}
void QtSoftwareKeyboardDialog::SetControllerImage() {
- const auto controller_type = Settings::values.players.GetValue()[8].connected
- ? Settings::values.players.GetValue()[8].controller_type
- : Settings::values.players.GetValue()[0].controller_type;
+ const auto* handheld = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ const auto* player_1 = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
+ const auto controller_type =
+ handheld->IsConnected() ? handheld->GetNpadStyleIndex() : player_1->GetNpadStyleIndex();
const QString theme = [] {
if (QIcon::themeName().contains(QStringLiteral("dark")) ||
@@ -809,8 +828,8 @@ void QtSoftwareKeyboardDialog::SetControllerImage() {
}();
switch (controller_type) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::GameCube:
ui->icon_controller->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme));
ui->icon_controller_shift->setStyleSheet(
@@ -818,7 +837,7 @@ void QtSoftwareKeyboardDialog::SetControllerImage() {
ui->icon_controller_num->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme));
break;
- case Settings::ControllerType::DualJoyconDetached:
+ case Core::HID::NpadStyleIndex::JoyconDual:
ui->icon_controller->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme));
ui->icon_controller_shift->setStyleSheet(
@@ -826,7 +845,7 @@ void QtSoftwareKeyboardDialog::SetControllerImage() {
ui->icon_controller_num->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme));
break;
- case Settings::ControllerType::LeftJoycon:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
ui->icon_controller->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);")
.arg(theme));
@@ -837,7 +856,7 @@ void QtSoftwareKeyboardDialog::SetControllerImage() {
QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);")
.arg(theme));
break;
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
ui->icon_controller->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);")
.arg(theme));
@@ -848,7 +867,7 @@ void QtSoftwareKeyboardDialog::SetControllerImage() {
QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);")
.arg(theme));
break;
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::Handheld:
ui->icon_controller->setStyleSheet(
QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme));
ui->icon_controller_shift->setStyleSheet(
@@ -1208,9 +1227,9 @@ void QtSoftwareKeyboardDialog::SetupMouseHover() {
}
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void QtSoftwareKeyboardDialog::HandleButtonPressedOnce() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonPressedOnce(button)) {
TranslateButtonPress(button);
}
@@ -1219,9 +1238,9 @@ void QtSoftwareKeyboardDialog::HandleButtonPressedOnce() {
(f(T), ...);
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void QtSoftwareKeyboardDialog::HandleButtonHold() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonHeld(button)) {
TranslateButtonPress(button);
}
@@ -1230,9 +1249,9 @@ void QtSoftwareKeyboardDialog::HandleButtonHold() {
(f(T), ...);
}
-void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
+void QtSoftwareKeyboardDialog::TranslateButtonPress(Core::HID::NpadButton button) {
switch (button) {
- case HIDButton::A:
+ case Core::HID::NpadButton::A:
switch (bottom_osk_index) {
case BottomOSKIndex::LowerCase:
case BottomOSKIndex::UpperCase:
@@ -1245,7 +1264,7 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
break;
}
break;
- case HIDButton::B:
+ case Core::HID::NpadButton::B:
switch (bottom_osk_index) {
case BottomOSKIndex::LowerCase:
ui->button_backspace->click();
@@ -1260,7 +1279,7 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
break;
}
break;
- case HIDButton::X:
+ case Core::HID::NpadButton::X:
if (is_inline) {
emit SubmitInlineText(SwkbdReplyType::DecidedCancel, current_text, cursor_position);
} else {
@@ -1271,7 +1290,7 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
emit SubmitNormalText(SwkbdResult::Cancel, std::move(text));
}
break;
- case HIDButton::Y:
+ case Core::HID::NpadButton::Y:
switch (bottom_osk_index) {
case BottomOSKIndex::LowerCase:
ui->button_space->click();
@@ -1284,8 +1303,8 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
break;
}
break;
- case HIDButton::LStick:
- case HIDButton::RStick:
+ case Core::HID::NpadButton::StickL:
+ case Core::HID::NpadButton::StickR:
switch (bottom_osk_index) {
case BottomOSKIndex::LowerCase:
ui->button_shift->click();
@@ -1298,13 +1317,13 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
break;
}
break;
- case HIDButton::L:
+ case Core::HID::NpadButton::L:
MoveTextCursorDirection(Direction::Left);
break;
- case HIDButton::R:
+ case Core::HID::NpadButton::R:
MoveTextCursorDirection(Direction::Right);
break;
- case HIDButton::Plus:
+ case Core::HID::NpadButton::Plus:
switch (bottom_osk_index) {
case BottomOSKIndex::LowerCase:
ui->button_ok->click();
@@ -1319,24 +1338,24 @@ void QtSoftwareKeyboardDialog::TranslateButtonPress(HIDButton button) {
break;
}
break;
- case HIDButton::DLeft:
- case HIDButton::LStickLeft:
- case HIDButton::RStickLeft:
+ case Core::HID::NpadButton::Left:
+ case Core::HID::NpadButton::StickLLeft:
+ case Core::HID::NpadButton::StickRLeft:
MoveButtonDirection(Direction::Left);
break;
- case HIDButton::DUp:
- case HIDButton::LStickUp:
- case HIDButton::RStickUp:
+ case Core::HID::NpadButton::Up:
+ case Core::HID::NpadButton::StickLUp:
+ case Core::HID::NpadButton::StickRUp:
MoveButtonDirection(Direction::Up);
break;
- case HIDButton::DRight:
- case HIDButton::LStickRight:
- case HIDButton::RStickRight:
+ case Core::HID::NpadButton::Right:
+ case Core::HID::NpadButton::StickLRight:
+ case Core::HID::NpadButton::StickRRight:
MoveButtonDirection(Direction::Right);
break;
- case HIDButton::DDown:
- case HIDButton::LStickDown:
- case HIDButton::RStickDown:
+ case Core::HID::NpadButton::Down:
+ case Core::HID::NpadButton::StickLDown:
+ case Core::HID::NpadButton::StickRDown:
MoveButtonDirection(Direction::Down);
break;
default:
@@ -1467,19 +1486,25 @@ void QtSoftwareKeyboardDialog::InputThread() {
while (input_thread_running) {
input_interpreter->PollInput();
- HandleButtonPressedOnce<HIDButton::A, HIDButton::B, HIDButton::X, HIDButton::Y,
- HIDButton::LStick, HIDButton::RStick, HIDButton::L, HIDButton::R,
- HIDButton::Plus, HIDButton::DLeft, HIDButton::DUp,
- HIDButton::DRight, HIDButton::DDown, HIDButton::LStickLeft,
- HIDButton::LStickUp, HIDButton::LStickRight, HIDButton::LStickDown,
- HIDButton::RStickLeft, HIDButton::RStickUp, HIDButton::RStickRight,
- HIDButton::RStickDown>();
-
- HandleButtonHold<HIDButton::B, HIDButton::L, HIDButton::R, HIDButton::DLeft, HIDButton::DUp,
- HIDButton::DRight, HIDButton::DDown, HIDButton::LStickLeft,
- HIDButton::LStickUp, HIDButton::LStickRight, HIDButton::LStickDown,
- HIDButton::RStickLeft, HIDButton::RStickUp, HIDButton::RStickRight,
- HIDButton::RStickDown>();
+ HandleButtonPressedOnce<
+ Core::HID::NpadButton::A, Core::HID::NpadButton::B, Core::HID::NpadButton::X,
+ Core::HID::NpadButton::Y, Core::HID::NpadButton::StickL, Core::HID::NpadButton::StickR,
+ Core::HID::NpadButton::L, Core::HID::NpadButton::R, Core::HID::NpadButton::Plus,
+ Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right,
+ Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft,
+ Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight,
+ Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft,
+ Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight,
+ Core::HID::NpadButton::StickRDown>();
+
+ HandleButtonHold<Core::HID::NpadButton::B, Core::HID::NpadButton::L,
+ Core::HID::NpadButton::R, Core::HID::NpadButton::Left,
+ Core::HID::NpadButton::Up, Core::HID::NpadButton::Right,
+ Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft,
+ Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight,
+ Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft,
+ Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight,
+ Core::HID::NpadButton::StickRDown>();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h
index 592d9c085..b030cdcf7 100644
--- a/src/yuzu/applets/qt_software_keyboard.h
+++ b/src/yuzu/applets/qt_software_keyboard.h
@@ -14,14 +14,16 @@
#include "core/frontend/applets/software_keyboard.h"
-enum class HIDButton : u8;
-
class InputInterpreter;
namespace Core {
class System;
}
+namespace Core::HID {
+enum class NpadButton : u64;
+}
+
namespace Ui {
class QtSoftwareKeyboardDialog;
}
@@ -146,7 +148,7 @@ private:
*
* @tparam HIDButton The list of buttons that can be converted into keyboard input.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleButtonPressedOnce();
/**
@@ -154,7 +156,7 @@ private:
*
* @tparam HIDButton The list of buttons that can be converted into keyboard input.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleButtonHold();
/**
@@ -162,7 +164,7 @@ private:
*
* @param button The button press to process.
*/
- void TranslateButtonPress(HIDButton button);
+ void TranslateButtonPress(Core::HID::NpadButton button);
/**
* Moves the focus of a button in a certain direction.
diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp
index da8c6882a..cb3c5d826 100644
--- a/src/yuzu/applets/qt_web_browser.cpp
+++ b/src/yuzu/applets/qt_web_browser.cpp
@@ -14,9 +14,11 @@
#endif
#include "common/fs/path_util.h"
+#include "common/param_package.h"
#include "core/core.h"
-#include "core/frontend/input_interpreter.h"
-#include "input_common/keyboard.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/input_interpreter.h"
+#include "input_common/drivers/keyboard.h"
#include "input_common/main.h"
#include "yuzu/applets/qt_web_browser.h"
#include "yuzu/applets/qt_web_browser_scripts.h"
@@ -27,19 +29,19 @@
namespace {
-constexpr int HIDButtonToKey(HIDButton button) {
+constexpr int HIDButtonToKey(Core::HID::NpadButton button) {
switch (button) {
- case HIDButton::DLeft:
- case HIDButton::LStickLeft:
+ case Core::HID::NpadButton::Left:
+ case Core::HID::NpadButton::StickLLeft:
return Qt::Key_Left;
- case HIDButton::DUp:
- case HIDButton::LStickUp:
+ case Core::HID::NpadButton::Up:
+ case Core::HID::NpadButton::StickLUp:
return Qt::Key_Up;
- case HIDButton::DRight:
- case HIDButton::LStickRight:
+ case Core::HID::NpadButton::Right:
+ case Core::HID::NpadButton::StickLRight:
return Qt::Key_Right;
- case HIDButton::DDown:
- case HIDButton::LStickDown:
+ case Core::HID::NpadButton::Down:
+ case Core::HID::NpadButton::StickLDown:
return Qt::Key_Down;
default:
return 0;
@@ -208,25 +210,25 @@ void QtNXWebEngineView::keyReleaseEvent(QKeyEvent* event) {
}
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonPressedOnce(button)) {
page()->runJavaScript(
QStringLiteral("yuzu_key_callbacks[%1] == null;").arg(static_cast<u8>(button)),
[this, button](const QVariant& variant) {
if (variant.toBool()) {
switch (button) {
- case HIDButton::A:
+ case Core::HID::NpadButton::A:
SendMultipleKeyPressEvents<Qt::Key_A, Qt::Key_Space, Qt::Key_Return>();
break;
- case HIDButton::B:
+ case Core::HID::NpadButton::B:
SendKeyPressEvent(Qt::Key_B);
break;
- case HIDButton::X:
+ case Core::HID::NpadButton::X:
SendKeyPressEvent(Qt::Key_X);
break;
- case HIDButton::Y:
+ case Core::HID::NpadButton::Y:
SendKeyPressEvent(Qt::Key_Y);
break;
default:
@@ -244,9 +246,9 @@ void QtNXWebEngineView::HandleWindowFooterButtonPressedOnce() {
(f(T), ...);
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void QtNXWebEngineView::HandleWindowKeyButtonPressedOnce() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonPressedOnce(button)) {
SendKeyPressEvent(HIDButtonToKey(button));
}
@@ -255,9 +257,9 @@ void QtNXWebEngineView::HandleWindowKeyButtonPressedOnce() {
(f(T), ...);
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void QtNXWebEngineView::HandleWindowKeyButtonHold() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonHeld(button)) {
SendKeyPressEvent(HIDButtonToKey(button));
}
@@ -308,17 +310,21 @@ void QtNXWebEngineView::InputThread() {
while (input_thread_running) {
input_interpreter->PollInput();
- HandleWindowFooterButtonPressedOnce<HIDButton::A, HIDButton::B, HIDButton::X, HIDButton::Y,
- HIDButton::L, HIDButton::R>();
-
- HandleWindowKeyButtonPressedOnce<HIDButton::DLeft, HIDButton::DUp, HIDButton::DRight,
- HIDButton::DDown, HIDButton::LStickLeft,
- HIDButton::LStickUp, HIDButton::LStickRight,
- HIDButton::LStickDown>();
-
- HandleWindowKeyButtonHold<HIDButton::DLeft, HIDButton::DUp, HIDButton::DRight,
- HIDButton::DDown, HIDButton::LStickLeft, HIDButton::LStickUp,
- HIDButton::LStickRight, HIDButton::LStickDown>();
+ HandleWindowFooterButtonPressedOnce<Core::HID::NpadButton::A, Core::HID::NpadButton::B,
+ Core::HID::NpadButton::X, Core::HID::NpadButton::Y,
+ Core::HID::NpadButton::L, Core::HID::NpadButton::R>();
+
+ HandleWindowKeyButtonPressedOnce<
+ Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right,
+ Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft,
+ Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight,
+ Core::HID::NpadButton::StickLDown>();
+
+ HandleWindowKeyButtonHold<
+ Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right,
+ Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft,
+ Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight,
+ Core::HID::NpadButton::StickLDown>();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h
index 7e9f703fc..fa18aecac 100644
--- a/src/yuzu/applets/qt_web_browser.h
+++ b/src/yuzu/applets/qt_web_browser.h
@@ -16,8 +16,6 @@
#include "core/frontend/applets/web_browser.h"
-enum class HIDButton : u8;
-
class GMainWindow;
class InputInterpreter;
class UrlRequestInterceptor;
@@ -26,6 +24,10 @@ namespace Core {
class System;
}
+namespace Core::HID {
+enum class NpadButton : u64;
+}
+
namespace InputCommon {
class InputSubsystem;
}
@@ -114,7 +116,7 @@ private:
*
* @tparam HIDButton The list of buttons contained in yuzu_key_callbacks
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleWindowFooterButtonPressedOnce();
/**
@@ -123,7 +125,7 @@ private:
*
* @tparam HIDButton The list of buttons that can be converted into keyboard input.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleWindowKeyButtonPressedOnce();
/**
@@ -132,7 +134,7 @@ private:
*
* @tparam HIDButton The list of buttons that can be converted into keyboard input.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleWindowKeyButtonHold();
/**
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 976acd176..114f17c06 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -32,10 +32,11 @@
#include "common/settings.h"
#include "core/core.h"
#include "core/frontend/framebuffer_layout.h"
-#include "input_common/keyboard.h"
+#include "input_common/drivers/keyboard.h"
+#include "input_common/drivers/mouse.h"
+#include "input_common/drivers/tas_input.h"
+#include "input_common/drivers/touch_screen.h"
#include "input_common/main.h"
-#include "input_common/mouse/mouse_input.h"
-#include "input_common/tas/tas_input.h"
#include "video_core/renderer_base.h"
#include "video_core/video_core.h"
#include "yuzu/bootmanager.h"
@@ -296,13 +297,13 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_,
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
input_subsystem->Initialize();
-
this->setMouseTracking(true);
connect(this, &GRenderWindow::FirstFrameDisplayed, parent, &GMainWindow::OnLoadComplete);
connect(this, &GRenderWindow::ExecuteProgramSignal, parent, &GMainWindow::OnExecuteProgram,
Qt::QueuedConnection);
connect(this, &GRenderWindow::ExitSignal, parent, &GMainWindow::OnExit, Qt::QueuedConnection);
+ connect(this, &GRenderWindow::TasPlaybackStateChanged, parent, &GMainWindow::OnTasStateChanged);
}
void GRenderWindow::ExecuteProgram(std::size_t program_index) {
@@ -319,10 +320,19 @@ GRenderWindow::~GRenderWindow() {
void GRenderWindow::OnFrameDisplayed() {
input_subsystem->GetTas()->UpdateThread();
+ const InputCommon::TasInput::TasState new_tas_state =
+ std::get<0>(input_subsystem->GetTas()->GetStatus());
+
if (!first_frame) {
+ last_tas_state = new_tas_state;
first_frame = true;
emit FirstFrameDisplayed();
}
+
+ if (new_tas_state != last_tas_state) {
+ last_tas_state = new_tas_state;
+ emit TasPlaybackStateChanged();
+ }
}
bool GRenderWindow::IsShown() const {
@@ -383,34 +393,329 @@ void GRenderWindow::closeEvent(QCloseEvent* event) {
QWidget::closeEvent(event);
}
+int GRenderWindow::QtKeyToSwitchKey(Qt::Key qt_key) {
+ switch (qt_key) {
+ case Qt::Key_A:
+ return Settings::NativeKeyboard::A;
+ case Qt::Key_B:
+ return Settings::NativeKeyboard::B;
+ case Qt::Key_C:
+ return Settings::NativeKeyboard::C;
+ case Qt::Key_D:
+ return Settings::NativeKeyboard::D;
+ case Qt::Key_E:
+ return Settings::NativeKeyboard::E;
+ case Qt::Key_F:
+ return Settings::NativeKeyboard::F;
+ case Qt::Key_G:
+ return Settings::NativeKeyboard::G;
+ case Qt::Key_H:
+ return Settings::NativeKeyboard::H;
+ case Qt::Key_I:
+ return Settings::NativeKeyboard::I;
+ case Qt::Key_J:
+ return Settings::NativeKeyboard::J;
+ case Qt::Key_K:
+ return Settings::NativeKeyboard::K;
+ case Qt::Key_L:
+ return Settings::NativeKeyboard::L;
+ case Qt::Key_M:
+ return Settings::NativeKeyboard::M;
+ case Qt::Key_N:
+ return Settings::NativeKeyboard::N;
+ case Qt::Key_O:
+ return Settings::NativeKeyboard::O;
+ case Qt::Key_P:
+ return Settings::NativeKeyboard::P;
+ case Qt::Key_Q:
+ return Settings::NativeKeyboard::Q;
+ case Qt::Key_R:
+ return Settings::NativeKeyboard::R;
+ case Qt::Key_S:
+ return Settings::NativeKeyboard::S;
+ case Qt::Key_T:
+ return Settings::NativeKeyboard::T;
+ case Qt::Key_U:
+ return Settings::NativeKeyboard::U;
+ case Qt::Key_V:
+ return Settings::NativeKeyboard::V;
+ case Qt::Key_W:
+ return Settings::NativeKeyboard::W;
+ case Qt::Key_X:
+ return Settings::NativeKeyboard::X;
+ case Qt::Key_Y:
+ return Settings::NativeKeyboard::Y;
+ case Qt::Key_Z:
+ return Settings::NativeKeyboard::Z;
+ case Qt::Key_1:
+ return Settings::NativeKeyboard::N1;
+ case Qt::Key_2:
+ return Settings::NativeKeyboard::N2;
+ case Qt::Key_3:
+ return Settings::NativeKeyboard::N3;
+ case Qt::Key_4:
+ return Settings::NativeKeyboard::N4;
+ case Qt::Key_5:
+ return Settings::NativeKeyboard::N5;
+ case Qt::Key_6:
+ return Settings::NativeKeyboard::N6;
+ case Qt::Key_7:
+ return Settings::NativeKeyboard::N7;
+ case Qt::Key_8:
+ return Settings::NativeKeyboard::N8;
+ case Qt::Key_9:
+ return Settings::NativeKeyboard::N9;
+ case Qt::Key_0:
+ return Settings::NativeKeyboard::N0;
+ case Qt::Key_Return:
+ return Settings::NativeKeyboard::Return;
+ case Qt::Key_Escape:
+ return Settings::NativeKeyboard::Escape;
+ case Qt::Key_Backspace:
+ return Settings::NativeKeyboard::Backspace;
+ case Qt::Key_Tab:
+ return Settings::NativeKeyboard::Tab;
+ case Qt::Key_Space:
+ return Settings::NativeKeyboard::Space;
+ case Qt::Key_Minus:
+ return Settings::NativeKeyboard::Minus;
+ case Qt::Key_Plus:
+ case Qt::Key_questiondown:
+ return Settings::NativeKeyboard::Plus;
+ case Qt::Key_BracketLeft:
+ case Qt::Key_BraceLeft:
+ return Settings::NativeKeyboard::OpenBracket;
+ case Qt::Key_BracketRight:
+ case Qt::Key_BraceRight:
+ return Settings::NativeKeyboard::CloseBracket;
+ case Qt::Key_Bar:
+ return Settings::NativeKeyboard::Pipe;
+ case Qt::Key_Dead_Tilde:
+ return Settings::NativeKeyboard::Tilde;
+ case Qt::Key_Ntilde:
+ case Qt::Key_Semicolon:
+ return Settings::NativeKeyboard::Semicolon;
+ case Qt::Key_Apostrophe:
+ return Settings::NativeKeyboard::Quote;
+ case Qt::Key_Dead_Grave:
+ return Settings::NativeKeyboard::Backquote;
+ case Qt::Key_Comma:
+ return Settings::NativeKeyboard::Comma;
+ case Qt::Key_Period:
+ return Settings::NativeKeyboard::Period;
+ case Qt::Key_Slash:
+ return Settings::NativeKeyboard::Slash;
+ case Qt::Key_CapsLock:
+ return Settings::NativeKeyboard::CapsLock;
+ case Qt::Key_F1:
+ return Settings::NativeKeyboard::F1;
+ case Qt::Key_F2:
+ return Settings::NativeKeyboard::F2;
+ case Qt::Key_F3:
+ return Settings::NativeKeyboard::F3;
+ case Qt::Key_F4:
+ return Settings::NativeKeyboard::F4;
+ case Qt::Key_F5:
+ return Settings::NativeKeyboard::F5;
+ case Qt::Key_F6:
+ return Settings::NativeKeyboard::F6;
+ case Qt::Key_F7:
+ return Settings::NativeKeyboard::F7;
+ case Qt::Key_F8:
+ return Settings::NativeKeyboard::F8;
+ case Qt::Key_F9:
+ return Settings::NativeKeyboard::F9;
+ case Qt::Key_F10:
+ return Settings::NativeKeyboard::F10;
+ case Qt::Key_F11:
+ return Settings::NativeKeyboard::F11;
+ case Qt::Key_F12:
+ return Settings::NativeKeyboard::F12;
+ case Qt::Key_Print:
+ return Settings::NativeKeyboard::PrintScreen;
+ case Qt::Key_ScrollLock:
+ return Settings::NativeKeyboard::ScrollLock;
+ case Qt::Key_Pause:
+ return Settings::NativeKeyboard::Pause;
+ case Qt::Key_Insert:
+ return Settings::NativeKeyboard::Insert;
+ case Qt::Key_Home:
+ return Settings::NativeKeyboard::Home;
+ case Qt::Key_PageUp:
+ return Settings::NativeKeyboard::PageUp;
+ case Qt::Key_Delete:
+ return Settings::NativeKeyboard::Delete;
+ case Qt::Key_End:
+ return Settings::NativeKeyboard::End;
+ case Qt::Key_PageDown:
+ return Settings::NativeKeyboard::PageDown;
+ case Qt::Key_Right:
+ return Settings::NativeKeyboard::Right;
+ case Qt::Key_Left:
+ return Settings::NativeKeyboard::Left;
+ case Qt::Key_Down:
+ return Settings::NativeKeyboard::Down;
+ case Qt::Key_Up:
+ return Settings::NativeKeyboard::Up;
+ case Qt::Key_NumLock:
+ return Settings::NativeKeyboard::NumLock;
+ // Numpad keys are missing here
+ case Qt::Key_F13:
+ return Settings::NativeKeyboard::F13;
+ case Qt::Key_F14:
+ return Settings::NativeKeyboard::F14;
+ case Qt::Key_F15:
+ return Settings::NativeKeyboard::F15;
+ case Qt::Key_F16:
+ return Settings::NativeKeyboard::F16;
+ case Qt::Key_F17:
+ return Settings::NativeKeyboard::F17;
+ case Qt::Key_F18:
+ return Settings::NativeKeyboard::F18;
+ case Qt::Key_F19:
+ return Settings::NativeKeyboard::F19;
+ case Qt::Key_F20:
+ return Settings::NativeKeyboard::F20;
+ case Qt::Key_F21:
+ return Settings::NativeKeyboard::F21;
+ case Qt::Key_F22:
+ return Settings::NativeKeyboard::F22;
+ case Qt::Key_F23:
+ return Settings::NativeKeyboard::F23;
+ case Qt::Key_F24:
+ return Settings::NativeKeyboard::F24;
+ // case Qt:::
+ // return Settings::NativeKeyboard::KPComma;
+ // case Qt:::
+ // return Settings::NativeKeyboard::Ro;
+ case Qt::Key_Hiragana_Katakana:
+ return Settings::NativeKeyboard::KatakanaHiragana;
+ case Qt::Key_yen:
+ return Settings::NativeKeyboard::Yen;
+ case Qt::Key_Henkan:
+ return Settings::NativeKeyboard::Henkan;
+ case Qt::Key_Muhenkan:
+ return Settings::NativeKeyboard::Muhenkan;
+ // case Qt:::
+ // return Settings::NativeKeyboard::NumPadCommaPc98;
+ case Qt::Key_Hangul:
+ return Settings::NativeKeyboard::HangulEnglish;
+ case Qt::Key_Hangul_Hanja:
+ return Settings::NativeKeyboard::Hanja;
+ case Qt::Key_Katakana:
+ return Settings::NativeKeyboard::KatakanaKey;
+ case Qt::Key_Hiragana:
+ return Settings::NativeKeyboard::HiraganaKey;
+ case Qt::Key_Zenkaku_Hankaku:
+ return Settings::NativeKeyboard::ZenkakuHankaku;
+ // Modifier keys are handled by the modifier property
+ default:
+ return Settings::NativeKeyboard::None;
+ }
+}
+
+int GRenderWindow::QtModifierToSwitchModifier(Qt::KeyboardModifiers qt_modifiers) {
+ int modifier = 0;
+
+ if ((qt_modifiers & Qt::KeyboardModifier::ShiftModifier) != 0) {
+ modifier |= 1 << Settings::NativeKeyboard::LeftShift;
+ }
+ if ((qt_modifiers & Qt::KeyboardModifier::ControlModifier) != 0) {
+ modifier |= 1 << Settings::NativeKeyboard::LeftControl;
+ }
+ if ((qt_modifiers & Qt::KeyboardModifier::AltModifier) != 0) {
+ modifier |= 1 << Settings::NativeKeyboard::LeftAlt;
+ }
+ if ((qt_modifiers & Qt::KeyboardModifier::MetaModifier) != 0) {
+ modifier |= 1 << Settings::NativeKeyboard::LeftMeta;
+ }
+
+ // TODO: These keys can't be obtained with Qt::KeyboardModifier
+
+ // if ((qt_modifiers & 0x10) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::RightShift;
+ // }
+ // if ((qt_modifiers & 0x20) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::RightControl;
+ // }
+ // if ((qt_modifiers & 0x40) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::RightAlt;
+ // }
+ // if ((qt_modifiers & 0x80) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::RightMeta;
+ // }
+ // if ((qt_modifiers & 0x100) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::CapsLock;
+ // }
+ // if ((qt_modifiers & 0x200) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::NumLock;
+ // }
+ // if ((qt_modifiers & ???) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::ScrollLock;
+ // }
+ // if ((qt_modifiers & ???) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::Katakana;
+ // }
+ // if ((qt_modifiers & ???) != 0) {
+ // modifier |= 1 << Settings::NativeKeyboard::Hiragana;
+ // }
+ return modifier;
+}
+
void GRenderWindow::keyPressEvent(QKeyEvent* event) {
+ /**
+ * This feature can be enhanced with the following functions, but they do not provide
+ * cross-platform behavior.
+ *
+ * event->nativeVirtualKey() can distinguish between keys on the numpad.
+ * event->nativeModifiers() can distinguish between left and right keys and numlock,
+ * capslock, scroll lock.
+ */
if (!event->isAutoRepeat()) {
+ const auto modifier = QtModifierToSwitchModifier(event->modifiers());
+ const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
+ input_subsystem->GetKeyboard()->SetKeyboardModifiers(modifier);
+ input_subsystem->GetKeyboard()->PressKeyboardKey(key);
+ // This is used for gamepads that can have any key mapped
input_subsystem->GetKeyboard()->PressKey(event->key());
}
}
void GRenderWindow::keyReleaseEvent(QKeyEvent* event) {
+ /**
+ * This feature can be enhanced with the following functions, but they do not provide
+ * cross-platform behavior.
+ *
+ * event->nativeVirtualKey() can distinguish between keys on the numpad.
+ * event->nativeModifiers() can distinguish between left and right buttons and numlock,
+ * capslock, scroll lock.
+ */
if (!event->isAutoRepeat()) {
+ const auto modifier = QtModifierToSwitchModifier(event->modifiers());
+ const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
+ input_subsystem->GetKeyboard()->SetKeyboardModifiers(modifier);
+ input_subsystem->GetKeyboard()->ReleaseKeyboardKey(key);
+ // This is used for gamepads that can have any key mapped
input_subsystem->GetKeyboard()->ReleaseKey(event->key());
}
}
-MouseInput::MouseButton GRenderWindow::QtButtonToMouseButton(Qt::MouseButton button) {
+InputCommon::MouseButton GRenderWindow::QtButtonToMouseButton(Qt::MouseButton button) {
switch (button) {
case Qt::LeftButton:
- return MouseInput::MouseButton::Left;
+ return InputCommon::MouseButton::Left;
case Qt::RightButton:
- return MouseInput::MouseButton::Right;
+ return InputCommon::MouseButton::Right;
case Qt::MiddleButton:
- return MouseInput::MouseButton::Wheel;
+ return InputCommon::MouseButton::Wheel;
case Qt::BackButton:
- return MouseInput::MouseButton::Backward;
+ return InputCommon::MouseButton::Backward;
case Qt::ForwardButton:
- return MouseInput::MouseButton::Forward;
+ return InputCommon::MouseButton::Forward;
case Qt::TaskButton:
- return MouseInput::MouseButton::Task;
+ return InputCommon::MouseButton::Task;
default:
- return MouseInput::MouseButton::Extra;
+ return InputCommon::MouseButton::Extra;
}
}
@@ -423,12 +728,9 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
// coordinates and map them to the current render area
const auto pos = mapFromGlobal(QCursor::pos());
const auto [x, y] = ScaleTouch(pos);
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
const auto button = QtButtonToMouseButton(event->button());
- input_subsystem->GetMouse()->PressButton(x, y, button);
-
- if (event->button() == Qt::LeftButton) {
- this->TouchPressed(x, y, 0);
- }
+ input_subsystem->GetMouse()->PressButton(x, y, touch_x, touch_y, button);
emit MouseActivity();
}
@@ -442,12 +744,12 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
// coordinates and map them to the current render area
const auto pos = mapFromGlobal(QCursor::pos());
const auto [x, y] = ScaleTouch(pos);
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
const int center_x = width() / 2;
const int center_y = height() / 2;
- input_subsystem->GetMouse()->MouseMove(x, y, center_x, center_y);
- this->TouchMoved(x, y, 0);
+ input_subsystem->GetMouse()->MouseMove(x, y, touch_x, touch_y, center_x, center_y);
- if (Settings::values.mouse_panning) {
+ if (Settings::values.mouse_panning && !Settings::values.mouse_enabled) {
QCursor::setPos(mapToGlobal({center_x, center_y}));
}
@@ -462,10 +764,12 @@ void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
const auto button = QtButtonToMouseButton(event->button());
input_subsystem->GetMouse()->ReleaseButton(button);
+}
- if (event->button() == Qt::LeftButton) {
- this->TouchReleased(0);
- }
+void GRenderWindow::wheelEvent(QWheelEvent* event) {
+ const int x = event->angleDelta().x();
+ const int y = event->angleDelta().y();
+ input_subsystem->GetMouse()->MouseWheelChange(x, y);
}
void GRenderWindow::TouchBeginEvent(const QTouchEvent* event) {
@@ -488,7 +792,7 @@ void GRenderWindow::TouchUpdateEvent(const QTouchEvent* event) {
for (std::size_t id = 0; id < touch_ids.size(); ++id) {
if (!TouchExist(touch_ids[id], touch_points)) {
touch_ids[id] = 0;
- this->TouchReleased(id + 1);
+ input_subsystem->GetTouchScreen()->TouchReleased(id);
}
}
}
@@ -497,28 +801,28 @@ void GRenderWindow::TouchEndEvent() {
for (std::size_t id = 0; id < touch_ids.size(); ++id) {
if (touch_ids[id] != 0) {
touch_ids[id] = 0;
- this->TouchReleased(id + 1);
+ input_subsystem->GetTouchScreen()->TouchReleased(id);
}
}
}
-bool GRenderWindow::TouchStart(const QTouchEvent::TouchPoint& touch_point) {
+void GRenderWindow::TouchStart(const QTouchEvent::TouchPoint& touch_point) {
for (std::size_t id = 0; id < touch_ids.size(); ++id) {
if (touch_ids[id] == 0) {
touch_ids[id] = touch_point.id() + 1;
const auto [x, y] = ScaleTouch(touch_point.pos());
- this->TouchPressed(x, y, id + 1);
- return true;
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
+ input_subsystem->GetTouchScreen()->TouchPressed(touch_x, touch_y, id);
}
}
- return false;
}
bool GRenderWindow::TouchUpdate(const QTouchEvent::TouchPoint& touch_point) {
for (std::size_t id = 0; id < touch_ids.size(); ++id) {
if (touch_ids[id] == static_cast<std::size_t>(touch_point.id() + 1)) {
const auto [x, y] = ScaleTouch(touch_point.pos());
- this->TouchMoved(x, y, id + 1);
+ const auto [touch_x, touch_y] = MapToTouchScreen(x, y);
+ input_subsystem->GetTouchScreen()->TouchMoved(touch_x, touch_y, id);
return true;
}
}
@@ -551,7 +855,7 @@ void GRenderWindow::focusOutEvent(QFocusEvent* event) {
QWidget::focusOutEvent(event);
input_subsystem->GetKeyboard()->ReleaseAllKeys();
input_subsystem->GetMouse()->ReleaseAllButtons();
- this->TouchReleased(0);
+ input_subsystem->GetTouchScreen()->ReleaseAllTouch();
}
void GRenderWindow::resizeEvent(QResizeEvent* event) {
@@ -630,7 +934,7 @@ void GRenderWindow::ReleaseRenderTarget() {
void GRenderWindow::CaptureScreenshot(const QString& screenshot_path) {
auto& renderer = system.Renderer();
- const f32 res_scale = VideoCore::GetResolutionScaleFactor(renderer);
+ const f32 res_scale = Settings::values.resolution_info.up_factor;
const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)};
screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32);
@@ -760,7 +1064,7 @@ void GRenderWindow::showEvent(QShowEvent* event) {
bool GRenderWindow::eventFilter(QObject* object, QEvent* event) {
if (event->type() == QEvent::HoverMove) {
- if (Settings::values.mouse_panning) {
+ if (Settings::values.mouse_panning || Settings::values.mouse_enabled) {
auto* hover_event = static_cast<QMouseEvent*>(event);
mouseMoveEvent(hover_event);
return false;
diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index 40fd4a9d6..92297a43b 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -30,11 +30,12 @@ class System;
namespace InputCommon {
class InputSubsystem;
-}
-
-namespace MouseInput {
enum class MouseButton;
-}
+} // namespace InputCommon
+
+namespace InputCommon::TasInput {
+enum class TasState;
+} // namespace InputCommon::TasInput
namespace VideoCore {
enum class LoadCallbackStage;
@@ -157,15 +158,22 @@ public:
void resizeEvent(QResizeEvent* event) override;
+ /// Converts a Qt keybard key into NativeKeyboard key
+ static int QtKeyToSwitchKey(Qt::Key qt_keys);
+
+ /// Converts a Qt modifier keys into NativeKeyboard modifier keys
+ static int QtModifierToSwitchModifier(Qt::KeyboardModifiers qt_modifiers);
+
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
/// Converts a Qt mouse button into MouseInput mouse button
- static MouseInput::MouseButton QtButtonToMouseButton(Qt::MouseButton button);
+ static InputCommon::MouseButton QtButtonToMouseButton(Qt::MouseButton button);
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
+ void wheelEvent(QWheelEvent* event) override;
bool event(QEvent* event) override;
@@ -203,13 +211,14 @@ signals:
void ExecuteProgramSignal(std::size_t program_index);
void ExitSignal();
void MouseActivity();
+ void TasPlaybackStateChanged();
private:
void TouchBeginEvent(const QTouchEvent* event);
void TouchUpdateEvent(const QTouchEvent* event);
void TouchEndEvent();
- bool TouchStart(const QTouchEvent::TouchPoint& touch_point);
+ void TouchStart(const QTouchEvent::TouchPoint& touch_point);
bool TouchUpdate(const QTouchEvent::TouchPoint& touch_point);
bool TouchExist(std::size_t id, const QList<QTouchEvent::TouchPoint>& touch_points) const;
@@ -236,6 +245,7 @@ private:
QWidget* child_widget = nullptr;
bool first_frame = false;
+ InputCommon::TasInput::TasState last_tas_state;
std::array<std::size_t, 16> touch_ids{};
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 8227d06bc..0f679c37e 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -11,7 +11,6 @@
#include "core/hle/service/acc/profile_manager.h"
#include "core/hle/service/hid/controllers/npad.h"
#include "input_common/main.h"
-#include "input_common/udp/client.h"
#include "yuzu/configuration/config.h"
namespace FS = Common::FS;
@@ -61,162 +60,6 @@ const std::array<int, 2> Config::default_stick_mod = {
0,
};
-const std::array<int, Settings::NativeMouseButton::NumMouseButtons> Config::default_mouse_buttons =
- {
- Qt::Key_BracketLeft, Qt::Key_BracketRight, Qt::Key_Apostrophe, Qt::Key_Minus, Qt::Key_Equal,
-};
-
-const std::array<int, Settings::NativeKeyboard::NumKeyboardKeys> Config::default_keyboard_keys = {
- 0,
- 0,
- 0,
- 0,
- Qt::Key_A,
- Qt::Key_B,
- Qt::Key_C,
- Qt::Key_D,
- Qt::Key_E,
- Qt::Key_F,
- Qt::Key_G,
- Qt::Key_H,
- Qt::Key_I,
- Qt::Key_J,
- Qt::Key_K,
- Qt::Key_L,
- Qt::Key_M,
- Qt::Key_N,
- Qt::Key_O,
- Qt::Key_P,
- Qt::Key_Q,
- Qt::Key_R,
- Qt::Key_S,
- Qt::Key_T,
- Qt::Key_U,
- Qt::Key_V,
- Qt::Key_W,
- Qt::Key_X,
- Qt::Key_Y,
- Qt::Key_Z,
- Qt::Key_1,
- Qt::Key_2,
- Qt::Key_3,
- Qt::Key_4,
- Qt::Key_5,
- Qt::Key_6,
- Qt::Key_7,
- Qt::Key_8,
- Qt::Key_9,
- Qt::Key_0,
- Qt::Key_Enter,
- Qt::Key_Escape,
- Qt::Key_Backspace,
- Qt::Key_Tab,
- Qt::Key_Space,
- Qt::Key_Minus,
- Qt::Key_Equal,
- Qt::Key_BracketLeft,
- Qt::Key_BracketRight,
- Qt::Key_Backslash,
- Qt::Key_Dead_Tilde,
- Qt::Key_Semicolon,
- Qt::Key_Apostrophe,
- Qt::Key_Dead_Grave,
- Qt::Key_Comma,
- Qt::Key_Period,
- Qt::Key_Slash,
- Qt::Key_CapsLock,
-
- Qt::Key_F1,
- Qt::Key_F2,
- Qt::Key_F3,
- Qt::Key_F4,
- Qt::Key_F5,
- Qt::Key_F6,
- Qt::Key_F7,
- Qt::Key_F8,
- Qt::Key_F9,
- Qt::Key_F10,
- Qt::Key_F11,
- Qt::Key_F12,
-
- Qt::Key_SysReq,
- Qt::Key_ScrollLock,
- Qt::Key_Pause,
- Qt::Key_Insert,
- Qt::Key_Home,
- Qt::Key_PageUp,
- Qt::Key_Delete,
- Qt::Key_End,
- Qt::Key_PageDown,
- Qt::Key_Right,
- Qt::Key_Left,
- Qt::Key_Down,
- Qt::Key_Up,
-
- Qt::Key_NumLock,
- Qt::Key_Slash,
- Qt::Key_Asterisk,
- Qt::Key_Minus,
- Qt::Key_Plus,
- Qt::Key_Enter,
- Qt::Key_1,
- Qt::Key_2,
- Qt::Key_3,
- Qt::Key_4,
- Qt::Key_5,
- Qt::Key_6,
- Qt::Key_7,
- Qt::Key_8,
- Qt::Key_9,
- Qt::Key_0,
- Qt::Key_Period,
-
- 0,
- 0,
- Qt::Key_PowerOff,
- Qt::Key_Equal,
-
- Qt::Key_F13,
- Qt::Key_F14,
- Qt::Key_F15,
- Qt::Key_F16,
- Qt::Key_F17,
- Qt::Key_F18,
- Qt::Key_F19,
- Qt::Key_F20,
- Qt::Key_F21,
- Qt::Key_F22,
- Qt::Key_F23,
- Qt::Key_F24,
-
- Qt::Key_Open,
- Qt::Key_Help,
- Qt::Key_Menu,
- 0,
- Qt::Key_Stop,
- Qt::Key_AudioRepeat,
- Qt::Key_Undo,
- Qt::Key_Cut,
- Qt::Key_Copy,
- Qt::Key_Paste,
- Qt::Key_Find,
- Qt::Key_VolumeMute,
- Qt::Key_VolumeUp,
- Qt::Key_VolumeDown,
- Qt::Key_CapsLock,
- Qt::Key_NumLock,
- Qt::Key_ScrollLock,
- Qt::Key_Comma,
-
- Qt::Key_ParenLeft,
- Qt::Key_ParenRight,
-};
-
-const std::array<int, Settings::NativeKeyboard::NumKeyboardMods> Config::default_keyboard_mods = {
- Qt::Key_Control, Qt::Key_Shift, Qt::Key_Alt, Qt::Key_ApplicationLeft,
- Qt::Key_Control, Qt::Key_Shift, Qt::Key_AltGr, Qt::Key_ApplicationRight,
-};
-
// This shouldn't have anything except static initializers (no functions). So
// QKeySequence(...).toString() is NOT ALLOWED HERE.
// This must be in alphabetical order according to action name as it must have the same order as
@@ -430,18 +273,6 @@ void Config::ReadPlayerValue(std::size_t player_index) {
}
}
- for (int i = 0; i < Settings::NativeVibration::NumVibrations; ++i) {
- auto& player_vibrations = player.vibrations[i];
-
- player_vibrations =
- qt_config
- ->value(QStringLiteral("%1").arg(player_prefix) +
- QString::fromUtf8(Settings::NativeVibration::mapping[i]),
- QString{})
- .toString()
- .toStdString();
- }
-
for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
auto& player_motions = player.motions[i];
@@ -496,35 +327,10 @@ void Config::ReadDebugValues() {
void Config::ReadKeyboardValues() {
ReadBasicSetting(Settings::values.keyboard_enabled);
-
- std::transform(default_keyboard_keys.begin(), default_keyboard_keys.end(),
- Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam);
- std::transform(default_keyboard_mods.begin(), default_keyboard_mods.end(),
- Settings::values.keyboard_keys.begin() +
- Settings::NativeKeyboard::LeftControlKey,
- InputCommon::GenerateKeyboardParam);
- std::transform(default_keyboard_mods.begin(), default_keyboard_mods.end(),
- Settings::values.keyboard_mods.begin(), InputCommon::GenerateKeyboardParam);
}
void Config::ReadMouseValues() {
ReadBasicSetting(Settings::values.mouse_enabled);
-
- for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
- const std::string default_param =
- InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
- auto& mouse_buttons = Settings::values.mouse_buttons[i];
-
- mouse_buttons = qt_config
- ->value(QStringLiteral("mouse_") +
- QString::fromUtf8(Settings::NativeMouseButton::mapping[i]),
- QString::fromStdString(default_param))
- .toString()
- .toStdString();
- if (mouse_buttons.empty()) {
- mouse_buttons = default_param;
- }
- }
}
void Config::ReadTouchscreenValues() {
@@ -574,7 +380,6 @@ void Config::ReadControlValues() {
ReadBasicSetting(Settings::values.tas_enable);
ReadBasicSetting(Settings::values.tas_loop);
- ReadBasicSetting(Settings::values.tas_swap_controllers);
ReadBasicSetting(Settings::values.pause_tas_on_load);
ReadGlobalSetting(Settings::values.use_docked_mode);
@@ -625,13 +430,12 @@ void Config::ReadMotionTouchValues() {
}
qt_config->endArray();
- ReadBasicSetting(Settings::values.motion_device);
ReadBasicSetting(Settings::values.touch_device);
- ReadBasicSetting(Settings::values.use_touch_from_button);
ReadBasicSetting(Settings::values.touch_from_button_map_index);
Settings::values.touch_from_button_map_index = std::clamp(
Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1);
ReadBasicSetting(Settings::values.udp_input_servers);
+ ReadBasicSetting(Settings::values.enable_udp_controller);
}
void Config::ReadCoreValues() {
@@ -704,6 +508,7 @@ void Config::ReadDebuggingValues() {
ReadBasicSetting(Settings::values.extended_logging);
ReadBasicSetting(Settings::values.use_debug_asserts);
ReadBasicSetting(Settings::values.use_auto_stub);
+ ReadBasicSetting(Settings::values.enable_all_controllers);
qt_config->endGroup();
}
@@ -830,6 +635,7 @@ void Config::ReadRendererValues() {
ReadGlobalSetting(Settings::values.max_anisotropy);
ReadGlobalSetting(Settings::values.use_speed_limit);
ReadGlobalSetting(Settings::values.speed_limit);
+ ReadGlobalSetting(Settings::values.fps_cap);
ReadGlobalSetting(Settings::values.use_disk_shader_cache);
ReadGlobalSetting(Settings::values.gpu_accuracy);
ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
@@ -844,7 +650,6 @@ void Config::ReadRendererValues() {
ReadGlobalSetting(Settings::values.bg_blue);
if (global) {
- ReadBasicSetting(Settings::values.fps_cap);
ReadBasicSetting(Settings::values.renderer_debug);
ReadBasicSetting(Settings::values.renderer_shader_feedback);
ReadBasicSetting(Settings::values.enable_nsight_aftermath);
@@ -971,6 +776,7 @@ void Config::ReadUIGamelistValues() {
ReadBasicSetting(UISettings::values.row_1_text_id);
ReadBasicSetting(UISettings::values.row_2_text_id);
ReadBasicSetting(UISettings::values.cache_game_list);
+ ReadBasicSetting(UISettings::values.favorites_expanded);
const int favorites_size = qt_config->beginReadArray(QStringLiteral("favorites"));
for (int i = 0; i < favorites_size; i++) {
qt_config->setArrayIndex(i);
@@ -1075,11 +881,6 @@ void Config::SavePlayerValue(std::size_t player_index) {
QString::fromStdString(player.analogs[i]),
QString::fromStdString(default_param));
}
- for (int i = 0; i < Settings::NativeVibration::NumVibrations; ++i) {
- WriteSetting(QStringLiteral("%1").arg(player_prefix) +
- QString::fromStdString(Settings::NativeVibration::mapping[i]),
- QString::fromStdString(player.vibrations[i]), QString{});
- }
for (int i = 0; i < Settings::NativeMotion::NumMotions; ++i) {
const std::string default_param = InputCommon::GenerateKeyboardParam(default_motions[i]);
WriteSetting(QStringLiteral("%1").arg(player_prefix) +
@@ -1111,15 +912,6 @@ void Config::SaveDebugValues() {
void Config::SaveMouseValues() {
WriteBasicSetting(Settings::values.mouse_enabled);
-
- for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
- const std::string default_param =
- InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
- WriteSetting(QStringLiteral("mouse_") +
- QString::fromStdString(Settings::NativeMouseButton::mapping[i]),
- QString::fromStdString(Settings::values.mouse_buttons[i]),
- QString::fromStdString(default_param));
- }
}
void Config::SaveTouchscreenValues() {
@@ -1133,11 +925,10 @@ void Config::SaveTouchscreenValues() {
}
void Config::SaveMotionTouchValues() {
- WriteBasicSetting(Settings::values.motion_device);
WriteBasicSetting(Settings::values.touch_device);
- WriteBasicSetting(Settings::values.use_touch_from_button);
WriteBasicSetting(Settings::values.touch_from_button_map_index);
WriteBasicSetting(Settings::values.udp_input_servers);
+ WriteBasicSetting(Settings::values.enable_udp_controller);
qt_config->beginWriteArray(QStringLiteral("touch_from_button_maps"));
for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) {
@@ -1210,7 +1001,6 @@ void Config::SaveControlValues() {
WriteBasicSetting(Settings::values.tas_enable);
WriteBasicSetting(Settings::values.tas_loop);
- WriteBasicSetting(Settings::values.tas_swap_controllers);
WriteBasicSetting(Settings::values.pause_tas_on_load);
qt_config->endGroup();
@@ -1263,6 +1053,7 @@ void Config::SaveDebuggingValues() {
WriteBasicSetting(Settings::values.quest_flag);
WriteBasicSetting(Settings::values.use_debug_asserts);
WriteBasicSetting(Settings::values.disable_macro_jit);
+ WriteBasicSetting(Settings::values.enable_all_controllers);
qt_config->endGroup();
}
@@ -1382,6 +1173,7 @@ void Config::SaveRendererValues() {
WriteGlobalSetting(Settings::values.max_anisotropy);
WriteGlobalSetting(Settings::values.use_speed_limit);
WriteGlobalSetting(Settings::values.speed_limit);
+ WriteGlobalSetting(Settings::values.fps_cap);
WriteGlobalSetting(Settings::values.use_disk_shader_cache);
WriteSetting(QString::fromStdString(Settings::values.gpu_accuracy.GetLabel()),
static_cast<u32>(Settings::values.gpu_accuracy.GetValue(global)),
@@ -1405,7 +1197,6 @@ void Config::SaveRendererValues() {
WriteGlobalSetting(Settings::values.bg_blue);
if (global) {
- WriteBasicSetting(Settings::values.fps_cap);
WriteBasicSetting(Settings::values.renderer_debug);
WriteBasicSetting(Settings::values.renderer_shader_feedback);
WriteBasicSetting(Settings::values.enable_nsight_aftermath);
@@ -1510,6 +1301,7 @@ void Config::SaveUIGamelistValues() {
WriteBasicSetting(UISettings::values.row_1_text_id);
WriteBasicSetting(UISettings::values.row_2_text_id);
WriteBasicSetting(UISettings::values.cache_game_list);
+ WriteBasicSetting(UISettings::values.favorites_expanded);
qt_config->beginWriteArray(QStringLiteral("favorites"));
for (int i = 0; i < UISettings::values.favorited_ids.size(); i++) {
qt_config->setArrayIndex(i);
diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp
index 07bfa0360..633fc295b 100644
--- a/src/yuzu/configuration/configure_debug.cpp
+++ b/src/yuzu/configuration/configure_debug.cpp
@@ -42,6 +42,7 @@ void ConfigureDebug::SetConfiguration() {
ui->quest_flag->setChecked(Settings::values.quest_flag.GetValue());
ui->use_debug_asserts->setChecked(Settings::values.use_debug_asserts.GetValue());
ui->use_auto_stub->setChecked(Settings::values.use_auto_stub.GetValue());
+ ui->enable_all_controllers->setChecked(Settings::values.enable_all_controllers.GetValue());
ui->enable_graphics_debugging->setEnabled(runtime_lock);
ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug.GetValue());
ui->enable_shader_feedback->setEnabled(runtime_lock);
@@ -67,6 +68,7 @@ void ConfigureDebug::ApplyConfiguration() {
Settings::values.quest_flag = ui->quest_flag->isChecked();
Settings::values.use_debug_asserts = ui->use_debug_asserts->isChecked();
Settings::values.use_auto_stub = ui->use_auto_stub->isChecked();
+ Settings::values.enable_all_controllers = ui->enable_all_controllers->isChecked();
Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();
Settings::values.renderer_shader_feedback = ui->enable_shader_feedback->isChecked();
Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked();
diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui
index b884a56b0..0f3b51c8d 100644
--- a/src/yuzu/configuration/configure_debug.ui
+++ b/src/yuzu/configuration/configure_debug.ui
@@ -198,6 +198,13 @@
</property>
</widget>
</item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="enable_all_controllers">
+ <property name="text">
+ <string>Enable all Controller Types</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
diff --git a/src/yuzu/configuration/configure_debug_controller.cpp b/src/yuzu/configuration/configure_debug_controller.cpp
index 31ec48384..9a8de92a1 100644
--- a/src/yuzu/configuration/configure_debug_controller.cpp
+++ b/src/yuzu/configuration/configure_debug_controller.cpp
@@ -2,17 +2,18 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include "core/core.h"
+#include "core/hid/hid_core.h"
#include "ui_configure_debug_controller.h"
#include "yuzu/configuration/configure_debug_controller.h"
#include "yuzu/configuration/configure_input_player.h"
ConfigureDebugController::ConfigureDebugController(QWidget* parent,
InputCommon::InputSubsystem* input_subsystem,
- InputProfiles* profiles, Core::System& system)
+ InputProfiles* profiles,
+ Core::HID::HIDCore& hid_core, bool is_powered_on)
: QDialog(parent), ui(std::make_unique<Ui::ConfigureDebugController>()),
- debug_controller(
- new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, system, true)) {
+ debug_controller(new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles,
+ hid_core, is_powered_on, true)) {
ui->setupUi(this);
ui->controllerLayout->addWidget(debug_controller);
diff --git a/src/yuzu/configuration/configure_debug_controller.h b/src/yuzu/configuration/configure_debug_controller.h
index 6e17c5aa0..d716edbc2 100644
--- a/src/yuzu/configuration/configure_debug_controller.h
+++ b/src/yuzu/configuration/configure_debug_controller.h
@@ -13,8 +13,8 @@ class ConfigureInputPlayer;
class InputProfiles;
-namespace Core {
-class System;
+namespace Core::HID {
+class HIDCore;
}
namespace InputCommon {
@@ -30,7 +30,8 @@ class ConfigureDebugController : public QDialog {
public:
explicit ConfigureDebugController(QWidget* parent, InputCommon::InputSubsystem* input_subsystem,
- InputProfiles* profiles, Core::System& system);
+ InputProfiles* profiles, Core::HID::HIDCore& hid_core,
+ bool is_powered_on);
~ConfigureDebugController() override;
void ApplyConfiguration();
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp
index 7af3ea97e..566879317 100644
--- a/src/yuzu/configuration/configure_general.cpp
+++ b/src/yuzu/configuration/configure_general.cpp
@@ -30,6 +30,9 @@ ConfigureGeneral::ConfigureGeneral(const Core::System& system_, QWidget* parent)
connect(ui->button_reset_defaults, &QPushButton::clicked, this,
&ConfigureGeneral::ResetDefaults);
+
+ ui->fps_cap_label->setVisible(Settings::IsConfiguringGlobal());
+ ui->fps_cap_combobox->setVisible(!Settings::IsConfiguringGlobal());
}
ConfigureGeneral::~ConfigureGeneral() = default;
@@ -57,6 +60,11 @@ void ConfigureGeneral::SetConfiguration() {
} else {
ui->speed_limit->setEnabled(Settings::values.use_speed_limit.GetValue() &&
use_speed_limit != ConfigurationShared::CheckState::Global);
+
+ ui->fps_cap_combobox->setCurrentIndex(Settings::values.fps_cap.UsingGlobal() ? 0 : 1);
+ ui->fps_cap->setEnabled(!Settings::values.fps_cap.UsingGlobal());
+ ConfigurationShared::SetHighlight(ui->fps_cap_layout,
+ !Settings::values.fps_cap.UsingGlobal());
}
}
@@ -106,6 +114,13 @@ void ConfigureGeneral::ApplyConfiguration() {
Qt::Checked);
Settings::values.speed_limit.SetValue(ui->speed_limit->value());
}
+
+ if (ui->fps_cap_combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
+ Settings::values.fps_cap.SetGlobal(true);
+ } else {
+ Settings::values.fps_cap.SetGlobal(false);
+ Settings::values.fps_cap.SetValue(ui->fps_cap->value());
+ }
}
}
@@ -148,4 +163,9 @@ void ConfigureGeneral::SetupPerGameUI() {
ui->speed_limit->setEnabled(ui->toggle_speed_limit->isChecked() &&
(use_speed_limit != ConfigurationShared::CheckState::Global));
});
+
+ connect(ui->fps_cap_combobox, qOverload<int>(&QComboBox::activated), this, [this](int index) {
+ ui->fps_cap->setEnabled(index == 1);
+ ConfigurationShared::SetHighlight(ui->fps_cap_layout, index == 1);
+ });
}
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui
index f9f0e3ebf..112dc72b3 100644
--- a/src/yuzu/configuration/configure_general.ui
+++ b/src/yuzu/configuration/configure_general.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>329</width>
- <height>407</height>
+ <width>744</width>
+ <height>568</height>
</rect>
</property>
<property name="windowTitle">
@@ -28,34 +28,85 @@
<item>
<layout class="QVBoxLayout" name="GeneralVerticalLayout">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QLabel" name="fps_cap_label">
+ <widget class="QWidget" name="fps_cap_layout" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QComboBox" name="fps_cap_combobox">
+ <property name="currentText">
+ <string>Use global framerate cap</string>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <item>
<property name="text">
- <string>Framerate Cap</string>
+ <string>Use global framerate cap</string>
</property>
- <property name="toolTip">
- <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string>
+ </item>
+ <item>
+ <property name="text">
+ <string>Set framerate cap:</string>
</property>
+ </item>
</widget>
- </item>
- <item>
- <widget class="QSpinBox" name="fps_cap">
- <property name="suffix">
- <string>x</string>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>1000</number>
- </property>
- <property name="value">
- <number>500</number>
- </property>
+ </item>
+ <item>
+ <widget class="QLabel" name="fps_cap_label">
+ <property name="toolTip">
+ <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string>
+ </property>
+ <property name="text">
+ <string>Framerate Cap</string>
+ </property>
</widget>
- </item>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="fps_cap">
+ <property name="suffix">
+ <string>x</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>1000</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
</layout>
+ </widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui
index 660b68c1c..9241678e4 100644
--- a/src/yuzu/configuration/configure_graphics.ui
+++ b/src/yuzu/configuration/configure_graphics.ui
@@ -429,7 +429,7 @@
</item>
<item>
<property name="text">
- <string>AMD's FidelityFX™️ Super Resolution [Vulkan Only]</string>
+ <string>AMD FidelityFX™️ Super Resolution [Vulkan Only]</string>
</property>
</item>
</widget>
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp
index 1599299db..d53179dbb 100644
--- a/src/yuzu/configuration/configure_input.cpp
+++ b/src/yuzu/configuration/configure_input.cpp
@@ -10,6 +10,8 @@
#include <QTimer>
#include "core/core.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/applet_ae.h"
#include "core/hle/service/am/applet_oe.h"
@@ -22,7 +24,6 @@
#include "yuzu/configuration/configure_input_advanced.h"
#include "yuzu/configuration/configure_input_player.h"
#include "yuzu/configuration/configure_motion_touch.h"
-#include "yuzu/configuration/configure_mouse_advanced.h"
#include "yuzu/configuration/configure_touchscreen_advanced.h"
#include "yuzu/configuration/configure_vibration.h"
#include "yuzu/configuration/input_profiles.h"
@@ -75,23 +76,25 @@ ConfigureInput::~ConfigureInput() = default;
void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
std::size_t max_players) {
+ const bool is_powered_on = system.IsPoweredOn();
+ auto& hid_core = system.HIDCore();
player_controllers = {
new ConfigureInputPlayer(this, 0, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 1, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 2, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 3, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 4, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 5, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 6, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
new ConfigureInputPlayer(this, 7, ui->consoleInputSettings, input_subsystem, profiles.get(),
- system),
+ hid_core, is_powered_on),
};
player_tabs = {
@@ -114,6 +117,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
player_tabs[i]->setLayout(new QHBoxLayout(player_tabs[i]));
player_tabs[i]->layout()->addWidget(player_controllers[i]);
connect(player_controllers[i], &ConfigureInputPlayer::Connected, [&, i](bool is_connected) {
+ // Ensures that the controllers are always connected in sequential order
if (is_connected) {
for (std::size_t index = 0; index <= i; ++index) {
player_connected[index]->setChecked(is_connected);
@@ -146,13 +150,12 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
advanced = new ConfigureInputAdvanced(this);
ui->tabAdvanced->setLayout(new QHBoxLayout(ui->tabAdvanced));
ui->tabAdvanced->layout()->addWidget(advanced);
- connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog, [this, input_subsystem] {
- CallConfigureDialog<ConfigureDebugController>(*this, input_subsystem, profiles.get(),
- system);
- });
- connect(advanced, &ConfigureInputAdvanced::CallMouseConfigDialog, [this, input_subsystem] {
- CallConfigureDialog<ConfigureMouseAdvanced>(*this, input_subsystem);
- });
+
+ connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog,
+ [this, input_subsystem, &hid_core, is_powered_on] {
+ CallConfigureDialog<ConfigureDebugController>(
+ *this, input_subsystem, profiles.get(), hid_core, is_powered_on);
+ });
connect(advanced, &ConfigureInputAdvanced::CallTouchscreenConfigDialog,
[this] { CallConfigureDialog<ConfigureTouchscreenAdvanced>(*this); });
connect(advanced, &ConfigureInputAdvanced::CallMotionTouchConfigDialog,
@@ -184,22 +187,8 @@ QList<QWidget*> ConfigureInput::GetSubTabs() const {
void ConfigureInput::ApplyConfiguration() {
for (auto* controller : player_controllers) {
controller->ApplyConfiguration();
- controller->TryDisconnectSelectedController();
- }
-
- // This emulates a delay between disconnecting and reconnecting controllers as some games
- // do not respond to a change in controller type if it was instantaneous.
- using namespace std::chrono_literals;
- std::this_thread::sleep_for(150ms);
-
- for (auto* controller : player_controllers) {
- controller->TryConnectSelectedController();
}
- // This emulates a delay between disconnecting and reconnecting controllers as some games
- // do not respond to a change in controller type if it was instantaneous.
- std::this_thread::sleep_for(150ms);
-
advanced->ApplyConfiguration();
const bool pre_docked_mode = Settings::values.use_docked_mode.GetValue();
@@ -223,8 +212,10 @@ void ConfigureInput::RetranslateUI() {
}
void ConfigureInput::LoadConfiguration() {
+ const auto* handheld = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
+
LoadPlayerControllerIndices();
- UpdateDockedState(Settings::values.players.GetValue()[8].connected);
+ UpdateDockedState(handheld->IsConnected());
ui->vibrationGroup->setChecked(Settings::values.vibration_enabled.GetValue());
ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
@@ -232,9 +223,16 @@ void ConfigureInput::LoadConfiguration() {
void ConfigureInput::LoadPlayerControllerIndices() {
for (std::size_t i = 0; i < player_connected.size(); ++i) {
- const auto connected = Settings::values.players.GetValue()[i].connected ||
- (i == 0 && Settings::values.players.GetValue()[8].connected);
- player_connected[i]->setChecked(connected);
+ if (i == 0) {
+ auto* handheld =
+ system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ if (handheld->IsConnected()) {
+ player_connected[i]->setChecked(true);
+ continue;
+ }
+ }
+ const auto* controller = system.HIDCore().GetEmulatedControllerByIndex(i);
+ player_connected[i]->setChecked(controller->IsConnected());
}
}
diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp
index b30f09013..65c8e59ac 100644
--- a/src/yuzu/configuration/configure_input_advanced.cpp
+++ b/src/yuzu/configuration/configure_input_advanced.cpp
@@ -82,7 +82,6 @@ ConfigureInputAdvanced::ConfigureInputAdvanced(QWidget* parent)
connect(ui->debug_configure, &QPushButton::clicked, this,
[this] { CallDebugControllerDialog(); });
- connect(ui->mouse_advanced, &QPushButton::clicked, this, [this] { CallMouseConfigDialog(); });
connect(ui->touchscreen_advanced, &QPushButton::clicked, this,
[this] { CallTouchscreenConfigDialog(); });
connect(ui->buttonMotionTouch, &QPushButton::clicked, this,
@@ -131,6 +130,7 @@ void ConfigureInputAdvanced::ApplyConfiguration() {
static_cast<float>(ui->mouse_panning_sensitivity->value());
Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
Settings::values.enable_raw_input = ui->enable_raw_input->isChecked();
+ Settings::values.enable_udp_controller = ui->enable_udp_controller->isChecked();
}
void ConfigureInputAdvanced::LoadConfiguration() {
@@ -161,6 +161,7 @@ void ConfigureInputAdvanced::LoadConfiguration() {
ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue());
ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
ui->enable_raw_input->setChecked(Settings::values.enable_raw_input.GetValue());
+ ui->enable_udp_controller->setChecked(Settings::values.enable_udp_controller.GetValue());
UpdateUIEnabled();
}
@@ -178,7 +179,8 @@ void ConfigureInputAdvanced::RetranslateUI() {
}
void ConfigureInputAdvanced::UpdateUIEnabled() {
- ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked());
ui->debug_configure->setEnabled(ui->debug_enabled->isChecked());
ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked());
+ ui->mouse_panning->setEnabled(!ui->mouse_enabled->isChecked());
+ ui->mouse_panning_sensitivity->setEnabled(!ui->mouse_enabled->isChecked());
}
diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui
index 9095206a0..df0e4d602 100644
--- a/src/yuzu/configuration/configure_input_advanced.ui
+++ b/src/yuzu/configuration/configure_input_advanced.ui
@@ -2528,11 +2528,11 @@
<number>0</number>
</property>
<item>
- <widget class="QGroupBox" name="gridGroupBox_3">
+ <widget class="QGroupBox" name="emulatedDevicesGroupBox">
<property name="title">
- <string>Other</string>
+ <string>Emulated Devices</string>
</property>
- <layout class="QGridLayout" name="gridLayout_3">
+ <layout class="QGridLayout" name="emulatedDevicesGridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="keyboard_enabled">
<property name="minimumSize">
@@ -2547,7 +2547,7 @@
</widget>
</item>
<item row="1" column="0">
- <widget class="QCheckBox" name="emulate_analog_keyboard">
+ <widget class="QCheckBox" name="mouse_enabled">
<property name="minimumSize">
<size>
<width>0</width>
@@ -2555,53 +2555,18 @@
</size>
</property>
<property name="text">
- <string>Emulate Analog with Keyboard Input</string>
+ <string>Mouse</string>
</property>
</widget>
</item>
<item row="2" column="0">
- <widget class="QCheckBox" name="mouse_panning">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>23</height>
- </size>
- </property>
+ <widget class="QCheckBox" name="touchscreen_enabled">
<property name="text">
- <string>Enable mouse panning</string>
+ <string>Touchscreen</string>
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QSpinBox" name="mouse_panning_sensitivity">
- <property name="toolTip">
- <string>Mouse sensitivity</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="suffix">
- <string>%</string>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="value">
- <number>100</number>
- </property>
- </widget>
- </item>
- <item row="6" column="2">
- <widget class="QPushButton" name="touchscreen_advanced">
- <property name="text">
- <string>Advanced</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
+ <item row="2" column="1">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -2617,80 +2582,130 @@
</property>
</spacer>
</item>
- <item row="3" column="2">
- <widget class="QPushButton" name="mouse_advanced">
- <property name="text">
- <string>Advanced</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QCheckBox" name="touchscreen_enabled">
- <property name="text">
- <string>Touchscreen</string>
- </property>
- </widget>
- </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="touchscreen_advanced">
+ <property name="text">
+ <string>Advanced</string>
+ </property>
+ </widget>
+ </item>
<item row="3" column="0">
- <widget class="QCheckBox" name="mouse_enabled">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>23</height>
- </size>
- </property>
- <property name="text">
- <string>Mouse</string>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="motion_touch">
- <property name="text">
- <string>Motion / Touch</string>
- </property>
- </widget>
- </item>
- <item row="8" column="2">
- <widget class="QPushButton" name="buttonMotionTouch">
- <property name="text">
- <string>Configure</string>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
<widget class="QCheckBox" name="debug_enabled">
<property name="text">
<string>Debug Controller</string>
</property>
</widget>
</item>
- <item row="7" column="2">
+ <item row="3" column="2">
<widget class="QPushButton" name="debug_configure">
<property name="text">
<string>Configure</string>
</property>
</widget>
</item>
- <item row="9" column="0">
- <widget class="QCheckBox" name="enable_raw_input">
- <property name="toolTip">
- <string>Requires restarting yuzu</string>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>23</height>
- </size>
- </property>
- <property name="text">
- <string>Enable XInput 8 player support (disables web applet)</string>
- </property>
- </widget>
- </item>
</layout>
</widget>
</item>
+ <item>
+ <widget class="QGroupBox" name="otherGroupBox">
+ <property name="title">
+ <string>Other</string>
+ </property>
+ <layout class="QGridLayout" name="OtherGridLayout">
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="emulate_analog_keyboard">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>23</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Emulate Analog with Keyboard Input</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="enable_raw_input">
+ <property name="toolTip">
+ <string>Requires restarting yuzu</string>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>23</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Enable XInput 8 player support (disables web applet)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="enable_udp_controller">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>23</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Enable UDP controllers (not needed for motion)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QCheckBox" name="mouse_panning">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>23</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Enable mouse panning</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QSpinBox" name="mouse_panning_sensitivity">
+ <property name="toolTip">
+ <string>Mouse sensitivity</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="motion_touch">
+ <property name="text">
+ <string>Motion / Touch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QPushButton" name="buttonMotionTouch">
+ <property name="text">
+ <string>Configure</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp
index 3aab5d5f8..8a8be8e40 100644
--- a/src/yuzu/configuration/configure_input_player.cpp
+++ b/src/yuzu/configuration/configure_input_player.cpp
@@ -12,14 +12,12 @@
#include <QMessageBox>
#include <QTimer>
#include "common/param_package.h"
-#include "core/core.h"
-#include "core/hle/service/hid/controllers/npad.h"
-#include "core/hle/service/hid/hid.h"
-#include "core/hle/service/sm/sm.h"
-#include "input_common/gcadapter/gc_poller.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "core/hid/hid_types.h"
+#include "input_common/drivers/keyboard.h"
+#include "input_common/drivers/mouse.h"
#include "input_common/main.h"
-#include "input_common/mouse/mouse_poller.h"
-#include "input_common/udp/udp.h"
#include "ui_configure_input_player.h"
#include "yuzu/bootmanager.h"
#include "yuzu/configuration/config.h"
@@ -29,8 +27,6 @@
#include "yuzu/configuration/input_profiles.h"
#include "yuzu/util/limitable_input_dialog.h"
-using namespace Service::HID;
-
const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM>
ConfigureInputPlayer::analog_sub_buttons{{
"up",
@@ -41,33 +37,8 @@ const std::array<std::string, ConfigureInputPlayer::ANALOG_SUB_BUTTONS_NUM>
namespace {
-constexpr std::size_t HANDHELD_INDEX = 8;
-
-void UpdateController(Settings::ControllerType controller_type, std::size_t npad_index,
- bool connected, Core::System& system) {
- if (!system.IsPoweredOn()) {
- return;
- }
- Service::SM::ServiceManager& sm = system.ServiceManager();
-
- auto& npad = sm.GetService<Hid>("hid")->GetAppletResource()->GetController<Controller_NPad>(
- HidController::NPad);
-
- npad.UpdateControllerAt(npad.MapSettingsTypeToNPad(controller_type), npad_index, connected);
-}
-
QString GetKeyName(int key_code) {
switch (key_code) {
- case Qt::LeftButton:
- return QObject::tr("Click 0");
- case Qt::RightButton:
- return QObject::tr("Click 1");
- case Qt::MiddleButton:
- return QObject::tr("Click 2");
- case Qt::BackButton:
- return QObject::tr("Click 3");
- case Qt::ForwardButton:
- return QObject::tr("Click 4");
case Qt::Key_Shift:
return QObject::tr("Shift");
case Qt::Key_Control:
@@ -81,6 +52,61 @@ QString GetKeyName(int key_code) {
}
}
+QString GetButtonName(Common::Input::ButtonNames button_name) {
+ switch (button_name) {
+ case Common::Input::ButtonNames::ButtonLeft:
+ return QObject::tr("Left");
+ case Common::Input::ButtonNames::ButtonRight:
+ return QObject::tr("Right");
+ case Common::Input::ButtonNames::ButtonDown:
+ return QObject::tr("Down");
+ case Common::Input::ButtonNames::ButtonUp:
+ return QObject::tr("Up");
+ case Common::Input::ButtonNames::TriggerZ:
+ return QObject::tr("Z");
+ case Common::Input::ButtonNames::TriggerR:
+ return QObject::tr("R");
+ case Common::Input::ButtonNames::TriggerL:
+ return QObject::tr("L");
+ case Common::Input::ButtonNames::ButtonA:
+ return QObject::tr("A");
+ case Common::Input::ButtonNames::ButtonB:
+ return QObject::tr("B");
+ case Common::Input::ButtonNames::ButtonX:
+ return QObject::tr("X");
+ case Common::Input::ButtonNames::ButtonY:
+ return QObject::tr("Y");
+ case Common::Input::ButtonNames::ButtonStart:
+ return QObject::tr("Start");
+ case Common::Input::ButtonNames::L1:
+ return QObject::tr("L1");
+ case Common::Input::ButtonNames::L2:
+ return QObject::tr("L2");
+ case Common::Input::ButtonNames::L3:
+ return QObject::tr("L3");
+ case Common::Input::ButtonNames::R1:
+ return QObject::tr("R1");
+ case Common::Input::ButtonNames::R2:
+ return QObject::tr("R2");
+ case Common::Input::ButtonNames::R3:
+ return QObject::tr("R3");
+ case Common::Input::ButtonNames::Circle:
+ return QObject::tr("Circle");
+ case Common::Input::ButtonNames::Cross:
+ return QObject::tr("Cross");
+ case Common::Input::ButtonNames::Square:
+ return QObject::tr("Square");
+ case Common::Input::ButtonNames::Triangle:
+ return QObject::tr("Triangle");
+ case Common::Input::ButtonNames::Share:
+ return QObject::tr("Share");
+ case Common::Input::ButtonNames::Options:
+ return QObject::tr("Options");
+ default:
+ return QObject::tr("[undefined]");
+ }
+}
+
void SetAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackage& analog_param,
const std::string& button_name) {
// The poller returned a complete axis, so set all the buttons
@@ -97,95 +123,75 @@ void SetAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackag
}
analog_param.Set(button_name, input_param.Serialize());
}
+} // namespace
-QString ButtonToText(const Common::ParamPackage& param) {
+QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) {
if (!param.Has("engine")) {
return QObject::tr("[not set]");
}
+ const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
+ const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : "");
+ const auto common_button_name = input_subsystem->GetButtonName(param);
+
+ // Retrieve the names from Qt
if (param.Get("engine", "") == "keyboard") {
const QString button_str = GetKeyName(param.Get("code", 0));
- const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
return QObject::tr("%1%2").arg(toggle, button_str);
}
- if (param.Get("engine", "") == "gcpad") {
- if (param.Has("axis")) {
- const QString axis_str = QString::fromStdString(param.Get("axis", ""));
- const QString direction_str = QString::fromStdString(param.Get("direction", ""));
-
- return QObject::tr("GC Axis %1%2").arg(axis_str, direction_str);
- }
- if (param.Has("button")) {
- const QString button_str = QString::number(int(std::log2(param.Get("button", 0))));
- return QObject::tr("GC Button %1").arg(button_str);
- }
- return GetKeyName(param.Get("code", 0));
+ if (common_button_name == Common::Input::ButtonNames::Invalid) {
+ return QObject::tr("[invalid]");
}
- if (param.Get("engine", "") == "tas") {
- if (param.Has("axis")) {
- const QString axis_str = QString::fromStdString(param.Get("axis", ""));
-
- return QObject::tr("TAS Axis %1").arg(axis_str);
- }
- if (param.Has("button")) {
- const QString button_str = QString::number(int(std::log2(param.Get("button", 0))));
- return QObject::tr("TAS Btn %1").arg(button_str);
- }
- return GetKeyName(param.Get("code", 0));
- }
-
- if (param.Get("engine", "") == "cemuhookudp") {
- if (param.Has("pad_index")) {
- const QString motion_str = QString::fromStdString(param.Get("pad_index", ""));
- return QObject::tr("Motion %1").arg(motion_str);
- }
- return GetKeyName(param.Get("code", 0));
+ if (common_button_name == Common::Input::ButtonNames::Engine) {
+ return QString::fromStdString(param.Get("engine", ""));
}
- if (param.Get("engine", "") == "sdl") {
+ if (common_button_name == Common::Input::ButtonNames::Value) {
if (param.Has("hat")) {
- const QString hat_str = QString::fromStdString(param.Get("hat", ""));
- const QString direction_str = QString::fromStdString(param.Get("direction", ""));
-
- return QObject::tr("Hat %1 %2").arg(hat_str, direction_str);
+ const QString hat = QString::fromStdString(param.Get("direction", ""));
+ return QObject::tr("%1%2Hat %3").arg(toggle, inverted, hat);
}
-
if (param.Has("axis")) {
- const QString axis_str = QString::fromStdString(param.Get("axis", ""));
- const QString direction_str = QString::fromStdString(param.Get("direction", ""));
-
- return QObject::tr("Axis %1%2").arg(axis_str, direction_str);
+ const QString axis = QString::fromStdString(param.Get("axis", ""));
+ return QObject::tr("%1%2Axis %3").arg(toggle, inverted, axis);
}
-
- if (param.Has("button")) {
- const QString button_str = QString::fromStdString(param.Get("button", ""));
- const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
-
- return QObject::tr("%1Button %2").arg(toggle, button_str);
+ if (param.Has("axis_x") && param.Has("axis_y") && param.Has("axis_z")) {
+ const QString axis_x = QString::fromStdString(param.Get("axis_x", ""));
+ const QString axis_y = QString::fromStdString(param.Get("axis_y", ""));
+ const QString axis_z = QString::fromStdString(param.Get("axis_z", ""));
+ return QObject::tr("%1%2Axis %3,%4,%5").arg(toggle, inverted, axis_x, axis_y, axis_z);
}
-
if (param.Has("motion")) {
- return QObject::tr("SDL Motion");
+ const QString motion = QString::fromStdString(param.Get("motion", ""));
+ return QObject::tr("%1%2Motion %3").arg(toggle, inverted, motion);
}
-
- return {};
- }
-
- if (param.Get("engine", "") == "mouse") {
if (param.Has("button")) {
- const QString button_str = QString::number(int(param.Get("button", 0)));
- const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
- return QObject::tr("%1Click %2").arg(toggle, button_str);
+ const QString button = QString::fromStdString(param.Get("button", ""));
+ return QObject::tr("%1%2Button %3").arg(toggle, inverted, button);
}
- return GetKeyName(param.Get("code", 0));
+ }
+
+ QString button_name = GetButtonName(common_button_name);
+ if (param.Has("hat")) {
+ return QObject::tr("%1%2Hat %3").arg(toggle, inverted, button_name);
+ }
+ if (param.Has("axis")) {
+ return QObject::tr("%1%2Axis %3").arg(toggle, inverted, button_name);
+ }
+ if (param.Has("motion")) {
+ return QObject::tr("%1%2Axis %3").arg(toggle, inverted, button_name);
+ }
+ if (param.Has("button")) {
+ return QObject::tr("%1%2Button %3").arg(toggle, inverted, button_name);
}
return QObject::tr("[unknown]");
}
-QString AnalogToText(const Common::ParamPackage& param, const std::string& dir) {
+QString ConfigureInputPlayer::AnalogToText(const Common::ParamPackage& param,
+ const std::string& dir) {
if (!param.Has("engine")) {
return QObject::tr("[not set]");
}
@@ -194,49 +200,69 @@ QString AnalogToText(const Common::ParamPackage& param, const std::string& dir)
return ButtonToText(Common::ParamPackage{param.Get(dir, "")});
}
+ if (!param.Has("axis_x") || !param.Has("axis_y")) {
+ return QObject::tr("[unknown]");
+ }
+
const auto engine_str = param.Get("engine", "");
const QString axis_x_str = QString::fromStdString(param.Get("axis_x", ""));
const QString axis_y_str = QString::fromStdString(param.Get("axis_y", ""));
const bool invert_x = param.Get("invert_x", "+") == "-";
const bool invert_y = param.Get("invert_y", "+") == "-";
- if (engine_str == "sdl" || engine_str == "gcpad" || engine_str == "mouse" ||
- engine_str == "tas") {
- if (dir == "modifier") {
- return QObject::tr("[unused]");
- }
- if (dir == "left") {
- const QString invert_x_str = QString::fromStdString(invert_x ? "+" : "-");
- return QObject::tr("Axis %1%2").arg(axis_x_str, invert_x_str);
- }
- if (dir == "right") {
- const QString invert_x_str = QString::fromStdString(invert_x ? "-" : "+");
- return QObject::tr("Axis %1%2").arg(axis_x_str, invert_x_str);
- }
- if (dir == "up") {
- const QString invert_y_str = QString::fromStdString(invert_y ? "-" : "+");
- return QObject::tr("Axis %1%2").arg(axis_y_str, invert_y_str);
- }
- if (dir == "down") {
- const QString invert_y_str = QString::fromStdString(invert_y ? "+" : "-");
- return QObject::tr("Axis %1%2").arg(axis_y_str, invert_y_str);
- }
+ if (dir == "modifier") {
+ return QObject::tr("[unused]");
+ }
- return {};
+ if (dir == "left") {
+ const QString invert_x_str = QString::fromStdString(invert_x ? "+" : "-");
+ return QObject::tr("Axis %1%2").arg(axis_x_str, invert_x_str);
}
+ if (dir == "right") {
+ const QString invert_x_str = QString::fromStdString(invert_x ? "-" : "+");
+ return QObject::tr("Axis %1%2").arg(axis_x_str, invert_x_str);
+ }
+ if (dir == "up") {
+ const QString invert_y_str = QString::fromStdString(invert_y ? "-" : "+");
+ return QObject::tr("Axis %1%2").arg(axis_y_str, invert_y_str);
+ }
+ if (dir == "down") {
+ const QString invert_y_str = QString::fromStdString(invert_y ? "+" : "-");
+ return QObject::tr("Axis %1%2").arg(axis_y_str, invert_y_str);
+ }
+
return QObject::tr("[unknown]");
}
-} // namespace
ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_index,
QWidget* bottom_row,
InputCommon::InputSubsystem* input_subsystem_,
- InputProfiles* profiles_, Core::System& system_,
- bool debug)
+ InputProfiles* profiles_, Core::HID::HIDCore& hid_core_,
+ bool is_powered_on_, bool debug)
: QWidget(parent), ui(std::make_unique<Ui::ConfigureInputPlayer>()), player_index(player_index),
- debug(debug), input_subsystem{input_subsystem_}, profiles(profiles_),
- timeout_timer(std::make_unique<QTimer>()), poll_timer(std::make_unique<QTimer>()),
- bottom_row(bottom_row), system{system_} {
+ debug(debug), is_powered_on{is_powered_on_}, input_subsystem{input_subsystem_},
+ profiles(profiles_), timeout_timer(std::make_unique<QTimer>()),
+ poll_timer(std::make_unique<QTimer>()), bottom_row(bottom_row), hid_core{hid_core_} {
+ if (player_index == 0) {
+ auto* emulated_controller_p1 =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* emulated_controller_handheld =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ emulated_controller_p1->SaveCurrentConfig();
+ emulated_controller_p1->EnableConfiguration();
+ emulated_controller_handheld->SaveCurrentConfig();
+ emulated_controller_handheld->EnableConfiguration();
+ if (emulated_controller_handheld->IsConnected(true)) {
+ emulated_controller_p1->Disconnect();
+ emulated_controller = emulated_controller_handheld;
+ } else {
+ emulated_controller = emulated_controller_p1;
+ }
+ } else {
+ emulated_controller = hid_core.GetEmulatedControllerByIndex(player_index);
+ emulated_controller->SaveCurrentConfig();
+ emulated_controller->EnableConfiguration();
+ }
ui->setupUi(this);
setFocusPolicy(Qt::ClickFocus);
@@ -278,31 +304,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
analog_map_range_groupbox = {ui->buttonLStickRangeGroup, ui->buttonRStickRangeGroup};
analog_map_range_spinbox = {ui->spinboxLStickRange, ui->spinboxRStickRange};
- const auto ConfigureButtonClick = [&](QPushButton* button, std::size_t button_id,
- Common::ParamPackage* param, int default_val,
- InputCommon::Polling::DeviceType type) {
- connect(button, &QPushButton::clicked, [=, this] {
- HandleClick(
- button, button_id,
- [=, this](Common::ParamPackage params) {
- // Workaround for ZL & ZR for analog triggers like on XBOX
- // controllers. Analog triggers (from controllers like the XBOX
- // controller) would not work due to a different range of their
- // signals (from 0 to 255 on analog triggers instead of -32768 to
- // 32768 on analog joysticks). The SDL driver misinterprets analog
- // triggers as analog joysticks.
- // TODO: reinterpret the signal range for analog triggers to map the
- // values correctly. This is required for the correct emulation of
- // the analog triggers of the GameCube controller.
- if (button == ui->buttonZL || button == ui->buttonZR) {
- params.Set("direction", "+");
- params.Set("threshold", "0.5");
- }
- *param = std::move(params);
- },
- type);
- });
- };
+ ui->controllerFrame->SetController(emulated_controller);
for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) {
auto* const button = button_map[button_id];
@@ -311,34 +313,52 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
continue;
}
- ConfigureButtonClick(button_map[button_id], button_id, &buttons_param[button_id],
- Config::default_buttons[button_id],
- InputCommon::Polling::DeviceType::Button);
+ connect(button, &QPushButton::clicked, [=, this] {
+ HandleClick(
+ button, button_id,
+ [=, this](Common::ParamPackage params) {
+ emulated_controller->SetButtonParam(button_id, params);
+ },
+ InputCommon::Polling::InputType::Button);
+ });
button->setContextMenuPolicy(Qt::CustomContextMenu);
connect(button, &QPushButton::customContextMenuRequested,
[=, this](const QPoint& menu_location) {
QMenu context_menu;
+ Common::ParamPackage param = emulated_controller->GetButtonParam(button_id);
context_menu.addAction(tr("Clear"), [&] {
- buttons_param[button_id].Clear();
+ emulated_controller->SetButtonParam(button_id, {});
button_map[button_id]->setText(tr("[not set]"));
});
- if (buttons_param[button_id].Has("toggle")) {
+ if (param.Has("button") || param.Has("hat")) {
context_menu.addAction(tr("Toggle button"), [&] {
- const bool toggle_value =
- !buttons_param[button_id].Get("toggle", false);
- buttons_param[button_id].Set("toggle", toggle_value);
- button_map[button_id]->setText(ButtonToText(buttons_param[button_id]));
+ const bool toggle_value = !param.Get("toggle", false);
+ param.Set("toggle", toggle_value);
+ button_map[button_id]->setText(ButtonToText(param));
+ emulated_controller->SetButtonParam(button_id, param);
+ });
+ context_menu.addAction(tr("Invert button"), [&] {
+ const bool toggle_value = !param.Get("inverted", false);
+ param.Set("inverted", toggle_value);
+ button_map[button_id]->setText(ButtonToText(param));
+ emulated_controller->SetButtonParam(button_id, param);
});
}
- if (buttons_param[button_id].Has("threshold")) {
+ if (param.Has("axis")) {
+ context_menu.addAction(tr("Invert axis"), [&] {
+ const bool toggle_value = !(param.Get("invert", "+") == "-");
+ param.Set("invert", toggle_value ? "-" : "+");
+ button_map[button_id]->setText(ButtonToText(param));
+ emulated_controller->SetButtonParam(button_id, param);
+ });
context_menu.addAction(tr("Set threshold"), [&] {
- const int button_threshold = static_cast<int>(
- buttons_param[button_id].Get("threshold", 0.5f) * 100.0f);
+ const int button_threshold =
+ static_cast<int>(param.Get("threshold", 0.5f) * 100.0f);
const int new_threshold = QInputDialog::getInt(
this, tr("Set threshold"), tr("Choose a value between 0% and 100%"),
button_threshold, 0, 100);
- buttons_param[button_id].Set("threshold", new_threshold / 100.0f);
+ param.Set("threshold", new_threshold / 100.0f);
if (button_id == Settings::NativeButton::ZL) {
ui->sliderZLThreshold->setValue(new_threshold);
@@ -346,11 +366,10 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
if (button_id == Settings::NativeButton::ZR) {
ui->sliderZRThreshold->setValue(new_threshold);
}
+ emulated_controller->SetButtonParam(button_id, param);
});
}
-
context_menu.exec(button_map[button_id]->mapToGlobal(menu_location));
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
});
}
@@ -360,9 +379,14 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
continue;
}
- ConfigureButtonClick(motion_map[motion_id], motion_id, &motions_param[motion_id],
- Config::default_motions[motion_id],
- InputCommon::Polling::DeviceType::Motion);
+ connect(button, &QPushButton::clicked, [=, this] {
+ HandleClick(
+ button, motion_id,
+ [=, this](Common::ParamPackage params) {
+ emulated_controller->SetMotionParam(motion_id, params);
+ },
+ InputCommon::Polling::InputType::Motion);
+ });
button->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -370,7 +394,7 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
[=, this](const QPoint& menu_location) {
QMenu context_menu;
context_menu.addAction(tr("Clear"), [&] {
- motions_param[motion_id].Clear();
+ emulated_controller->SetMotionParam(motion_id, {});
motion_map[motion_id]->setText(tr("[not set]"));
});
context_menu.exec(motion_map[motion_id]->mapToGlobal(menu_location));
@@ -378,16 +402,22 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
}
connect(ui->sliderZLThreshold, &QSlider::valueChanged, [=, this] {
- if (buttons_param[Settings::NativeButton::ZL].Has("threshold")) {
+ Common::ParamPackage param =
+ emulated_controller->GetButtonParam(Settings::NativeButton::ZL);
+ if (param.Has("threshold")) {
const auto slider_value = ui->sliderZLThreshold->value();
- buttons_param[Settings::NativeButton::ZL].Set("threshold", slider_value / 100.0f);
+ param.Set("threshold", slider_value / 100.0f);
+ emulated_controller->SetButtonParam(Settings::NativeButton::ZL, param);
}
});
connect(ui->sliderZRThreshold, &QSlider::valueChanged, [=, this] {
- if (buttons_param[Settings::NativeButton::ZR].Has("threshold")) {
+ Common::ParamPackage param =
+ emulated_controller->GetButtonParam(Settings::NativeButton::ZR);
+ if (param.Has("threshold")) {
const auto slider_value = ui->sliderZRThreshold->value();
- buttons_param[Settings::NativeButton::ZR].Set("threshold", slider_value / 100.0f);
+ param.Set("threshold", slider_value / 100.0f);
+ emulated_controller->SetButtonParam(Settings::NativeButton::ZR, param);
}
});
@@ -415,45 +445,45 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
HandleClick(
analog_map_buttons[analog_id][sub_button_id], analog_id,
[=, this](const Common::ParamPackage& params) {
- SetAnalogParam(params, analogs_param[analog_id],
- analog_sub_buttons[sub_button_id]);
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
+ SetAnalogParam(params, param, analog_sub_buttons[sub_button_id]);
+ emulated_controller->SetStickParam(analog_id, param);
},
- InputCommon::Polling::DeviceType::AnalogPreferred);
+ InputCommon::Polling::InputType::Stick);
});
analog_button->setContextMenuPolicy(Qt::CustomContextMenu);
- connect(
- analog_button, &QPushButton::customContextMenuRequested,
- [=, this](const QPoint& menu_location) {
- QMenu context_menu;
- context_menu.addAction(tr("Clear"), [&] {
- analogs_param[analog_id].Clear();
- analog_map_buttons[analog_id][sub_button_id]->setText(tr("[not set]"));
- });
- context_menu.addAction(tr("Invert axis"), [&] {
- if (sub_button_id == 2 || sub_button_id == 3) {
- const bool invert_value =
- analogs_param[analog_id].Get("invert_x", "+") == "-";
- const std::string invert_str = invert_value ? "+" : "-";
- analogs_param[analog_id].Set("invert_x", invert_str);
- }
- if (sub_button_id == 0 || sub_button_id == 1) {
- const bool invert_value =
- analogs_param[analog_id].Get("invert_y", "+") == "-";
- const std::string invert_str = invert_value ? "+" : "-";
- analogs_param[analog_id].Set("invert_y", invert_str);
- }
- for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM;
- ++sub_button_id) {
- analog_map_buttons[analog_id][sub_button_id]->setText(AnalogToText(
- analogs_param[analog_id], analog_sub_buttons[sub_button_id]));
- }
+ connect(analog_button, &QPushButton::customContextMenuRequested,
+ [=, this](const QPoint& menu_location) {
+ QMenu context_menu;
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
+ context_menu.addAction(tr("Clear"), [&] {
+ emulated_controller->SetStickParam(analog_id, {});
+ analog_map_buttons[analog_id][sub_button_id]->setText(tr("[not set]"));
+ });
+ context_menu.addAction(tr("Invert axis"), [&] {
+ if (sub_button_id == 2 || sub_button_id == 3) {
+ const bool invert_value = param.Get("invert_x", "+") == "-";
+ const std::string invert_str = invert_value ? "+" : "-";
+ param.Set("invert_x", invert_str);
+ emulated_controller->SetStickParam(analog_id, param);
+ }
+ if (sub_button_id == 0 || sub_button_id == 1) {
+ const bool invert_value = param.Get("invert_y", "+") == "-";
+ const std::string invert_str = invert_value ? "+" : "-";
+ param.Set("invert_y", invert_str);
+ emulated_controller->SetStickParam(analog_id, param);
+ }
+ for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM;
+ ++sub_button_id) {
+ analog_map_buttons[analog_id][sub_button_id]->setText(
+ AnalogToText(param, analog_sub_buttons[sub_button_id]));
+ }
+ });
+ context_menu.exec(analog_map_buttons[analog_id][sub_button_id]->mapToGlobal(
+ menu_location));
});
- context_menu.exec(
- analog_map_buttons[analog_id][sub_button_id]->mapToGlobal(menu_location));
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
- });
}
// Handle clicks for the modifier buttons as well.
@@ -461,9 +491,11 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
HandleClick(
analog_map_modifier_button[analog_id], analog_id,
[=, this](const Common::ParamPackage& params) {
- analogs_param[analog_id].Set("modifier", params.Serialize());
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
+ param.Set("modifier", params.Serialize());
+ emulated_controller->SetStickParam(analog_id, param);
},
- InputCommon::Polling::DeviceType::Button);
+ InputCommon::Polling::InputType::Button);
});
analog_map_modifier_button[analog_id]->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -471,18 +503,21 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
connect(analog_map_modifier_button[analog_id], &QPushButton::customContextMenuRequested,
[=, this](const QPoint& menu_location) {
QMenu context_menu;
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
context_menu.addAction(tr("Clear"), [&] {
- analogs_param[analog_id].Set("modifier", "");
+ param.Set("modifier", "");
analog_map_modifier_button[analog_id]->setText(tr("[not set]"));
+ emulated_controller->SetStickParam(analog_id, param);
});
context_menu.addAction(tr("Toggle button"), [&] {
Common::ParamPackage modifier_param =
- Common::ParamPackage{analogs_param[analog_id].Get("modifier", "")};
+ Common::ParamPackage{param.Get("modifier", "")};
const bool toggle_value = !modifier_param.Get("toggle", false);
modifier_param.Set("toggle", toggle_value);
- analogs_param[analog_id].Set("modifier", modifier_param.Serialize());
+ param.Set("modifier", modifier_param.Serialize());
analog_map_modifier_button[analog_id]->setText(
ButtonToText(modifier_param));
+ emulated_controller->SetStickParam(analog_id, param);
});
context_menu.exec(
analog_map_modifier_button[analog_id]->mapToGlobal(menu_location));
@@ -490,37 +525,39 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
connect(analog_map_range_spinbox[analog_id], qOverload<int>(&QSpinBox::valueChanged),
[=, this] {
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
const auto spinbox_value = analog_map_range_spinbox[analog_id]->value();
- analogs_param[analog_id].Set("range", spinbox_value / 100.0f);
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
+ param.Set("range", spinbox_value / 100.0f);
+ emulated_controller->SetStickParam(analog_id, param);
});
connect(analog_map_deadzone_slider[analog_id], &QSlider::valueChanged, [=, this] {
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
const auto slider_value = analog_map_deadzone_slider[analog_id]->value();
analog_map_deadzone_label[analog_id]->setText(tr("Deadzone: %1%").arg(slider_value));
- analogs_param[analog_id].Set("deadzone", slider_value / 100.0f);
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
+ param.Set("deadzone", slider_value / 100.0f);
+ emulated_controller->SetStickParam(analog_id, param);
});
connect(analog_map_modifier_slider[analog_id], &QSlider::valueChanged, [=, this] {
+ Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
const auto slider_value = analog_map_modifier_slider[analog_id]->value();
analog_map_modifier_label[analog_id]->setText(
tr("Modifier Range: %1%").arg(slider_value));
- analogs_param[analog_id].Set("modifier_scale", slider_value / 100.0f);
+ param.Set("modifier_scale", slider_value / 100.0f);
+ emulated_controller->SetStickParam(analog_id, param);
});
}
// Player Connected checkbox
- connect(ui->groupConnectedController, &QGroupBox::toggled, [this](bool checked) {
- emit Connected(checked);
- ui->controllerFrame->SetConnectedStatus(checked);
- });
+ connect(ui->groupConnectedController, &QGroupBox::toggled,
+ [this](bool checked) { emit Connected(checked); });
if (player_index == 0) {
connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged),
[this](int index) {
emit HandheldStateChanged(GetControllerTypeFromIndex(index) ==
- Settings::ControllerType::Handheld);
+ Core::HID::NpadStyleIndex::Handheld);
});
}
@@ -537,18 +574,43 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
SetConnectableControllers();
}
- UpdateControllerIcon();
UpdateControllerAvailableButtons();
UpdateControllerEnabledButtons();
UpdateControllerButtonNames();
UpdateMotionButtons();
- connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged), [this](int) {
- UpdateControllerIcon();
- UpdateControllerAvailableButtons();
- UpdateControllerEnabledButtons();
- UpdateControllerButtonNames();
- UpdateMotionButtons();
- });
+ connect(ui->comboControllerType, qOverload<int>(&QComboBox::currentIndexChanged),
+ [this, player_index](int) {
+ UpdateControllerAvailableButtons();
+ UpdateControllerEnabledButtons();
+ UpdateControllerButtonNames();
+ UpdateMotionButtons();
+ const Core::HID::NpadStyleIndex type =
+ GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
+
+ if (player_index == 0) {
+ auto* emulated_controller_p1 =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* emulated_controller_handheld =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ bool is_connected = emulated_controller->IsConnected(true);
+
+ emulated_controller_p1->SetNpadStyleIndex(type);
+ emulated_controller_handheld->SetNpadStyleIndex(type);
+ if (is_connected) {
+ if (type == Core::HID::NpadStyleIndex::Handheld) {
+ emulated_controller_p1->Disconnect();
+ emulated_controller_handheld->Connect();
+ emulated_controller = emulated_controller_handheld;
+ } else {
+ emulated_controller_handheld->Disconnect();
+ emulated_controller_p1->Connect();
+ emulated_controller = emulated_controller_p1;
+ }
+ }
+ ui->controllerFrame->SetController(emulated_controller);
+ }
+ emulated_controller->SetNpadStyleIndex(type);
+ });
connect(ui->comboDevices, qOverload<int>(&QComboBox::activated), this,
&ConfigureInputPlayer::UpdateMappingWithDefaults);
@@ -563,62 +625,10 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); });
connect(poll_timer.get(), &QTimer::timeout, [this] {
- Common::ParamPackage params;
- if (input_subsystem->GetGCButtons()->IsPolling()) {
- params = input_subsystem->GetGCButtons()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetGCAnalogs()->IsPolling()) {
- params = input_subsystem->GetGCAnalogs()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetUDPMotions()->IsPolling()) {
- params = input_subsystem->GetUDPMotions()->GetNextInput();
- if (params.Has("engine")) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetMouseButtons()->IsPolling()) {
- params = input_subsystem->GetMouseButtons()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetMouseAnalogs()->IsPolling()) {
- params = input_subsystem->GetMouseAnalogs()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetMouseMotions()->IsPolling()) {
- params = input_subsystem->GetMouseMotions()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- if (input_subsystem->GetMouseTouch()->IsPolling()) {
- params = input_subsystem->GetMouseTouch()->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
- }
- for (auto& poller : device_pollers) {
- params = poller->GetNextInput();
- if (params.Has("engine") && IsInputAcceptable(params)) {
- SetPollingResult(params, false);
- return;
- }
+ const auto& params = input_subsystem->GetNextInput();
+ if (params.Has("engine") && IsInputAcceptable(params)) {
+ SetPollingResult(params, false);
+ return;
}
});
@@ -634,110 +644,38 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
&ConfigureInputPlayer::SaveProfile);
LoadConfiguration();
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
- ui->controllerFrame->SetConnectedStatus(ui->groupConnectedController->isChecked());
}
-ConfigureInputPlayer::~ConfigureInputPlayer() = default;
-
-void ConfigureInputPlayer::ApplyConfiguration() {
- auto& player = Settings::values.players.GetValue()[player_index];
- auto& buttons = debug ? Settings::values.debug_pad_buttons : player.buttons;
- auto& analogs = debug ? Settings::values.debug_pad_analogs : player.analogs;
-
- std::transform(buttons_param.begin(), buttons_param.end(), buttons.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
- std::transform(analogs_param.begin(), analogs_param.end(), analogs.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
-
- if (debug) {
- return;
- }
-
- auto& motions = player.motions;
-
- std::transform(motions_param.begin(), motions_param.end(), motions.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
-
- // Apply configuration for handheld
+ConfigureInputPlayer::~ConfigureInputPlayer() {
if (player_index == 0) {
- auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX];
- const auto handheld_connected = handheld.connected;
- handheld = player;
- handheld.connected = handheld_connected;
+ auto* emulated_controller_p1 =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* emulated_controller_handheld =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ emulated_controller_p1->DisableConfiguration();
+ emulated_controller_handheld->DisableConfiguration();
+ } else {
+ emulated_controller->DisableConfiguration();
}
}
-void ConfigureInputPlayer::TryConnectSelectedController() {
- auto& player = Settings::values.players.GetValue()[player_index];
-
- const auto controller_type =
- GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
- const auto player_connected = ui->groupConnectedController->isChecked() &&
- controller_type != Settings::ControllerType::Handheld;
-
- // Connect Handheld depending on Player 1's controller configuration.
+void ConfigureInputPlayer::ApplyConfiguration() {
if (player_index == 0) {
- auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX];
- const auto handheld_connected = ui->groupConnectedController->isChecked() &&
- controller_type == Settings::ControllerType::Handheld;
- // Connect only if handheld is going from disconnected to connected
- if (!handheld.connected && handheld_connected) {
- UpdateController(controller_type, HANDHELD_INDEX, true, system);
- }
- handheld.connected = handheld_connected;
- }
-
- if (player.controller_type == controller_type && player.connected == player_connected) {
- // Set vibration devices in the event that the input device has changed.
- ConfigureVibration::SetVibrationDevices(player_index);
+ auto* emulated_controller_p1 =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* emulated_controller_handheld =
+ hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ emulated_controller_p1->DisableConfiguration();
+ emulated_controller_p1->SaveCurrentConfig();
+ emulated_controller_p1->EnableConfiguration();
+ emulated_controller_handheld->DisableConfiguration();
+ emulated_controller_handheld->SaveCurrentConfig();
+ emulated_controller_handheld->EnableConfiguration();
return;
}
-
- player.controller_type = controller_type;
- player.connected = player_connected;
-
- ConfigureVibration::SetVibrationDevices(player_index);
-
- if (!player.connected) {
- return;
- }
-
- UpdateController(controller_type, player_index, true, system);
-}
-
-void ConfigureInputPlayer::TryDisconnectSelectedController() {
- const auto& player = Settings::values.players.GetValue()[player_index];
-
- const auto controller_type =
- GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
- const auto player_connected = ui->groupConnectedController->isChecked() &&
- controller_type != Settings::ControllerType::Handheld;
-
- // Disconnect Handheld depending on Player 1's controller configuration.
- if (player_index == 0 && player.controller_type == Settings::ControllerType::Handheld) {
- const auto& handheld = Settings::values.players.GetValue()[HANDHELD_INDEX];
- const auto handheld_connected = ui->groupConnectedController->isChecked() &&
- controller_type == Settings::ControllerType::Handheld;
- // Disconnect only if handheld is going from connected to disconnected
- if (handheld.connected && !handheld_connected) {
- UpdateController(controller_type, HANDHELD_INDEX, false, system);
- }
- return;
- }
-
- // Do not do anything if the controller configuration has not changed.
- if (player.controller_type == controller_type && player.connected == player_connected) {
- return;
- }
-
- // Do not disconnect if the controller is already disconnected
- if (!player.connected) {
- return;
- }
-
- // Disconnect the controller first.
- UpdateController(controller_type, player_index, false, system);
+ emulated_controller->DisableConfiguration();
+ emulated_controller->SaveCurrentConfig();
+ emulated_controller->EnableConfiguration();
}
void ConfigureInputPlayer::showEvent(QShowEvent* event) {
@@ -762,22 +700,7 @@ void ConfigureInputPlayer::RetranslateUI() {
}
void ConfigureInputPlayer::LoadConfiguration() {
- auto& player = Settings::values.players.GetValue()[player_index];
- if (debug) {
- std::transform(Settings::values.debug_pad_buttons.begin(),
- Settings::values.debug_pad_buttons.end(), buttons_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- std::transform(Settings::values.debug_pad_analogs.begin(),
- Settings::values.debug_pad_analogs.end(), analogs_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- } else {
- std::transform(player.buttons.begin(), player.buttons.end(), buttons_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- std::transform(player.analogs.begin(), player.analogs.end(), analogs_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- std::transform(player.motions.begin(), player.motions.end(), motions_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- }
+ emulated_controller->ReloadFromSettings();
UpdateUI();
UpdateInputDeviceCombobox();
@@ -786,14 +709,19 @@ void ConfigureInputPlayer::LoadConfiguration() {
return;
}
- ui->comboControllerType->setCurrentIndex(GetIndexFromControllerType(player.controller_type));
- ui->groupConnectedController->setChecked(
- player.connected ||
- (player_index == 0 && Settings::values.players.GetValue()[HANDHELD_INDEX].connected));
+ const int comboBoxIndex =
+ GetIndexFromControllerType(emulated_controller->GetNpadStyleIndex(true));
+ ui->comboControllerType->setCurrentIndex(comboBoxIndex);
+ ui->groupConnectedController->setChecked(emulated_controller->IsConnected(true));
}
void ConfigureInputPlayer::ConnectPlayer(bool connected) {
ui->groupConnectedController->setChecked(connected);
+ if (connected) {
+ emulated_controller->Connect();
+ } else {
+ emulated_controller->Disconnect();
+ }
}
void ConfigureInputPlayer::UpdateInputDeviceCombobox() {
@@ -803,48 +731,64 @@ void ConfigureInputPlayer::UpdateInputDeviceCombobox() {
return;
}
- // Find the first button that isn't empty.
- const auto button_param =
- std::find_if(buttons_param.begin(), buttons_param.end(),
- [](const Common::ParamPackage param) { return param.Has("engine"); });
- const bool buttons_empty = button_param == buttons_param.end();
+ const auto devices =
+ emulated_controller->GetMappedDevices(Core::HID::EmulatedDeviceIndex::AllDevices);
+ UpdateInputDevices();
- const auto current_engine = button_param->Get("engine", "");
- const auto current_guid = button_param->Get("guid", "");
- const auto current_port = button_param->Get("port", "");
+ if (devices.empty()) {
+ return;
+ }
- const bool is_keyboard_mouse = current_engine == "keyboard" || current_engine == "mouse";
+ if (devices.size() > 2) {
+ ui->comboDevices->setCurrentIndex(0);
+ return;
+ }
- UpdateInputDevices();
+ const auto first_engine = devices[0].Get("engine", "");
+ const auto first_guid = devices[0].Get("guid", "");
+ const auto first_port = devices[0].Get("port", 0);
- if (buttons_empty) {
+ if (devices.size() == 1) {
+ const auto devices_it =
+ std::find_if(input_devices.begin(), input_devices.end(),
+ [first_engine, first_guid, first_port](const Common::ParamPackage param) {
+ return param.Get("engine", "") == first_engine &&
+ param.Get("guid", "") == first_guid &&
+ param.Get("port", 0) == first_port;
+ });
+ const int device_index =
+ devices_it != input_devices.end()
+ ? static_cast<int>(std::distance(input_devices.begin(), devices_it))
+ : 0;
+ ui->comboDevices->setCurrentIndex(device_index);
return;
}
- const bool all_one_device =
- std::all_of(buttons_param.begin(), buttons_param.end(),
- [current_engine, current_guid, current_port,
- is_keyboard_mouse](const Common::ParamPackage param) {
- if (is_keyboard_mouse) {
- return !param.Has("engine") || param.Get("engine", "") == "keyboard" ||
- param.Get("engine", "") == "mouse";
- }
- return !param.Has("engine") || (param.Get("engine", "") == current_engine &&
- param.Get("guid", "") == current_guid &&
- param.Get("port", "") == current_port);
- });
+ const auto second_engine = devices[1].Get("engine", "");
+ const auto second_guid = devices[1].Get("guid", "");
+ const auto second_port = devices[1].Get("port", 0);
- if (all_one_device) {
- if (is_keyboard_mouse) {
- ui->comboDevices->setCurrentIndex(1);
- return;
- }
+ const bool is_keyboard_mouse = (first_engine == "keyboard" || first_engine == "mouse") &&
+ (second_engine == "keyboard" || second_engine == "mouse");
+
+ if (is_keyboard_mouse) {
+ ui->comboDevices->setCurrentIndex(2);
+ return;
+ }
+
+ const bool is_engine_equal = first_engine == second_engine;
+ const bool is_port_equal = first_port == second_port;
+
+ if (is_engine_equal && is_port_equal) {
const auto devices_it = std::find_if(
input_devices.begin(), input_devices.end(),
- [current_engine, current_guid, current_port](const Common::ParamPackage param) {
- return param.Get("class", "") == current_engine &&
- param.Get("guid", "") == current_guid &&
- param.Get("port", "") == current_port;
+ [first_engine, first_guid, second_guid, first_port](const Common::ParamPackage param) {
+ const bool is_guid_valid =
+ (param.Get("guid", "") == first_guid &&
+ param.Get("guid2", "") == second_guid) ||
+ (param.Get("guid", "") == second_guid && param.Get("guid2", "") == first_guid);
+ return param.Get("engine", "") == first_engine && is_guid_valid &&
+ param.Get("port", 0) == first_port;
});
const int device_index =
devices_it != input_devices.end()
@@ -866,8 +810,7 @@ void ConfigureInputPlayer::ClearAll() {
if (button == nullptr) {
continue;
}
-
- buttons_param[button_id].Clear();
+ emulated_controller->SetButtonParam(button_id, {});
}
for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; ++analog_id) {
@@ -876,8 +819,7 @@ void ConfigureInputPlayer::ClearAll() {
if (analog_button == nullptr) {
continue;
}
-
- analogs_param[analog_id].Clear();
+ emulated_controller->SetStickParam(analog_id, {});
}
}
@@ -886,8 +828,7 @@ void ConfigureInputPlayer::ClearAll() {
if (motion_button == nullptr) {
continue;
}
-
- motions_param[motion_id].Clear();
+ emulated_controller->SetMotionParam(motion_id, {});
}
UpdateUI();
@@ -896,26 +837,31 @@ void ConfigureInputPlayer::ClearAll() {
void ConfigureInputPlayer::UpdateUI() {
for (int button = 0; button < Settings::NativeButton::NumButtons; ++button) {
- button_map[button]->setText(ButtonToText(buttons_param[button]));
+ const Common::ParamPackage param = emulated_controller->GetButtonParam(button);
+ button_map[button]->setText(ButtonToText(param));
}
- if (buttons_param[Settings::NativeButton::ZL].Has("threshold")) {
- const int button_threshold = static_cast<int>(
- buttons_param[Settings::NativeButton::ZL].Get("threshold", 0.5f) * 100.0f);
+ const Common::ParamPackage ZL_param =
+ emulated_controller->GetButtonParam(Settings::NativeButton::ZL);
+ if (ZL_param.Has("threshold")) {
+ const int button_threshold = static_cast<int>(ZL_param.Get("threshold", 0.5f) * 100.0f);
ui->sliderZLThreshold->setValue(button_threshold);
}
- if (buttons_param[Settings::NativeButton::ZR].Has("threshold")) {
- const int button_threshold = static_cast<int>(
- buttons_param[Settings::NativeButton::ZR].Get("threshold", 0.5f) * 100.0f);
+ const Common::ParamPackage ZR_param =
+ emulated_controller->GetButtonParam(Settings::NativeButton::ZR);
+ if (ZR_param.Has("threshold")) {
+ const int button_threshold = static_cast<int>(ZR_param.Get("threshold", 0.5f) * 100.0f);
ui->sliderZRThreshold->setValue(button_threshold);
}
for (int motion_id = 0; motion_id < Settings::NativeMotion::NumMotions; ++motion_id) {
- motion_map[motion_id]->setText(ButtonToText(motions_param[motion_id]));
+ const Common::ParamPackage param = emulated_controller->GetMotionParam(motion_id);
+ motion_map[motion_id]->setText(ButtonToText(param));
}
for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; ++analog_id) {
+ const Common::ParamPackage param = emulated_controller->GetStickParam(analog_id);
for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; ++sub_button_id) {
auto* const analog_button = analog_map_buttons[analog_id][sub_button_id];
@@ -923,12 +869,11 @@ void ConfigureInputPlayer::UpdateUI() {
continue;
}
- analog_button->setText(
- AnalogToText(analogs_param[analog_id], analog_sub_buttons[sub_button_id]));
+ analog_button->setText(AnalogToText(param, analog_sub_buttons[sub_button_id]));
}
analog_map_modifier_button[analog_id]->setText(
- ButtonToText(Common::ParamPackage{analogs_param[analog_id].Get("modifier", "")}));
+ ButtonToText(Common::ParamPackage{param.Get("modifier", "")}));
const auto deadzone_label = analog_map_deadzone_label[analog_id];
const auto deadzone_slider = analog_map_deadzone_slider[analog_id];
@@ -939,26 +884,14 @@ void ConfigureInputPlayer::UpdateUI() {
const auto range_spinbox = analog_map_range_spinbox[analog_id];
int slider_value;
- auto& param = analogs_param[analog_id];
- const bool is_controller =
- param.Get("engine", "") == "sdl" || param.Get("engine", "") == "gcpad" ||
- param.Get("engine", "") == "mouse" || param.Get("engine", "") == "tas";
+ const bool is_controller = input_subsystem->IsController(param);
if (is_controller) {
- if (!param.Has("deadzone")) {
- param.Set("deadzone", 0.1f);
- }
- slider_value = static_cast<int>(param.Get("deadzone", 0.1f) * 100);
+ slider_value = static_cast<int>(param.Get("deadzone", 0.15f) * 100);
deadzone_label->setText(tr("Deadzone: %1%").arg(slider_value));
deadzone_slider->setValue(slider_value);
- if (!param.Has("range")) {
- param.Set("range", 1.0f);
- }
range_spinbox->setValue(static_cast<int>(param.Get("range", 1.0f) * 100));
} else {
- if (!param.Has("modifier_scale")) {
- param.Set("modifier_scale", 0.5f);
- }
slider_value = static_cast<int>(param.Get("modifier_scale", 0.5f) * 100);
modifier_label->setText(tr("Modifier Range: %1%").arg(slider_value));
modifier_slider->setValue(slider_value);
@@ -970,79 +903,98 @@ void ConfigureInputPlayer::UpdateUI() {
modifier_label->setVisible(!is_controller);
modifier_slider->setVisible(!is_controller);
range_groupbox->setVisible(is_controller);
- ui->controllerFrame->SetPlayerInput(player_index, buttons_param, analogs_param);
}
}
void ConfigureInputPlayer::SetConnectableControllers() {
- const auto add_controllers = [this](bool enable_all,
- Controller_NPad::NpadStyleSet npad_style_set = {}) {
- index_controller_type_pairs.clear();
- ui->comboControllerType->clear();
-
- if (enable_all || npad_style_set.fullkey == 1) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::ProController);
- ui->comboControllerType->addItem(tr("Pro Controller"));
- }
+ Core::HID::NpadStyleTag npad_style_set = hid_core.GetSupportedStyleTag();
+ index_controller_type_pairs.clear();
+ ui->comboControllerType->clear();
- if (enable_all || npad_style_set.joycon_dual == 1) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::DualJoyconDetached);
- ui->comboControllerType->addItem(tr("Dual Joycons"));
- }
+ if (npad_style_set.fullkey == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::ProController);
+ ui->comboControllerType->addItem(tr("Pro Controller"));
+ }
- if (enable_all || npad_style_set.joycon_left == 1) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::LeftJoycon);
- ui->comboControllerType->addItem(tr("Left Joycon"));
- }
+ if (npad_style_set.joycon_dual == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::JoyconDual);
+ ui->comboControllerType->addItem(tr("Dual Joycons"));
+ }
- if (enable_all || npad_style_set.joycon_right == 1) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::RightJoycon);
- ui->comboControllerType->addItem(tr("Right Joycon"));
- }
+ if (npad_style_set.joycon_left == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::JoyconLeft);
+ ui->comboControllerType->addItem(tr("Left Joycon"));
+ }
- if (player_index == 0 && (enable_all || npad_style_set.handheld == 1)) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::Handheld);
- ui->comboControllerType->addItem(tr("Handheld"));
- }
+ if (npad_style_set.joycon_right == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::JoyconRight);
+ ui->comboControllerType->addItem(tr("Right Joycon"));
+ }
- if (enable_all || npad_style_set.gamecube == 1) {
- index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
- Settings::ControllerType::GameCube);
- ui->comboControllerType->addItem(tr("GameCube Controller"));
- }
- };
+ if (player_index == 0 && npad_style_set.handheld == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::Handheld);
+ ui->comboControllerType->addItem(tr("Handheld"));
+ }
+
+ if (npad_style_set.gamecube == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::GameCube);
+ ui->comboControllerType->addItem(tr("GameCube Controller"));
+ }
- if (!system.IsPoweredOn()) {
- add_controllers(true);
+ // Disable all unsupported controllers
+ if (!Settings::values.enable_all_controllers) {
return;
}
+ if (npad_style_set.palma == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::Pokeball);
+ ui->comboControllerType->addItem(tr("Poke Ball Plus"));
+ }
- Service::SM::ServiceManager& sm = system.ServiceManager();
+ if (npad_style_set.lark == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::NES);
+ ui->comboControllerType->addItem(tr("NES Controller"));
+ }
- auto& npad = sm.GetService<Hid>("hid")->GetAppletResource()->GetController<Controller_NPad>(
- HidController::NPad);
+ if (npad_style_set.lucia == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::SNES);
+ ui->comboControllerType->addItem(tr("SNES Controller"));
+ }
- add_controllers(false, npad.GetSupportedStyleSet());
+ if (npad_style_set.lagoon == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::N64);
+ ui->comboControllerType->addItem(tr("N64 Controller"));
+ }
+
+ if (npad_style_set.lager == 1) {
+ index_controller_type_pairs.emplace_back(ui->comboControllerType->count(),
+ Core::HID::NpadStyleIndex::SegaGenesis);
+ ui->comboControllerType->addItem(tr("Sega Genesis"));
+ }
}
-Settings::ControllerType ConfigureInputPlayer::GetControllerTypeFromIndex(int index) const {
+Core::HID::NpadStyleIndex ConfigureInputPlayer::GetControllerTypeFromIndex(int index) const {
const auto it =
std::find_if(index_controller_type_pairs.begin(), index_controller_type_pairs.end(),
[index](const auto& pair) { return pair.first == index; });
if (it == index_controller_type_pairs.end()) {
- return Settings::ControllerType::ProController;
+ return Core::HID::NpadStyleIndex::ProController;
}
return it->second;
}
-int ConfigureInputPlayer::GetIndexFromControllerType(Settings::ControllerType type) const {
+int ConfigureInputPlayer::GetIndexFromControllerType(Core::HID::NpadStyleIndex type) const {
const auto it =
std::find_if(index_controller_type_pairs.begin(), index_controller_type_pairs.end(),
[type](const auto& pair) { return pair.second == type; });
@@ -1057,52 +1009,15 @@ int ConfigureInputPlayer::GetIndexFromControllerType(Settings::ControllerType ty
void ConfigureInputPlayer::UpdateInputDevices() {
input_devices = input_subsystem->GetInputDevices();
ui->comboDevices->clear();
- for (auto& device : input_devices) {
- const std::string display = device.Get("display", "Unknown");
- ui->comboDevices->addItem(QString::fromStdString(display), {});
- if (display == "TAS") {
- device.Set("pad", static_cast<u8>(player_index));
- }
+ for (auto device : input_devices) {
+ ui->comboDevices->addItem(QString::fromStdString(device.Get("display", "Unknown")), {});
}
}
-void ConfigureInputPlayer::UpdateControllerIcon() {
- // We aren't using Qt's built in theme support here since we aren't drawing an icon (and its
- // "nonstandard" to use an image through the icon support)
- const QString stylesheet = [this] {
- switch (GetControllerTypeFromIndex(ui->comboControllerType->currentIndex())) {
- case Settings::ControllerType::ProController:
- return QStringLiteral("image: url(:/controller/pro_controller%0)");
- case Settings::ControllerType::DualJoyconDetached:
- return QStringLiteral("image: url(:/controller/dual_joycon%0)");
- case Settings::ControllerType::LeftJoycon:
- return QStringLiteral("image: url(:/controller/single_joycon_left_vertical%0)");
- case Settings::ControllerType::RightJoycon:
- return QStringLiteral("image: url(:/controller/single_joycon_right_vertical%0)");
- case Settings::ControllerType::Handheld:
- return QStringLiteral("image: url(:/controller/handheld%0)");
- default:
- return QString{};
- }
- }();
-
- const QString theme = [] {
- if (QIcon::themeName().contains(QStringLiteral("dark"))) {
- return QStringLiteral("_dark");
- } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) {
- return QStringLiteral("_midnight");
- } else {
- return QString{};
- }
- }();
- ui->controllerFrame->SetControllerType(
- GetControllerTypeFromIndex(ui->comboControllerType->currentIndex()));
-}
-
void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
auto layout = GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
if (debug) {
- layout = Settings::ControllerType::ProController;
+ layout = Core::HID::NpadStyleIndex::ProController;
}
// List of all the widgets that will be hidden by any of the following layouts that need
@@ -1127,15 +1042,15 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
std::vector<QWidget*> layout_hidden;
switch (layout) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::DualJoyconDetached:
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::Handheld:
layout_hidden = {
ui->buttonShoulderButtonsSLSR,
ui->horizontalSpacerShoulderButtonsWidget2,
};
break;
- case Settings::ControllerType::LeftJoycon:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
layout_hidden = {
ui->horizontalSpacerShoulderButtonsWidget2,
ui->buttonShoulderButtonsRight,
@@ -1143,7 +1058,7 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
ui->bottomRight,
};
break;
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
layout_hidden = {
ui->horizontalSpacerShoulderButtonsWidget,
ui->buttonShoulderButtonsLeft,
@@ -1151,7 +1066,7 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
ui->bottomLeft,
};
break;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
layout_hidden = {
ui->buttonShoulderButtonsSLSR,
ui->horizontalSpacerShoulderButtonsWidget2,
@@ -1159,6 +1074,8 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
ui->buttonMiscButtonsScreenshotGroup,
};
break;
+ default:
+ break;
}
for (auto* widget : layout_hidden) {
@@ -1169,13 +1086,12 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
void ConfigureInputPlayer::UpdateControllerEnabledButtons() {
auto layout = GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
if (debug) {
- layout = Settings::ControllerType::ProController;
+ layout = Core::HID::NpadStyleIndex::ProController;
}
// List of all the widgets that will be disabled by any of the following layouts that need
// "enabled" after the controller type changes
- const std::array<QWidget*, 4> layout_enable = {
- ui->buttonHome,
+ const std::array<QWidget*, 3> layout_enable = {
ui->buttonLStickPressedGroup,
ui->groupRStickPressed,
ui->buttonShoulderButtonsButtonLGroup,
@@ -1187,17 +1103,13 @@ void ConfigureInputPlayer::UpdateControllerEnabledButtons() {
std::vector<QWidget*> layout_disable;
switch (layout) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::DualJoyconDetached:
- case Settings::ControllerType::Handheld:
- case Settings::ControllerType::LeftJoycon:
- case Settings::ControllerType::RightJoycon:
- // TODO(wwylele): enable this when we actually emulate it
- layout_disable = {
- ui->buttonHome,
- };
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::Handheld:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ case Core::HID::NpadStyleIndex::JoyconRight:
break;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
layout_disable = {
ui->buttonHome,
ui->buttonLStickPressedGroup,
@@ -1205,6 +1117,8 @@ void ConfigureInputPlayer::UpdateControllerEnabledButtons() {
ui->buttonShoulderButtonsButtonLGroup,
};
break;
+ default:
+ break;
}
for (auto* widget : layout_disable) {
@@ -1222,24 +1136,24 @@ void ConfigureInputPlayer::UpdateMotionButtons() {
// Show/hide the "Motion 1/2" groupboxes depending on the currently selected controller.
switch (GetControllerTypeFromIndex(ui->comboControllerType->currentIndex())) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::LeftJoycon:
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ case Core::HID::NpadStyleIndex::Handheld:
// Show "Motion 1" and hide "Motion 2".
ui->buttonMotionLeftGroup->show();
ui->buttonMotionRightGroup->hide();
break;
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
// Show "Motion 2" and hide "Motion 1".
ui->buttonMotionLeftGroup->hide();
ui->buttonMotionRightGroup->show();
break;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
// Hide both "Motion 1/2".
ui->buttonMotionLeftGroup->hide();
ui->buttonMotionRightGroup->hide();
break;
- case Settings::ControllerType::DualJoyconDetached:
+ case Core::HID::NpadStyleIndex::JoyconDual:
default:
// Show both "Motion 1/2".
ui->buttonMotionLeftGroup->show();
@@ -1251,15 +1165,15 @@ void ConfigureInputPlayer::UpdateMotionButtons() {
void ConfigureInputPlayer::UpdateControllerButtonNames() {
auto layout = GetControllerTypeFromIndex(ui->comboControllerType->currentIndex());
if (debug) {
- layout = Settings::ControllerType::ProController;
+ layout = Core::HID::NpadStyleIndex::ProController;
}
switch (layout) {
- case Settings::ControllerType::ProController:
- case Settings::ControllerType::DualJoyconDetached:
- case Settings::ControllerType::Handheld:
- case Settings::ControllerType::LeftJoycon:
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::Handheld:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ case Core::HID::NpadStyleIndex::JoyconRight:
ui->buttonMiscButtonsPlusGroup->setTitle(tr("Plus"));
ui->buttonShoulderButtonsButtonZLGroup->setTitle(tr("ZL"));
ui->buttonShoulderButtonsZRGroup->setTitle(tr("ZR"));
@@ -1267,7 +1181,7 @@ void ConfigureInputPlayer::UpdateControllerButtonNames() {
ui->LStick->setTitle(tr("Left Stick"));
ui->RStick->setTitle(tr("Right Stick"));
break;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
ui->buttonMiscButtonsPlusGroup->setTitle(tr("Start / Pause"));
ui->buttonShoulderButtonsButtonZLGroup->setTitle(tr("L"));
ui->buttonShoulderButtonsZRGroup->setTitle(tr("R"));
@@ -1275,6 +1189,8 @@ void ConfigureInputPlayer::UpdateControllerButtonNames() {
ui->LStick->setTitle(tr("Control Stick"));
ui->RStick->setTitle(tr("C-Stick"));
break;
+ default:
+ break;
}
}
@@ -1283,45 +1199,82 @@ void ConfigureInputPlayer::UpdateMappingWithDefaults() {
return;
}
- if (ui->comboDevices->currentIndex() == 1) {
- // Reset keyboard bindings
+ for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) {
+ const auto* const button = button_map[button_id];
+ if (button == nullptr) {
+ continue;
+ }
+ emulated_controller->SetButtonParam(button_id, {});
+ }
+
+ for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; ++analog_id) {
+ for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; ++sub_button_id) {
+ const auto* const analog_button = analog_map_buttons[analog_id][sub_button_id];
+ if (analog_button == nullptr) {
+ continue;
+ }
+ emulated_controller->SetStickParam(analog_id, {});
+ }
+ }
+
+ for (int motion_id = 0; motion_id < Settings::NativeMotion::NumMotions; ++motion_id) {
+ const auto* const motion_button = motion_map[motion_id];
+ if (motion_button == nullptr) {
+ continue;
+ }
+ emulated_controller->SetMotionParam(motion_id, {});
+ }
+
+ // Reset keyboard or mouse bindings
+ if (ui->comboDevices->currentIndex() == 1 || ui->comboDevices->currentIndex() == 2) {
for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) {
- buttons_param[button_id] = Common::ParamPackage{
- InputCommon::GenerateKeyboardParam(Config::default_buttons[button_id])};
+ emulated_controller->SetButtonParam(
+ button_id, Common::ParamPackage{InputCommon::GenerateKeyboardParam(
+ Config::default_buttons[button_id])});
}
for (int analog_id = 0; analog_id < Settings::NativeAnalog::NumAnalogs; ++analog_id) {
+ Common::ParamPackage analog_param{};
for (int sub_button_id = 0; sub_button_id < ANALOG_SUB_BUTTONS_NUM; ++sub_button_id) {
Common::ParamPackage params{InputCommon::GenerateKeyboardParam(
Config::default_analogs[analog_id][sub_button_id])};
- SetAnalogParam(params, analogs_param[analog_id], analog_sub_buttons[sub_button_id]);
+ SetAnalogParam(params, analog_param, analog_sub_buttons[sub_button_id]);
}
- analogs_param[analog_id].Set("modifier", InputCommon::GenerateKeyboardParam(
- Config::default_stick_mod[analog_id]));
+ analog_param.Set("modifier", InputCommon::GenerateKeyboardParam(
+ Config::default_stick_mod[analog_id]));
+ emulated_controller->SetStickParam(analog_id, analog_param);
}
for (int motion_id = 0; motion_id < Settings::NativeMotion::NumMotions; ++motion_id) {
- motions_param[motion_id] = Common::ParamPackage{
- InputCommon::GenerateKeyboardParam(Config::default_motions[motion_id])};
+ emulated_controller->SetMotionParam(
+ motion_id, Common::ParamPackage{InputCommon::GenerateKeyboardParam(
+ Config::default_motions[motion_id])});
}
- UpdateUI();
- return;
+ // If mouse is selected we want to override with mappings from the driver
+ if (ui->comboDevices->currentIndex() == 1) {
+ UpdateUI();
+ return;
+ }
}
// Reset controller bindings
const auto& device = input_devices[ui->comboDevices->currentIndex()];
- auto button_mapping = input_subsystem->GetButtonMappingForDevice(device);
- auto analog_mapping = input_subsystem->GetAnalogMappingForDevice(device);
- auto motion_mapping = input_subsystem->GetMotionMappingForDevice(device);
- for (std::size_t i = 0; i < buttons_param.size(); ++i) {
- buttons_param[i] = button_mapping[static_cast<Settings::NativeButton::Values>(i)];
+ auto button_mappings = input_subsystem->GetButtonMappingForDevice(device);
+ auto analog_mappings = input_subsystem->GetAnalogMappingForDevice(device);
+ auto motion_mappings = input_subsystem->GetMotionMappingForDevice(device);
+
+ for (const auto& button_mapping : button_mappings) {
+ const std::size_t index = button_mapping.first;
+ emulated_controller->SetButtonParam(index, button_mapping.second);
}
- for (std::size_t i = 0; i < analogs_param.size(); ++i) {
- analogs_param[i] = analog_mapping[static_cast<Settings::NativeAnalog::Values>(i)];
+ for (const auto& analog_mapping : analog_mappings) {
+ const std::size_t index = analog_mapping.first;
+ emulated_controller->SetStickParam(index, analog_mapping.second);
}
- for (std::size_t i = 0; i < motions_param.size(); ++i) {
- motions_param[i] = motion_mapping[static_cast<Settings::NativeMotion::Values>(i)];
+ for (const auto& motion_mapping : motion_mappings) {
+ const std::size_t index = motion_mapping.first;
+ emulated_controller->SetMotionParam(index, motion_mapping.second);
}
UpdateUI();
@@ -1330,7 +1283,7 @@ void ConfigureInputPlayer::UpdateMappingWithDefaults() {
void ConfigureInputPlayer::HandleClick(
QPushButton* button, std::size_t button_id,
std::function<void(const Common::ParamPackage&)> new_input_setter,
- InputCommon::Polling::DeviceType type) {
+ InputCommon::Polling::InputType type) {
if (button == ui->buttonMotionLeft || button == ui->buttonMotionRight) {
button->setText(tr("Shake!"));
} else {
@@ -1338,71 +1291,31 @@ void ConfigureInputPlayer::HandleClick(
}
button->setFocus();
- // The first two input devices are always Any and Keyboard/Mouse. If the user filtered to a
- // controller, then they don't want keyboard/mouse input
- want_keyboard_mouse = ui->comboDevices->currentIndex() < 2;
-
input_setter = new_input_setter;
- device_pollers = input_subsystem->GetPollers(type);
-
- for (auto& poller : device_pollers) {
- poller->Start();
- }
+ input_subsystem->BeginMapping(type);
QWidget::grabMouse();
QWidget::grabKeyboard();
- if (type == InputCommon::Polling::DeviceType::Button) {
- input_subsystem->GetGCButtons()->BeginConfiguration();
- } else {
- input_subsystem->GetGCAnalogs()->BeginConfiguration();
- }
-
- if (type == InputCommon::Polling::DeviceType::Motion) {
- input_subsystem->GetUDPMotions()->BeginConfiguration();
- }
-
- if (type == InputCommon::Polling::DeviceType::Button) {
- input_subsystem->GetMouseButtons()->BeginConfiguration();
- } else if (type == InputCommon::Polling::DeviceType::AnalogPreferred) {
- input_subsystem->GetMouseAnalogs()->BeginConfiguration();
- } else if (type == InputCommon::Polling::DeviceType::Motion) {
- input_subsystem->GetMouseMotions()->BeginConfiguration();
- } else {
- input_subsystem->GetMouseTouch()->BeginConfiguration();
- }
-
- if (type == InputCommon::Polling::DeviceType::Button) {
+ if (type == InputCommon::Polling::InputType::Button) {
ui->controllerFrame->BeginMappingButton(button_id);
- } else if (type == InputCommon::Polling::DeviceType::AnalogPreferred) {
+ } else if (type == InputCommon::Polling::InputType::Stick) {
ui->controllerFrame->BeginMappingAnalog(button_id);
}
timeout_timer->start(2500); // Cancel after 2.5 seconds
- poll_timer->start(50); // Check for new inputs every 50ms
+ poll_timer->start(25); // Check for new inputs every 25ms
}
void ConfigureInputPlayer::SetPollingResult(const Common::ParamPackage& params, bool abort) {
timeout_timer->stop();
poll_timer->stop();
- for (auto& poller : device_pollers) {
- poller->Stop();
- }
+ input_subsystem->StopMapping();
QWidget::releaseMouse();
QWidget::releaseKeyboard();
- input_subsystem->GetGCButtons()->EndConfiguration();
- input_subsystem->GetGCAnalogs()->EndConfiguration();
-
- input_subsystem->GetUDPMotions()->EndConfiguration();
-
- input_subsystem->GetMouseButtons()->EndConfiguration();
- input_subsystem->GetMouseAnalogs()->EndConfiguration();
- input_subsystem->GetMouseMotions()->EndConfiguration();
- input_subsystem->GetMouseTouch()->EndConfiguration();
-
if (!abort) {
(*input_setter)(params);
}
@@ -1419,15 +1332,20 @@ bool ConfigureInputPlayer::IsInputAcceptable(const Common::ParamPackage& params)
return true;
}
+ if (params.Has("motion")) {
+ return true;
+ }
+
// Keyboard/Mouse
- if (ui->comboDevices->currentIndex() == 1) {
+ if (ui->comboDevices->currentIndex() == 1 || ui->comboDevices->currentIndex() == 2) {
return params.Get("engine", "") == "keyboard" || params.Get("engine", "") == "mouse";
}
const auto current_input_device = input_devices[ui->comboDevices->currentIndex()];
- return params.Get("engine", "") == current_input_device.Get("class", "") &&
- params.Get("guid", "") == current_input_device.Get("guid", "") &&
- params.Get("port", "") == current_input_device.Get("port", "");
+ return params.Get("engine", "") == current_input_device.Get("engine", "") &&
+ (params.Get("guid", "") == current_input_device.Get("guid", "") ||
+ params.Get("guid", "") == current_input_device.Get("guid2", "")) &&
+ params.Get("port", 0) == current_input_device.Get("port", 0);
}
void ConfigureInputPlayer::mousePressEvent(QMouseEvent* event) {
@@ -1436,25 +1354,17 @@ void ConfigureInputPlayer::mousePressEvent(QMouseEvent* event) {
}
const auto button = GRenderWindow::QtButtonToMouseButton(event->button());
- input_subsystem->GetMouse()->PressButton(0, 0, button);
+ input_subsystem->GetMouse()->PressButton(0, 0, 0, 0, button);
}
void ConfigureInputPlayer::keyPressEvent(QKeyEvent* event) {
+ event->ignore();
if (!input_setter || !event) {
return;
}
-
if (event->key() != Qt::Key_Escape) {
- if (want_keyboard_mouse) {
- SetPollingResult(Common::ParamPackage{InputCommon::GenerateKeyboardParam(event->key())},
- false);
- } else {
- // Escape key wasn't pressed and we don't want any keyboard keys, so don't stop polling
- return;
- }
+ input_subsystem->GetKeyboard()->PressKey(event->key());
}
-
- SetPollingResult({}, true);
}
void ConfigureInputPlayer::CreateProfile() {
diff --git a/src/yuzu/configuration/configure_input_player.h b/src/yuzu/configuration/configure_input_player.h
index 39b44b8a5..47df6b3d3 100644
--- a/src/yuzu/configuration/configure_input_player.h
+++ b/src/yuzu/configuration/configure_input_player.h
@@ -29,48 +29,37 @@ class QWidget;
class InputProfiles;
-namespace Core {
-class System;
-}
-
namespace InputCommon {
class InputSubsystem;
}
namespace InputCommon::Polling {
-class DevicePoller;
-enum class DeviceType;
+enum class InputType;
} // namespace InputCommon::Polling
namespace Ui {
class ConfigureInputPlayer;
}
+namespace Core::HID {
+class HIDCore;
+class EmulatedController;
+enum class NpadStyleIndex : u8;
+} // namespace Core::HID
+
class ConfigureInputPlayer : public QWidget {
Q_OBJECT
public:
explicit ConfigureInputPlayer(QWidget* parent, std::size_t player_index, QWidget* bottom_row,
InputCommon::InputSubsystem* input_subsystem_,
- InputProfiles* profiles_, Core::System& system_,
- bool debug = false);
+ InputProfiles* profiles_, Core::HID::HIDCore& hid_core_,
+ bool is_powered_on_, bool debug = false);
~ConfigureInputPlayer() override;
/// Save all button configurations to settings file.
void ApplyConfiguration();
- /**
- * Attempts to connect the currently selected controller in the HID backend.
- * This function will not do anything if it is not connected in the frontend.
- */
- void TryConnectSelectedController();
-
- /**
- * Attempts to disconnect the currently selected controller in the HID backend.
- * This function will not do anything if the configuration has not changed.
- */
- void TryDisconnectSelectedController();
-
/// Set the connection state checkbox (used to sync state).
void ConnectPlayer(bool connected);
@@ -104,6 +93,10 @@ protected:
void showEvent(QShowEvent* event) override;
private:
+ QString ButtonToText(const Common::ParamPackage& param);
+
+ QString AnalogToText(const Common::ParamPackage& param, const std::string& dir);
+
void changeEvent(QEvent* event) override;
void RetranslateUI();
@@ -113,7 +106,7 @@ private:
/// Called when the button was pressed.
void HandleClick(QPushButton* button, std::size_t button_id,
std::function<void(const Common::ParamPackage&)> new_input_setter,
- InputCommon::Polling::DeviceType type);
+ InputCommon::Polling::InputType type);
/// Finish polling and configure input using the input_setter.
void SetPollingResult(const Common::ParamPackage& params, bool abort);
@@ -134,17 +127,14 @@ private:
void SetConnectableControllers();
/// Gets the Controller Type for a given controller combobox index.
- Settings::ControllerType GetControllerTypeFromIndex(int index) const;
+ Core::HID::NpadStyleIndex GetControllerTypeFromIndex(int index) const;
/// Gets the controller combobox index for a given Controller Type.
- int GetIndexFromControllerType(Settings::ControllerType type) const;
+ int GetIndexFromControllerType(Core::HID::NpadStyleIndex type) const;
/// Update the available input devices.
void UpdateInputDevices();
- /// Update the current controller icon.
- void UpdateControllerIcon();
-
/// Hides and disables controller settings based on the current controller type.
void UpdateControllerAvailableButtons();
@@ -176,6 +166,7 @@ private:
std::size_t player_index;
bool debug;
+ bool is_powered_on;
InputCommon::InputSubsystem* input_subsystem;
@@ -185,7 +176,7 @@ private:
std::unique_ptr<QTimer> poll_timer;
/// Stores a pair of "Connected Controllers" combobox index and Controller Type enum.
- std::vector<std::pair<int, Settings::ControllerType>> index_controller_type_pairs;
+ std::vector<std::pair<int, Core::HID::NpadStyleIndex>> index_controller_type_pairs;
static constexpr int PLAYER_COUNT = 8;
std::array<QCheckBox*, PLAYER_COUNT> player_connected_checkbox;
@@ -193,9 +184,7 @@ private:
/// This will be the the setting function when an input is awaiting configuration.
std::optional<std::function<void(const Common::ParamPackage&)>> input_setter;
- std::array<Common::ParamPackage, Settings::NativeButton::NumButtons> buttons_param;
- std::array<Common::ParamPackage, Settings::NativeAnalog::NumAnalogs> analogs_param;
- std::array<Common::ParamPackage, Settings::NativeMotion::NumMotions> motions_param;
+ Core::HID::EmulatedController* emulated_controller;
static constexpr int ANALOG_SUB_BUTTONS_NUM = 4;
@@ -221,15 +210,9 @@ private:
static const std::array<std::string, ANALOG_SUB_BUTTONS_NUM> analog_sub_buttons;
- std::vector<std::unique_ptr<InputCommon::Polling::DevicePoller>> device_pollers;
-
/// A flag to indicate that the "Map Analog Stick" pop-up has been shown and accepted once.
bool map_analog_stick_accepted{};
- /// A flag to indicate if keyboard keys are okay when configuring an input. If this is false,
- /// keyboard events are ignored.
- bool want_keyboard_mouse{};
-
/// List of physical devices users can map with. If a SDL backed device is selected, then you
/// can use this device to get a default mapping.
std::vector<Common::ParamPackage> input_devices;
@@ -239,5 +222,5 @@ private:
/// parent of the widget to this widget (but thats fine).
QWidget* bottom_row;
- Core::System& system;
+ Core::HID::HIDCore& hid_core;
};
diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui
index e7433912b..756a414b5 100644
--- a/src/yuzu/configuration/configure_input_player.ui
+++ b/src/yuzu/configuration/configure_input_player.ui
@@ -89,31 +89,6 @@
<height>21</height>
</size>
</property>
- <item>
- <property name="text">
- <string>Pro Controller</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Dual Joycons</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Left Joycon</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Right Joycon</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Handheld</string>
- </property>
- </item>
</widget>
</item>
</layout>
@@ -142,22 +117,9 @@
</property>
<item>
<widget class="QComboBox" name="comboDevices">
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>21</height>
- </size>
+ <property name="minimumContentsLength">
+ <number>60</number>
</property>
- <item>
- <property name="text">
- <string>Any</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Keyboard/Mouse</string>
- </property>
- </item>
</widget>
</item>
<item>
@@ -342,7 +304,7 @@
<number>3</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>6</number>
</property>
<property name="rightMargin">
<number>3</number>
@@ -918,7 +880,7 @@
<number>3</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>6</number>
</property>
<property name="rightMargin">
<number>3</number>
@@ -2221,7 +2183,7 @@
<number>3</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>6</number>
</property>
<property name="rightMargin">
<number>3</number>
@@ -2570,7 +2532,7 @@
<number>3</number>
</property>
<property name="topMargin">
- <number>0</number>
+ <number>6</number>
</property>
<property name="rightMargin">
<number>3</number>
diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp
index f31f86339..6630321cb 100644
--- a/src/yuzu/configuration/configure_input_player_widget.cpp
+++ b/src/yuzu/configuration/configure_input_player_widget.cpp
@@ -6,10 +6,12 @@
#include <QMenu>
#include <QPainter>
#include <QTimer>
+
+#include "core/hid/emulated_controller.h"
#include "yuzu/configuration/configure_input_player_widget.h"
PlayerControlPreview::PlayerControlPreview(QWidget* parent) : QFrame(parent) {
- UpdateColors();
+ is_controller_set = false;
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload<>::of(&PlayerControlPreview::UpdateInput));
@@ -17,91 +19,37 @@ PlayerControlPreview::PlayerControlPreview(QWidget* parent) : QFrame(parent) {
timer->start(16);
}
-PlayerControlPreview::~PlayerControlPreview() = default;
-
-void PlayerControlPreview::SetPlayerInput(std::size_t index, const ButtonParam& buttons_param,
- const AnalogParam& analogs_param) {
- player_index = index;
- Settings::ButtonsRaw buttonss;
- Settings::AnalogsRaw analogs;
- std::transform(buttons_param.begin(), buttons_param.end(), buttonss.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
- std::transform(analogs_param.begin(), analogs_param.end(), analogs.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
-
- std::transform(buttonss.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
- buttonss.begin() + Settings::NativeButton::BUTTON_NS_END, buttons.begin(),
- Input::CreateDevice<Input::ButtonDevice>);
- std::transform(analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN,
- analogs.begin() + Settings::NativeAnalog::STICK_HID_END, sticks.begin(),
- Input::CreateDevice<Input::AnalogDevice>);
- UpdateColors();
-}
-void PlayerControlPreview::SetPlayerInputRaw(std::size_t index,
- const Settings::ButtonsRaw& buttons_,
- Settings::AnalogsRaw analogs_) {
- player_index = index;
- std::transform(buttons_.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
- buttons_.begin() + Settings::NativeButton::BUTTON_NS_END, buttons.begin(),
- Input::CreateDevice<Input::ButtonDevice>);
- std::transform(analogs_.begin() + Settings::NativeAnalog::STICK_HID_BEGIN,
- analogs_.begin() + Settings::NativeAnalog::STICK_HID_END, sticks.begin(),
- Input::CreateDevice<Input::AnalogDevice>);
- UpdateColors();
-}
-
-PlayerControlPreview::LedPattern PlayerControlPreview::GetColorPattern(std::size_t index,
- bool player_on) {
- if (!player_on) {
- return {0, 0, 0, 0};
- }
-
- switch (index) {
- case 0:
- return {1, 0, 0, 0};
- case 1:
- return {1, 1, 0, 0};
- case 2:
- return {1, 1, 1, 0};
- case 3:
- return {1, 1, 1, 1};
- case 4:
- return {1, 0, 0, 1};
- case 5:
- return {1, 0, 1, 0};
- case 6:
- return {1, 0, 1, 1};
- case 7:
- return {0, 1, 1, 0};
- default:
- return {0, 0, 0, 0};
- }
-}
-
-void PlayerControlPreview::SetConnectedStatus(bool checked) {
- LedPattern led_pattern = GetColorPattern(player_index, checked);
+PlayerControlPreview::~PlayerControlPreview() {
+ UnloadController();
+};
- led_color[0] = led_pattern.position1 ? colors.led_on : colors.led_off;
- led_color[1] = led_pattern.position2 ? colors.led_on : colors.led_off;
- led_color[2] = led_pattern.position3 ? colors.led_on : colors.led_off;
- led_color[3] = led_pattern.position4 ? colors.led_on : colors.led_off;
- is_enabled = checked;
- ResetInputs();
+void PlayerControlPreview::SetController(Core::HID::EmulatedController* controller_) {
+ UnloadController();
+ is_controller_set = true;
+ controller = controller_;
+ Core::HID::ControllerUpdateCallback engine_callback{
+ .on_change = [this](Core::HID::ControllerTriggerType type) { ControllerUpdate(type); },
+ .is_npad_service = false,
+ };
+ callback_key = controller->SetCallback(engine_callback);
+ ControllerUpdate(Core::HID::ControllerTriggerType::All);
}
-void PlayerControlPreview::SetControllerType(const Settings::ControllerType type) {
- controller_type = type;
- UpdateColors();
+void PlayerControlPreview::UnloadController() {
+ if (is_controller_set) {
+ controller->DeleteCallback(callback_key);
+ is_controller_set = false;
+ }
}
-void PlayerControlPreview::BeginMappingButton(std::size_t index) {
- button_mapping_index = index;
+void PlayerControlPreview::BeginMappingButton(std::size_t button_id) {
+ button_mapping_index = button_id;
mapping_active = true;
}
-void PlayerControlPreview::BeginMappingAnalog(std::size_t index) {
- button_mapping_index = Settings::NativeButton::LStick + index;
- analog_mapping_index = index;
+void PlayerControlPreview::BeginMappingAnalog(std::size_t stick_id) {
+ button_mapping_index = Settings::NativeButton::LStick + stick_id;
+ analog_mapping_index = stick_id;
mapping_active = true;
}
@@ -157,84 +105,109 @@ void PlayerControlPreview::UpdateColors() {
colors.left = colors.primary;
colors.right = colors.primary;
// Possible alternative to set colors from settings
- // colors.left = QColor(Settings::values.players.GetValue()[player_index].body_color_left);
- // colors.right = QColor(Settings::values.players.GetValue()[player_index].body_color_right);
+ // colors.left = QColor(controller->GetColors().left.body);
+ // colors.right = QColor(controller->GetColors().right.body);
}
void PlayerControlPreview::ResetInputs() {
- for (std::size_t index = 0; index < button_values.size(); ++index) {
- button_values[index] = false;
- }
-
- for (std::size_t index = 0; index < axis_values.size(); ++index) {
- axis_values[index].properties = {0, 1, 0};
- axis_values[index].value = {0, 0};
- axis_values[index].raw_value = {0, 0};
- }
+ button_values.fill({
+ .value = false,
+ });
+ stick_values.fill({
+ .x = {.value = 0, .properties = {0, 1, 0}},
+ .y = {.value = 0, .properties = {0, 1, 0}},
+ });
+ trigger_values.fill({
+ .analog = {.value = 0, .properties = {0, 1, 0}},
+ .pressed = {.value = false},
+ });
update();
}
-void PlayerControlPreview::UpdateInput() {
- if (!is_enabled && !mapping_active && !Settings::values.tas_enable) {
+void PlayerControlPreview::ControllerUpdate(Core::HID::ControllerTriggerType type) {
+ if (type == Core::HID::ControllerTriggerType::All) {
+ ControllerUpdate(Core::HID::ControllerTriggerType::Color);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Type);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Connected);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Button);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Stick);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Trigger);
+ ControllerUpdate(Core::HID::ControllerTriggerType::Battery);
return;
}
- bool input_changed = false;
- const auto& button_state = buttons;
- for (std::size_t index = 0; index < button_values.size(); ++index) {
- bool value = false;
- if (index < Settings::NativeButton::BUTTON_NS_END) {
- value = button_state[index]->GetStatus();
- }
- bool blink = mapping_active && index == button_mapping_index;
- if (analog_mapping_index == Settings::NativeAnalog::NUM_STICKS_HID) {
- blink &= blink_counter > 25;
- }
- if (button_values[index] != value || blink) {
- input_changed = true;
- }
- button_values[index] = value || blink;
+
+ switch (type) {
+ case Core::HID::ControllerTriggerType::Connected:
+ is_connected = true;
+ led_pattern = controller->GetLedPattern();
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Disconnected:
+ is_connected = false;
+ led_pattern.raw = 0;
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Type:
+ controller_type = controller->GetNpadStyleIndex(true);
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Color:
+ UpdateColors();
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Button:
+ button_values = controller->GetButtonsValues();
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Stick:
+ using namespace Settings::NativeAnalog;
+ stick_values = controller->GetSticksValues();
+ // Y axis is inverted
+ stick_values[LStick].y.value = -stick_values[LStick].y.value;
+ stick_values[LStick].y.raw_value = -stick_values[LStick].y.raw_value;
+ stick_values[RStick].y.value = -stick_values[RStick].y.value;
+ stick_values[RStick].y.raw_value = -stick_values[RStick].y.raw_value;
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Trigger:
+ trigger_values = controller->GetTriggersValues();
+ needs_redraw = true;
+ break;
+ case Core::HID::ControllerTriggerType::Battery:
+ battery_values = controller->GetBatteryValues();
+ needs_redraw = true;
+ break;
+ default:
+ break;
}
+}
- const auto& analog_state = sticks;
- for (std::size_t index = 0; index < axis_values.size(); ++index) {
- const auto [stick_x_f, stick_y_f] = analog_state[index]->GetStatus();
- const auto [stick_x_rf, stick_y_rf] = analog_state[index]->GetRawStatus();
+void PlayerControlPreview::UpdateInput() {
+ if (mapping_active) {
- if (static_cast<int>(stick_x_rf * 45) !=
- static_cast<int>(axis_values[index].raw_value.x() * 45) ||
- static_cast<int>(-stick_y_rf * 45) !=
- static_cast<int>(axis_values[index].raw_value.y() * 45)) {
- input_changed = true;
+ for (std::size_t index = 0; index < button_values.size(); ++index) {
+ bool blink = index == button_mapping_index;
+ if (analog_mapping_index == Settings::NativeAnalog::NumAnalogs) {
+ blink &= blink_counter > 25;
+ }
+ if (button_values[index].value != blink) {
+ needs_redraw = true;
+ }
+ button_values[index].value = blink;
}
- axis_values[index].properties = analog_state[index]->GetAnalogProperties();
- axis_values[index].value = QPointF(stick_x_f, -stick_y_f);
- axis_values[index].raw_value = QPointF(stick_x_rf, -stick_y_rf);
-
- const bool blink_analog = mapping_active && index == analog_mapping_index;
- if (blink_analog) {
- input_changed = true;
- axis_values[index].value =
- QPointF(blink_counter < 25 ? -blink_counter / 25.0f : 0,
- blink_counter > 25 ? -(blink_counter - 25) / 25.0f : 0);
+ for (std::size_t index = 0; index < stick_values.size(); ++index) {
+ const bool blink_analog = index == analog_mapping_index;
+ if (blink_analog) {
+ needs_redraw = true;
+ stick_values[index].x.value = blink_counter < 25 ? -blink_counter / 25.0f : 0;
+ stick_values[index].y.value =
+ blink_counter > 25 ? -(blink_counter - 25) / 25.0f : 0;
+ }
}
}
-
- if (input_changed) {
+ if (needs_redraw) {
update();
- if (controller_callback.input != nullptr) {
- ControllerInput input{
- .axis_values = {std::pair<float, float>{
- axis_values[Settings::NativeAnalog::LStick].value.x(),
- axis_values[Settings::NativeAnalog::LStick].value.y()},
- std::pair<float, float>{
- axis_values[Settings::NativeAnalog::RStick].value.x(),
- axis_values[Settings::NativeAnalog::RStick].value.y()}},
- .button_values = button_values,
- .changed = true,
- };
- controller_callback.input(std::move(input));
- }
}
if (mapping_active) {
@@ -242,10 +215,6 @@ void PlayerControlPreview::UpdateInput() {
}
}
-void PlayerControlPreview::SetCallBack(ControllerCallback callback_) {
- controller_callback = std::move(callback_);
-}
-
void PlayerControlPreview::paintEvent(QPaintEvent* event) {
QFrame::paintEvent(event);
QPainter p(this);
@@ -253,22 +222,22 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) {
const QPointF center = rect().center();
switch (controller_type) {
- case Settings::ControllerType::Handheld:
+ case Core::HID::NpadStyleIndex::Handheld:
DrawHandheldController(p, center);
break;
- case Settings::ControllerType::DualJoyconDetached:
+ case Core::HID::NpadStyleIndex::JoyconDual:
DrawDualController(p, center);
break;
- case Settings::ControllerType::LeftJoycon:
+ case Core::HID::NpadStyleIndex::JoyconLeft:
DrawLeftController(p, center);
break;
- case Settings::ControllerType::RightJoycon:
+ case Core::HID::NpadStyleIndex::JoyconRight:
DrawRightController(p, center);
break;
- case Settings::ControllerType::GameCube:
+ case Core::HID::NpadStyleIndex::GameCube:
DrawGCController(p, center);
break;
- case Settings::ControllerType::ProController:
+ case Core::HID::NpadStyleIndex::ProController:
default:
DrawProController(p, center);
break;
@@ -281,7 +250,7 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
// Sideview left joystick
DrawJoystickSideview(p, center + QPoint(142, -69),
- -axis_values[Settings::NativeAnalog::LStick].value.y(), 1.15f,
+ -stick_values[Settings::NativeAnalog::LStick].y.value, 1.15f,
button_values[LStick]);
// Topview D-pad buttons
@@ -292,7 +261,7 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
// Topview left joystick
DrawJoystickSideview(p, center + QPointF(-140.5f, -28),
- -axis_values[Settings::NativeAnalog::LStick].value.x() + 15.0f, 1.15f,
+ -stick_values[Settings::NativeAnalog::LStick].x.value + 15.0f, 1.15f,
button_values[LStick]);
// Topview minus button
@@ -334,8 +303,10 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- DrawJoystick(p, center + QPointF(9, -69) + (axis_values[LStick].value * 8), 1.8f,
- button_values[Settings::NativeButton::LStick]);
+ DrawJoystick(p,
+ center + QPointF(9, -69) +
+ (QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value) * 8),
+ 1.8f, button_values[Settings::NativeButton::LStick]);
DrawRawJoystick(p, center + QPointF(-140, 90), QPointF(0, 0));
}
@@ -384,6 +355,10 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
p.setPen(colors.font2);
p.setBrush(colors.font2);
DrawCircle(p, center + QPoint(26, 71), 5);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(-170, -140),
+ battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
}
void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center) {
@@ -392,20 +367,22 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
// Sideview right joystick
DrawJoystickSideview(p, center + QPoint(173 - 315, 11),
- axis_values[Settings::NativeAnalog::RStick].value.y() + 10.0f, 1.15f,
+ stick_values[Settings::NativeAnalog::RStick].y.value + 10.0f, 1.15f,
button_values[Settings::NativeButton::RStick]);
+ // Topview right joystick
+ DrawJoystickSideview(p, center + QPointF(140, -28),
+ -stick_values[Settings::NativeAnalog::RStick].x.value + 15.0f, 1.15f,
+ button_values[RStick]);
+
// Topview face buttons
p.setPen(colors.outline);
button_color = colors.button;
DrawRoundButton(p, center + QPoint(163, -21), button_values[A], 11, 5, Direction::Up);
+ DrawRoundButton(p, center + QPoint(140, -21), button_values[B], 11, 5, Direction::Up);
+ DrawRoundButton(p, center + QPoint(140, -21), button_values[X], 11, 5, Direction::Up);
DrawRoundButton(p, center + QPoint(117, -21), button_values[Y], 11, 5, Direction::Up);
- // Topview right joystick
- DrawJoystickSideview(p, center + QPointF(140, -28),
- -axis_values[Settings::NativeAnalog::RStick].value.x() + 15.0f, 1.15f,
- button_values[RStick]);
-
// Topview plus button
p.setPen(colors.outline);
button_color = colors.button;
@@ -448,8 +425,10 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- DrawJoystick(p, center + QPointF(-9, 11) + (axis_values[RStick].value * 8), 1.8f,
- button_values[Settings::NativeButton::RStick]);
+ DrawJoystick(p,
+ center + QPointF(-9, 11) +
+ (QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value) * 8),
+ 1.8f, button_values[Settings::NativeButton::RStick]);
DrawRawJoystick(p, QPointF(0, 0), center + QPointF(140, 90));
}
@@ -503,6 +482,10 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
p.setPen(colors.transparent);
p.setBrush(colors.font2);
DrawSymbol(p, center + QPoint(-26, 66), Symbol::House, 5);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(110, -140),
+ battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
}
void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center) {
@@ -512,17 +495,19 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
// Left/Right trigger
DrawDualTriggers(p, center, button_values[L], button_values[R]);
+ // Topview right joystick
+ DrawJoystickSideview(p, center + QPointF(180, -78),
+ -stick_values[Settings::NativeAnalog::RStick].x.value + 15.0f, 1,
+ button_values[RStick]);
+
// Topview face buttons
p.setPen(colors.outline);
button_color = colors.button;
DrawRoundButton(p, center + QPoint(200, -71), button_values[A], 10, 5, Direction::Up);
+ DrawRoundButton(p, center + QPoint(180, -71), button_values[B], 10, 5, Direction::Up);
+ DrawRoundButton(p, center + QPoint(180, -71), button_values[X], 10, 5, Direction::Up);
DrawRoundButton(p, center + QPoint(160, -71), button_values[Y], 10, 5, Direction::Up);
- // Topview right joystick
- DrawJoystickSideview(p, center + QPointF(180, -78),
- -axis_values[Settings::NativeAnalog::RStick].value.x() + 15.0f, 1,
- button_values[RStick]);
-
// Topview plus button
p.setPen(colors.outline);
button_color = colors.button;
@@ -538,7 +523,7 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
// Topview left joystick
DrawJoystickSideview(p, center + QPointF(-180.5f, -78),
- -axis_values[Settings::NativeAnalog::LStick].value.x() + 15.0f, 1,
+ -stick_values[Settings::NativeAnalog::LStick].x.value + 15.0f, 1,
button_values[LStick]);
// Topview minus button
@@ -557,13 +542,13 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- const auto& l_stick = axis_values[LStick];
+ const auto l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value);
const auto l_button = button_values[Settings::NativeButton::LStick];
- const auto& r_stick = axis_values[RStick];
+ const auto r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value);
const auto r_button = button_values[Settings::NativeButton::RStick];
- DrawJoystick(p, center + QPointF(-65, -65) + (l_stick.value * 7), 1.62f, l_button);
- DrawJoystick(p, center + QPointF(65, 12) + (r_stick.value * 7), 1.62f, r_button);
+ DrawJoystick(p, center + QPointF(-65, -65) + (l_stick * 7), 1.62f, l_button);
+ DrawJoystick(p, center + QPointF(65, 12) + (r_stick * 7), 1.62f, r_button);
DrawRawJoystick(p, center + QPointF(-180, 90), center + QPointF(180, 90));
}
@@ -634,6 +619,12 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
p.setPen(colors.transparent);
p.setBrush(colors.font2);
DrawSymbol(p, center + QPoint(50, 60), Symbol::House, 4.2f);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(-100, -160),
+ battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
+ DrawBattery(p, center + QPoint(40, -160),
+ battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
}
void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF center) {
@@ -643,13 +634,13 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- const auto& l_stick = axis_values[LStick];
+ const auto l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value);
const auto l_button = button_values[Settings::NativeButton::LStick];
- const auto& r_stick = axis_values[RStick];
+ const auto r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value);
const auto r_button = button_values[Settings::NativeButton::RStick];
- DrawJoystick(p, center + QPointF(-171, -41) + (l_stick.value * 4), 1.0f, l_button);
- DrawJoystick(p, center + QPointF(171, 8) + (r_stick.value * 4), 1.0f, r_button);
+ DrawJoystick(p, center + QPointF(-171, -41) + (l_stick * 4), 1.0f, l_button);
+ DrawJoystick(p, center + QPointF(171, 8) + (r_stick * 4), 1.0f, r_button);
DrawRawJoystick(p, center + QPointF(-50, 0), center + QPointF(50, 0));
}
@@ -732,6 +723,12 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
p.setPen(colors.transparent);
p.setBrush(colors.font2);
DrawSymbol(p, center + QPoint(161, 37), Symbol::House, 2.75f);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(-200, 110),
+ battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
+ DrawBattery(p, center + QPoint(130, 110),
+ battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);
}
void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center) {
@@ -741,9 +738,11 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- DrawProJoystick(p, center + QPointF(-111, -55), axis_values[LStick].value, 11,
+ const auto l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value);
+ const auto r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value);
+ DrawProJoystick(p, center + QPointF(-111, -55), l_stick, 11,
button_values[Settings::NativeButton::LStick]);
- DrawProJoystick(p, center + QPointF(51, 0), axis_values[RStick].value, 11,
+ DrawProJoystick(p, center + QPointF(51, 0), r_stick, 11,
button_values[Settings::NativeButton::RStick]);
DrawRawJoystick(p, center + QPointF(-50, 105), center + QPointF(50, 105));
}
@@ -817,24 +816,27 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
p.setPen(colors.transparent);
p.setBrush(colors.font2);
DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(-30, -160),
+ battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
}
void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {
- DrawGCTriggers(p, center, button_values[Settings::NativeButton::ZL],
- button_values[Settings::NativeButton::ZR]);
+ DrawGCTriggers(p, center, trigger_values[0], trigger_values[1]);
DrawGCButtonZ(p, center, button_values[Settings::NativeButton::R]);
DrawGCBody(p, center);
{
// Draw joysticks
using namespace Settings::NativeAnalog;
- DrawGCJoystick(p, center + QPointF(-111, -44) + (axis_values[LStick].value * 10), false);
+ const auto l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value);
+ const auto r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value);
+ DrawGCJoystick(p, center + QPointF(-111, -44) + (l_stick * 10), {});
button_color = colors.button2;
- DrawCircleButton(p, center + QPointF(61, 37) + (axis_values[RStick].value * 9.5f), false,
- 15);
+ DrawCircleButton(p, center + QPointF(61, 37) + (r_stick * 9.5f), {}, 15);
p.setPen(colors.transparent);
p.setBrush(colors.font);
- DrawSymbol(p, center + QPointF(61, 37) + (axis_values[RStick].value * 9.5f), Symbol::C,
- 1.0f);
+ DrawSymbol(p, center + QPointF(61, 37) + (r_stick * 9.5f), Symbol::C, 1.0f);
DrawRawJoystick(p, center + QPointF(-198, -125), center + QPointF(198, -125));
}
@@ -871,6 +873,10 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {
// Minus and Plus buttons
p.setPen(colors.outline);
DrawCircleButton(p, center + QPoint(0, -44), button_values[Plus], 8);
+
+ // Draw battery
+ DrawBattery(p, center + QPoint(-30, -165),
+ battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);
}
constexpr std::array<float, 13 * 2> symbol_a = {
@@ -1837,10 +1843,14 @@ void PlayerControlPreview::DrawLeftBody(QPainter& p, const QPointF center) {
const float led_size = 5.0f;
const QPointF led_position = sideview_center + QPointF(0, -36);
int led_count = 0;
- for (const auto& color : led_color) {
- p.setBrush(color);
- DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
- }
+ p.setBrush(led_pattern.position1 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position2 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position3 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position4 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
}
void PlayerControlPreview::DrawRightBody(QPainter& p, const QPointF center) {
@@ -1933,14 +1943,19 @@ void PlayerControlPreview::DrawRightBody(QPainter& p, const QPointF center) {
const float led_size = 5.0f;
const QPointF led_position = sideview_center + QPointF(0, -36);
int led_count = 0;
- for (const auto& color : led_color) {
- p.setBrush(color);
- DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
- }
-}
-
-void PlayerControlPreview::DrawProTriggers(QPainter& p, const QPointF center, bool left_pressed,
- bool right_pressed) {
+ p.setBrush(led_pattern.position1 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position2 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position3 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+ p.setBrush(led_pattern.position4 ? colors.led_on : colors.led_off);
+ DrawRectangle(p, led_position + QPointF(0, 12 * led_count++), led_size, led_size);
+}
+
+void PlayerControlPreview::DrawProTriggers(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, pro_left_trigger.size() / 2> qleft_trigger;
std::array<QPointF, pro_left_trigger.size() / 2> qright_trigger;
std::array<QPointF, pro_body_top.size()> qbody_top;
@@ -1949,8 +1964,10 @@ void PlayerControlPreview::DrawProTriggers(QPainter& p, const QPointF center, bo
const float trigger_x = pro_left_trigger[point * 2 + 0];
const float trigger_y = pro_left_trigger[point * 2 + 1];
- qleft_trigger[point] = center + QPointF(trigger_x, trigger_y + (left_pressed ? 2 : 0));
- qright_trigger[point] = center + QPointF(-trigger_x, trigger_y + (right_pressed ? 2 : 0));
+ qleft_trigger[point] =
+ center + QPointF(trigger_x, trigger_y + (left_pressed.value ? 2 : 0));
+ qright_trigger[point] =
+ center + QPointF(-trigger_x, trigger_y + (right_pressed.value ? 2 : 0));
}
for (std::size_t point = 0; point < pro_body_top.size() / 2; ++point) {
@@ -1967,16 +1984,17 @@ void PlayerControlPreview::DrawProTriggers(QPainter& p, const QPointF center, bo
DrawPolygon(p, qbody_top);
// Left trigger
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Right trigger
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
}
-void PlayerControlPreview::DrawGCTriggers(QPainter& p, const QPointF center, bool left_pressed,
- bool right_pressed) {
+void PlayerControlPreview::DrawGCTriggers(QPainter& p, const QPointF center,
+ Common::Input::TriggerStatus left_trigger,
+ Common::Input::TriggerStatus right_trigger) {
std::array<QPointF, left_gc_trigger.size() / 2> qleft_trigger;
std::array<QPointF, left_gc_trigger.size() / 2> qright_trigger;
@@ -1984,32 +2002,37 @@ void PlayerControlPreview::DrawGCTriggers(QPainter& p, const QPointF center, boo
const float trigger_x = left_gc_trigger[point * 2 + 0];
const float trigger_y = left_gc_trigger[point * 2 + 1];
- qleft_trigger[point] = center + QPointF(trigger_x, trigger_y + (left_pressed ? 10 : 0));
- qright_trigger[point] = center + QPointF(-trigger_x, trigger_y + (right_pressed ? 10 : 0));
+ qleft_trigger[point] =
+ center + QPointF(trigger_x, trigger_y + (left_trigger.analog.value * 10.0f));
+ qright_trigger[point] =
+ center + QPointF(-trigger_x, trigger_y + (right_trigger.analog.value * 10.0f));
}
// Left trigger
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_trigger.pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Right trigger
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_trigger.pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
// Draw L text
p.setPen(colors.transparent);
p.setBrush(colors.font);
- DrawSymbol(p, center + QPointF(-132, -119 + (left_pressed ? 10 : 0)), Symbol::L, 1.7f);
+ DrawSymbol(p, center + QPointF(-132, -119 + (left_trigger.analog.value * 10.0f)), Symbol::L,
+ 1.7f);
// Draw R text
p.setPen(colors.transparent);
p.setBrush(colors.font);
- DrawSymbol(p, center + QPointF(121.5f, -119 + (right_pressed ? 10 : 0)), Symbol::R, 1.7f);
+ DrawSymbol(p, center + QPointF(121.5f, -119 + (right_trigger.analog.value * 10.0f)), Symbol::R,
+ 1.7f);
}
void PlayerControlPreview::DrawHandheldTriggers(QPainter& p, const QPointF center,
- bool left_pressed, bool right_pressed) {
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joycon_trigger.size() / 2> qleft_trigger;
std::array<QPointF, left_joycon_trigger.size() / 2> qright_trigger;
@@ -2018,23 +2041,24 @@ void PlayerControlPreview::DrawHandheldTriggers(QPainter& p, const QPointF cente
const float left_trigger_y = left_joycon_trigger[point * 2 + 1];
qleft_trigger[point] =
- center + QPointF(left_trigger_x, left_trigger_y + (left_pressed ? 0.5f : 0));
+ center + QPointF(left_trigger_x, left_trigger_y + (left_pressed.value ? 0.5f : 0));
qright_trigger[point] =
- center + QPointF(-left_trigger_x, left_trigger_y + (right_pressed ? 0.5f : 0));
+ center + QPointF(-left_trigger_x, left_trigger_y + (right_pressed.value ? 0.5f : 0));
}
// Left trigger
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Right trigger
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
}
-void PlayerControlPreview::DrawDualTriggers(QPainter& p, const QPointF center, bool left_pressed,
- bool right_pressed) {
+void PlayerControlPreview::DrawDualTriggers(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joycon_trigger.size() / 2> qleft_trigger;
std::array<QPointF, left_joycon_trigger.size() / 2> qright_trigger;
constexpr float size = 1.62f;
@@ -2043,25 +2067,27 @@ void PlayerControlPreview::DrawDualTriggers(QPainter& p, const QPointF center, b
const float left_trigger_x = left_joycon_trigger[point * 2 + 0];
const float left_trigger_y = left_joycon_trigger[point * 2 + 1];
- qleft_trigger[point] = center + QPointF(left_trigger_x * size + offset,
- left_trigger_y * size + (left_pressed ? 0.5f : 0));
+ qleft_trigger[point] =
+ center + QPointF(left_trigger_x * size + offset,
+ left_trigger_y * size + (left_pressed.value ? 0.5f : 0));
qright_trigger[point] =
center + QPointF(-left_trigger_x * size - offset,
- left_trigger_y * size + (right_pressed ? 0.5f : 0));
+ left_trigger_y * size + (right_pressed.value ? 0.5f : 0));
}
// Left trigger
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Right trigger
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
}
-void PlayerControlPreview::DrawDualTriggersTopView(QPainter& p, const QPointF center,
- bool left_pressed, bool right_pressed) {
+void PlayerControlPreview::DrawDualTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joystick_L_topview.size() / 2> qleft_trigger;
std::array<QPointF, left_joystick_L_topview.size() / 2> qright_trigger;
constexpr float size = 0.9f;
@@ -2080,9 +2106,9 @@ void PlayerControlPreview::DrawDualTriggersTopView(QPainter& p, const QPointF ce
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
// Draw L text
@@ -2096,8 +2122,9 @@ void PlayerControlPreview::DrawDualTriggersTopView(QPainter& p, const QPointF ce
DrawSymbol(p, center + QPointF(177, -84), Symbol::R, 1.0f);
}
-void PlayerControlPreview::DrawDualZTriggersTopView(QPainter& p, const QPointF center,
- bool left_pressed, bool right_pressed) {
+void PlayerControlPreview::DrawDualZTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joystick_ZL_topview.size() / 2> qleft_trigger;
std::array<QPointF, left_joystick_ZL_topview.size() / 2> qright_trigger;
constexpr float size = 0.9f;
@@ -2114,9 +2141,9 @@ void PlayerControlPreview::DrawDualZTriggersTopView(QPainter& p, const QPointF c
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
// Draw ZL text
@@ -2130,7 +2157,8 @@ void PlayerControlPreview::DrawDualZTriggersTopView(QPainter& p, const QPointF c
DrawSymbol(p, center + QPointF(180, -113), Symbol::ZR, 1.0f);
}
-void PlayerControlPreview::DrawLeftTriggers(QPainter& p, const QPointF center, bool left_pressed) {
+void PlayerControlPreview::DrawLeftTriggers(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& left_pressed) {
std::array<QPointF, left_joycon_trigger.size() / 2> qleft_trigger;
constexpr float size = 1.78f;
constexpr float offset = 311.5f;
@@ -2138,15 +2166,16 @@ void PlayerControlPreview::DrawLeftTriggers(QPainter& p, const QPointF center, b
for (std::size_t point = 0; point < left_joycon_trigger.size() / 2; ++point) {
qleft_trigger[point] = center + QPointF(left_joycon_trigger[point * 2] * size + offset,
left_joycon_trigger[point * 2 + 1] * size -
- (left_pressed ? 0.5f : 1.0f));
+ (left_pressed.value ? 0.5f : 1.0f));
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
}
-void PlayerControlPreview::DrawLeftZTriggers(QPainter& p, const QPointF center, bool left_pressed) {
+void PlayerControlPreview::DrawLeftZTriggers(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& left_pressed) {
std::array<QPointF, left_joycon_sideview_zl.size() / 2> qleft_trigger;
constexpr float size = 1.1115f;
constexpr float offset2 = 335;
@@ -2154,18 +2183,18 @@ void PlayerControlPreview::DrawLeftZTriggers(QPainter& p, const QPointF center,
for (std::size_t point = 0; point < left_joycon_sideview_zl.size() / 2; ++point) {
qleft_trigger[point] = center + QPointF(left_joycon_sideview_zl[point * 2] * size + offset2,
left_joycon_sideview_zl[point * 2 + 1] * size +
- (left_pressed ? 1.5f : 1.0f));
+ (left_pressed.value ? 1.5f : 1.0f));
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
- p.drawArc(center.x() + 158, center.y() + (left_pressed ? -203.5f : -204.0f), 77, 77, 225 * 16,
- 44 * 16);
+ p.drawArc(center.x() + 158, center.y() + (left_pressed.value ? -203.5f : -204.0f), 77, 77,
+ 225 * 16, 44 * 16);
}
-void PlayerControlPreview::DrawLeftTriggersTopView(QPainter& p, const QPointF center,
- bool left_pressed) {
+void PlayerControlPreview::DrawLeftTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& left_pressed) {
std::array<QPointF, left_joystick_L_topview.size() / 2> qleft_trigger;
for (std::size_t point = 0; point < left_joystick_L_topview.size() / 2; ++point) {
@@ -2174,7 +2203,7 @@ void PlayerControlPreview::DrawLeftTriggersTopView(QPainter& p, const QPointF ce
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Draw L text
@@ -2183,8 +2212,8 @@ void PlayerControlPreview::DrawLeftTriggersTopView(QPainter& p, const QPointF ce
DrawSymbol(p, center + QPointF(-143, -36), Symbol::L, 1.0f);
}
-void PlayerControlPreview::DrawLeftZTriggersTopView(QPainter& p, const QPointF center,
- bool left_pressed) {
+void PlayerControlPreview::DrawLeftZTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& left_pressed) {
std::array<QPointF, left_joystick_ZL_topview.size() / 2> qleft_trigger;
for (std::size_t point = 0; point < left_joystick_ZL_topview.size() / 2; ++point) {
@@ -2193,7 +2222,7 @@ void PlayerControlPreview::DrawLeftZTriggersTopView(QPainter& p, const QPointF c
}
p.setPen(colors.outline);
- p.setBrush(left_pressed ? colors.highlight : colors.button);
+ p.setBrush(left_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qleft_trigger);
// Draw ZL text
@@ -2203,7 +2232,7 @@ void PlayerControlPreview::DrawLeftZTriggersTopView(QPainter& p, const QPointF c
}
void PlayerControlPreview::DrawRightTriggers(QPainter& p, const QPointF center,
- bool right_pressed) {
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joycon_trigger.size() / 2> qright_trigger;
constexpr float size = 1.78f;
constexpr float offset = 311.5f;
@@ -2211,36 +2240,36 @@ void PlayerControlPreview::DrawRightTriggers(QPainter& p, const QPointF center,
for (std::size_t point = 0; point < left_joycon_trigger.size() / 2; ++point) {
qright_trigger[point] = center + QPointF(-left_joycon_trigger[point * 2] * size - offset,
left_joycon_trigger[point * 2 + 1] * size -
- (right_pressed ? 0.5f : 1.0f));
+ (right_pressed.value ? 0.5f : 1.0f));
}
p.setPen(colors.outline);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
}
void PlayerControlPreview::DrawRightZTriggers(QPainter& p, const QPointF center,
- bool right_pressed) {
+ const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joycon_sideview_zl.size() / 2> qright_trigger;
constexpr float size = 1.1115f;
constexpr float offset2 = 335;
for (std::size_t point = 0; point < left_joycon_sideview_zl.size() / 2; ++point) {
qright_trigger[point] =
- center +
- QPointF(-left_joycon_sideview_zl[point * 2] * size - offset2,
- left_joycon_sideview_zl[point * 2 + 1] * size + (right_pressed ? 0.5f : 0) + 1);
+ center + QPointF(-left_joycon_sideview_zl[point * 2] * size - offset2,
+ left_joycon_sideview_zl[point * 2 + 1] * size +
+ (right_pressed.value ? 0.5f : 0) + 1);
}
p.setPen(colors.outline);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
- p.drawArc(center.x() - 236, center.y() + (right_pressed ? -203.5f : -204.0f), 77, 77, 271 * 16,
- 44 * 16);
+ p.drawArc(center.x() - 236, center.y() + (right_pressed.value ? -203.5f : -204.0f), 77, 77,
+ 271 * 16, 44 * 16);
}
-void PlayerControlPreview::DrawRightTriggersTopView(QPainter& p, const QPointF center,
- bool right_pressed) {
+void PlayerControlPreview::DrawRightTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joystick_L_topview.size() / 2> qright_trigger;
for (std::size_t point = 0; point < left_joystick_L_topview.size() / 2; ++point) {
@@ -2249,7 +2278,7 @@ void PlayerControlPreview::DrawRightTriggersTopView(QPainter& p, const QPointF c
}
p.setPen(colors.outline);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
// Draw R text
@@ -2258,8 +2287,8 @@ void PlayerControlPreview::DrawRightTriggersTopView(QPainter& p, const QPointF c
DrawSymbol(p, center + QPointF(137, -36), Symbol::R, 1.0f);
}
-void PlayerControlPreview::DrawRightZTriggersTopView(QPainter& p, const QPointF center,
- bool right_pressed) {
+void PlayerControlPreview::DrawRightZTriggersTopView(
+ QPainter& p, const QPointF center, const Common::Input::ButtonStatus& right_pressed) {
std::array<QPointF, left_joystick_ZL_topview.size() / 2> qright_trigger;
for (std::size_t point = 0; point < left_joystick_ZL_topview.size() / 2; ++point) {
@@ -2268,7 +2297,7 @@ void PlayerControlPreview::DrawRightZTriggersTopView(QPainter& p, const QPointF
}
p.setPen(colors.outline);
- p.setBrush(right_pressed ? colors.highlight : colors.button);
+ p.setBrush(right_pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qright_trigger);
// Draw ZR text
@@ -2278,13 +2307,13 @@ void PlayerControlPreview::DrawRightZTriggersTopView(QPainter& p, const QPointF
}
void PlayerControlPreview::DrawJoystick(QPainter& p, const QPointF center, float size,
- bool pressed) {
+ const Common::Input::ButtonStatus& pressed) {
const float radius1 = 13.0f * size;
const float radius2 = 9.0f * size;
// Outer circle
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawCircle(p, center, radius1);
// Cross
@@ -2292,17 +2321,18 @@ void PlayerControlPreview::DrawJoystick(QPainter& p, const QPointF center, float
p.drawLine(center - QPoint(0, radius1), center + QPoint(0, radius1));
// Inner circle
- p.setBrush(pressed ? colors.highlight2 : colors.button2);
+ p.setBrush(pressed.value ? colors.highlight2 : colors.button2);
DrawCircle(p, center, radius2);
}
void PlayerControlPreview::DrawJoystickSideview(QPainter& p, const QPointF center, float angle,
- float size, bool pressed) {
+ float size,
+ const Common::Input::ButtonStatus& pressed) {
QVector<QPointF> joystick;
joystick.reserve(static_cast<int>(left_joystick_sideview.size() / 2));
for (std::size_t point = 0; point < left_joystick_sideview.size() / 2; ++point) {
- joystick.append(QPointF(left_joystick_sideview[point * 2] * size + (pressed ? 1 : 0),
+ joystick.append(QPointF(left_joystick_sideview[point * 2] * size + (pressed.value ? 1 : 0),
left_joystick_sideview[point * 2 + 1] * size - 1));
}
@@ -2314,14 +2344,15 @@ void PlayerControlPreview::DrawJoystickSideview(QPainter& p, const QPointF cente
// Draw joystick
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
p.drawPolygon(p2);
p.drawLine(p2.at(1), p2.at(30));
p.drawLine(p2.at(32), p2.at(71));
}
void PlayerControlPreview::DrawProJoystick(QPainter& p, const QPointF center, const QPointF offset,
- float offset_scalar, bool pressed) {
+ float offset_scalar,
+ const Common::Input::ButtonStatus& pressed) {
const float radius1 = 24.0f;
const float radius2 = 17.0f;
@@ -2339,11 +2370,11 @@ void PlayerControlPreview::DrawProJoystick(QPainter& p, const QPointF center, co
// Outer circle
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
p.drawEllipse(QPointF(0, 0), radius1 * amplitude, radius1);
// Inner circle
- p.setBrush(pressed ? colors.highlight2 : colors.button2);
+ p.setBrush(pressed.value ? colors.highlight2 : colors.button2);
const float inner_offset =
(radius1 - radius2) * 0.4f * ((offset.x() == 0 && offset.y() < 0) ? -1.0f : 1.0f);
@@ -2355,14 +2386,15 @@ void PlayerControlPreview::DrawProJoystick(QPainter& p, const QPointF center, co
p.restore();
}
-void PlayerControlPreview::DrawGCJoystick(QPainter& p, const QPointF center, bool pressed) {
+void PlayerControlPreview::DrawGCJoystick(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed) {
// Outer circle
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawCircle(p, center, 26.0f);
// Inner circle
- p.setBrush(pressed ? colors.highlight2 : colors.button2);
+ p.setBrush(pressed.value ? colors.highlight2 : colors.button2);
DrawCircle(p, center, 19.0f);
p.setBrush(colors.transparent);
DrawCircle(p, center, 13.5f);
@@ -2371,31 +2403,29 @@ void PlayerControlPreview::DrawGCJoystick(QPainter& p, const QPointF center, boo
void PlayerControlPreview::DrawRawJoystick(QPainter& p, QPointF center_left, QPointF center_right) {
using namespace Settings::NativeAnalog;
- if (controller_type != Settings::ControllerType::LeftJoycon) {
- DrawJoystickProperties(p, center_right, axis_values[RStick].properties);
+ if (center_right != QPointF(0, 0)) {
+ DrawJoystickProperties(p, center_right, stick_values[RStick].x.properties);
p.setPen(colors.indicator);
p.setBrush(colors.indicator);
- DrawJoystickDot(p, center_right, axis_values[RStick].raw_value,
- axis_values[RStick].properties);
+ DrawJoystickDot(p, center_right, stick_values[RStick], true);
p.setPen(colors.indicator2);
p.setBrush(colors.indicator2);
- DrawJoystickDot(p, center_right, axis_values[RStick].value, axis_values[RStick].properties);
+ DrawJoystickDot(p, center_right, stick_values[RStick], false);
}
- if (controller_type != Settings::ControllerType::RightJoycon) {
- DrawJoystickProperties(p, center_left, axis_values[LStick].properties);
+ if (center_left != QPointF(0, 0)) {
+ DrawJoystickProperties(p, center_left, stick_values[LStick].x.properties);
p.setPen(colors.indicator);
p.setBrush(colors.indicator);
- DrawJoystickDot(p, center_left, axis_values[LStick].raw_value,
- axis_values[LStick].properties);
+ DrawJoystickDot(p, center_left, stick_values[LStick], true);
p.setPen(colors.indicator2);
p.setBrush(colors.indicator2);
- DrawJoystickDot(p, center_left, axis_values[LStick].value, axis_values[LStick].properties);
+ DrawJoystickDot(p, center_left, stick_values[LStick], false);
}
}
-void PlayerControlPreview::DrawJoystickProperties(QPainter& p, const QPointF center,
- const Input::AnalogProperties& properties) {
+void PlayerControlPreview::DrawJoystickProperties(
+ QPainter& p, const QPointF center, const Common::Input::AnalogProperties& properties) {
constexpr float size = 45.0f;
const float range = size * properties.range;
const float deadzone = size * properties.deadzone;
@@ -2414,19 +2444,26 @@ void PlayerControlPreview::DrawJoystickProperties(QPainter& p, const QPointF cen
DrawCircle(p, center, deadzone);
}
-void PlayerControlPreview::DrawJoystickDot(QPainter& p, const QPointF center, const QPointF value,
- const Input::AnalogProperties& properties) {
+void PlayerControlPreview::DrawJoystickDot(QPainter& p, const QPointF center,
+ const Common::Input::StickStatus& stick, bool raw) {
constexpr float size = 45.0f;
- const float range = size * properties.range;
+ const float range = size * stick.x.properties.range;
- // Dot pointer
- DrawCircle(p, center + (value * range), 2);
+ if (raw) {
+ const QPointF value = QPointF(stick.x.raw_value, stick.y.raw_value) * size;
+ DrawCircle(p, center + value, 2);
+ return;
+ }
+
+ const QPointF value = QPointF(stick.x.value, stick.y.value) * range;
+ DrawCircle(p, center + value, 2);
}
-void PlayerControlPreview::DrawRoundButton(QPainter& p, QPointF center, bool pressed, float width,
+void PlayerControlPreview::DrawRoundButton(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& pressed, float width,
float height, Direction direction, float radius) {
p.setBrush(button_color);
- if (pressed) {
+ if (pressed.value) {
switch (direction) {
case Direction::Left:
center.setX(center.x() - 1);
@@ -2448,17 +2485,19 @@ void PlayerControlPreview::DrawRoundButton(QPainter& p, QPointF center, bool pre
QRectF rect = {center.x() - width, center.y() - height, width * 2.0f, height * 2.0f};
p.drawRoundedRect(rect, radius, radius);
}
-void PlayerControlPreview::DrawMinusButton(QPainter& p, const QPointF center, bool pressed,
+void PlayerControlPreview::DrawMinusButton(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed,
int button_size) {
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawRectangle(p, center, button_size, button_size / 3.0f);
}
-void PlayerControlPreview::DrawPlusButton(QPainter& p, const QPointF center, bool pressed,
+void PlayerControlPreview::DrawPlusButton(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed,
int button_size) {
// Draw outer line
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawRectangle(p, center, button_size, button_size / 3.0f);
DrawRectangle(p, center, button_size / 3.0f, button_size);
@@ -2471,7 +2510,8 @@ void PlayerControlPreview::DrawPlusButton(QPainter& p, const QPointF center, boo
DrawRectangle(p, center, button_size / 3.0f, button_size);
}
-void PlayerControlPreview::DrawGCButtonX(QPainter& p, const QPointF center, bool pressed) {
+void PlayerControlPreview::DrawGCButtonX(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed) {
std::array<QPointF, gc_button_x.size() / 2> button_x;
for (std::size_t point = 0; point < gc_button_x.size() / 2; ++point) {
@@ -2479,11 +2519,12 @@ void PlayerControlPreview::DrawGCButtonX(QPainter& p, const QPointF center, bool
}
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, button_x);
}
-void PlayerControlPreview::DrawGCButtonY(QPainter& p, const QPointF center, bool pressed) {
+void PlayerControlPreview::DrawGCButtonY(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed) {
std::array<QPointF, gc_button_y.size() / 2> button_x;
for (std::size_t point = 0; point < gc_button_y.size() / 2; ++point) {
@@ -2491,27 +2532,29 @@ void PlayerControlPreview::DrawGCButtonY(QPainter& p, const QPointF center, bool
}
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, button_x);
}
-void PlayerControlPreview::DrawGCButtonZ(QPainter& p, const QPointF center, bool pressed) {
+void PlayerControlPreview::DrawGCButtonZ(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed) {
std::array<QPointF, gc_button_z.size() / 2> button_x;
for (std::size_t point = 0; point < gc_button_z.size() / 2; ++point) {
button_x[point] = center + QPointF(gc_button_z[point * 2],
- gc_button_z[point * 2 + 1] + (pressed ? 1 : 0));
+ gc_button_z[point * 2 + 1] + (pressed.value ? 1 : 0));
}
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button2);
+ p.setBrush(pressed.value ? colors.highlight : colors.button2);
DrawPolygon(p, button_x);
}
-void PlayerControlPreview::DrawCircleButton(QPainter& p, const QPointF center, bool pressed,
+void PlayerControlPreview::DrawCircleButton(QPainter& p, const QPointF center,
+ const Common::Input::ButtonStatus& pressed,
float button_size) {
p.setBrush(button_color);
- if (pressed) {
+ if (pressed.value) {
p.setBrush(colors.highlight);
}
p.drawEllipse(center, button_size, button_size);
@@ -2540,7 +2583,8 @@ void PlayerControlPreview::DrawArrowButtonOutline(QPainter& p, const QPointF cen
}
void PlayerControlPreview::DrawArrowButton(QPainter& p, const QPointF center,
- const Direction direction, bool pressed, float size) {
+ const Direction direction,
+ const Common::Input::ButtonStatus& pressed, float size) {
std::array<QPointF, up_arrow_button.size() / 2> arrow_button;
QPoint offset;
@@ -2552,38 +2596,39 @@ void PlayerControlPreview::DrawArrowButton(QPainter& p, const QPointF center,
case Direction::Up:
arrow_button[point] = center + QPointF(up_arrow_x * size, up_arrow_y * size);
break;
- case Direction::Left:
- arrow_button[point] = center + QPointF(up_arrow_y * size, up_arrow_x * size);
- break;
case Direction::Right:
arrow_button[point] = center + QPointF(-up_arrow_y * size, up_arrow_x * size);
break;
case Direction::Down:
arrow_button[point] = center + QPointF(up_arrow_x * size, -up_arrow_y * size);
break;
+ case Direction::Left:
+ // Compiler doesn't optimize this correctly check why
+ arrow_button[point] = center + QPointF(up_arrow_y * size, up_arrow_x * size);
+ break;
case Direction::None:
break;
}
}
// Draw arrow button
- p.setPen(pressed ? colors.highlight : colors.button);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setPen(pressed.value ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, arrow_button);
switch (direction) {
case Direction::Up:
offset = QPoint(0, -20 * size);
break;
- case Direction::Left:
- offset = QPoint(-20 * size, 0);
- break;
case Direction::Right:
offset = QPoint(20 * size, 0);
break;
case Direction::Down:
offset = QPoint(0, 20 * size);
break;
+ case Direction::Left:
+ offset = QPoint(-20 * size, 0);
+ break;
case Direction::None:
offset = QPoint(0, 0);
break;
@@ -2596,7 +2641,8 @@ void PlayerControlPreview::DrawArrowButton(QPainter& p, const QPointF center,
}
void PlayerControlPreview::DrawTriggerButton(QPainter& p, const QPointF center,
- const Direction direction, bool pressed) {
+ const Direction direction,
+ const Common::Input::ButtonStatus& pressed) {
std::array<QPointF, trigger_button.size() / 2> qtrigger_button;
for (std::size_t point = 0; point < trigger_button.size() / 2; ++point) {
@@ -2619,10 +2665,51 @@ void PlayerControlPreview::DrawTriggerButton(QPainter& p, const QPointF center,
// Draw arrow button
p.setPen(colors.outline);
- p.setBrush(pressed ? colors.highlight : colors.button);
+ p.setBrush(pressed.value ? colors.highlight : colors.button);
DrawPolygon(p, qtrigger_button);
}
+void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center,
+ Common::Input::BatteryLevel battery) {
+ if (battery == Common::Input::BatteryLevel::None) {
+ return;
+ }
+ p.setPen(colors.outline);
+ p.setBrush(colors.transparent);
+ p.drawRect(center.x(), center.y(), 56, 20);
+ p.drawRect(center.x() + 56, center.y() + 6, 3, 8);
+ p.setBrush(colors.deadzone);
+ switch (battery) {
+ case Common::Input::BatteryLevel::Charging:
+ p.setBrush(colors.indicator2);
+ p.drawText(center + QPoint(2, 14), tr("Charging"));
+ break;
+ case Common::Input::BatteryLevel::Full:
+ p.drawRect(center.x() + 42, center.y(), 14, 20);
+ p.drawRect(center.x() + 28, center.y(), 14, 20);
+ p.drawRect(center.x() + 14, center.y(), 14, 20);
+ p.drawRect(center.x(), center.y(), 14, 20);
+ break;
+ case Common::Input::BatteryLevel::Medium:
+ p.drawRect(center.x() + 28, center.y(), 14, 20);
+ p.drawRect(center.x() + 14, center.y(), 14, 20);
+ p.drawRect(center.x(), center.y(), 14, 20);
+ break;
+ case Common::Input::BatteryLevel::Low:
+ p.drawRect(center.x() + 14, center.y(), 14, 20);
+ p.drawRect(center.x(), center.y(), 14, 20);
+ break;
+ case Common::Input::BatteryLevel::Critical:
+ p.drawRect(center.x(), center.y(), 14, 20);
+ break;
+ case Common::Input::BatteryLevel::Empty:
+ p.drawRect(center.x(), center.y(), 5, 20);
+ break;
+ default:
+ break;
+ }
+}
+
void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol symbol,
float icon_size) {
std::array<QPointF, house.size() / 2> house_icon;
diff --git a/src/yuzu/configuration/configure_input_player_widget.h b/src/yuzu/configuration/configure_input_player_widget.h
index f4bbfa528..4cd5c3be0 100644
--- a/src/yuzu/configuration/configure_input_player_widget.h
+++ b/src/yuzu/configuration/configure_input_player_widget.h
@@ -7,9 +7,11 @@
#include <array>
#include <QFrame>
#include <QPointer>
-#include "common/settings.h"
-#include "core/frontend/input.h"
-#include "yuzu/debugger/controller.h"
+
+#include "common/input.h"
+#include "common/settings_input.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_types.h"
class QLabel;
@@ -24,17 +26,26 @@ public:
explicit PlayerControlPreview(QWidget* parent);
~PlayerControlPreview() override;
- void SetPlayerInput(std::size_t index, const ButtonParam& buttons_param,
- const AnalogParam& analogs_param);
- void SetPlayerInputRaw(std::size_t index, const Settings::ButtonsRaw& buttons_,
- Settings::AnalogsRaw analogs_);
- void SetConnectedStatus(bool checked);
- void SetControllerType(Settings::ControllerType type);
+ // Sets the emulated controller to be displayed
+ void SetController(Core::HID::EmulatedController* controller);
+
+ // Disables events from the emulated controller
+ void UnloadController();
+
+ // Starts blinking animation at the button specified
void BeginMappingButton(std::size_t button_id);
- void BeginMappingAnalog(std::size_t button_id);
+
+ // Starts moving animation at the stick specified
+ void BeginMappingAnalog(std::size_t stick_id);
+
+ // Stops any ongoing animation
void EndMapping();
+
+ // Handles emulated controller events
+ void ControllerUpdate(Core::HID::ControllerTriggerType type);
+
+ // Updates input on sheduled interval
void UpdateInput();
- void SetCallBack(ControllerCallback callback_);
protected:
void paintEvent(QPaintEvent* event) override;
@@ -63,22 +74,6 @@ private:
SR,
};
- struct AxisValue {
- QPointF value{};
- QPointF raw_value{};
- Input::AnalogProperties properties{};
- int size{};
- QPoint offset{};
- bool active{};
- };
-
- struct LedPattern {
- bool position1;
- bool position2;
- bool position3;
- bool position4;
- };
-
struct ColorMapping {
QColor outline{};
QColor primary{};
@@ -101,7 +96,6 @@ private:
QColor deadzone{};
};
- static LedPattern GetColorPattern(std::size_t index, bool player_on);
void UpdateColors();
void ResetInputs();
@@ -122,47 +116,75 @@ private:
void DrawGCBody(QPainter& p, QPointF center);
// Draw triggers functions
- void DrawProTriggers(QPainter& p, QPointF center, bool left_pressed, bool right_pressed);
- void DrawGCTriggers(QPainter& p, QPointF center, bool left_pressed, bool right_pressed);
- void DrawHandheldTriggers(QPainter& p, QPointF center, bool left_pressed, bool right_pressed);
- void DrawDualTriggers(QPainter& p, QPointF center, bool left_pressed, bool right_pressed);
- void DrawDualTriggersTopView(QPainter& p, QPointF center, bool left_pressed,
- bool right_pressed);
- void DrawDualZTriggersTopView(QPainter& p, QPointF center, bool left_pressed,
- bool right_pressed);
- void DrawLeftTriggers(QPainter& p, QPointF center, bool left_pressed);
- void DrawLeftZTriggers(QPainter& p, QPointF center, bool left_pressed);
- void DrawLeftTriggersTopView(QPainter& p, QPointF center, bool left_pressed);
- void DrawLeftZTriggersTopView(QPainter& p, QPointF center, bool left_pressed);
- void DrawRightTriggers(QPainter& p, QPointF center, bool right_pressed);
- void DrawRightZTriggers(QPainter& p, QPointF center, bool right_pressed);
- void DrawRightTriggersTopView(QPainter& p, QPointF center, bool right_pressed);
- void DrawRightZTriggersTopView(QPainter& p, QPointF center, bool right_pressed);
+ void DrawProTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawGCTriggers(QPainter& p, QPointF center, Common::Input::TriggerStatus left_trigger,
+ Common::Input::TriggerStatus right_trigger);
+ void DrawHandheldTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawDualTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawDualTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawDualZTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawLeftTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed);
+ void DrawLeftZTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed);
+ void DrawLeftTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed);
+ void DrawLeftZTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& left_pressed);
+ void DrawRightTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawRightZTriggers(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawRightTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& right_pressed);
+ void DrawRightZTriggersTopView(QPainter& p, QPointF center,
+ const Common::Input::ButtonStatus& right_pressed);
// Draw joystick functions
- void DrawJoystick(QPainter& p, QPointF center, float size, bool pressed);
- void DrawJoystickSideview(QPainter& p, QPointF center, float angle, float size, bool pressed);
+ void DrawJoystick(QPainter& p, QPointF center, float size,
+ const Common::Input::ButtonStatus& pressed);
+ void DrawJoystickSideview(QPainter& p, QPointF center, float angle, float size,
+ const Common::Input::ButtonStatus& pressed);
void DrawRawJoystick(QPainter& p, QPointF center_left, QPointF center_right);
void DrawJoystickProperties(QPainter& p, QPointF center,
- const Input::AnalogProperties& properties);
- void DrawJoystickDot(QPainter& p, QPointF center, QPointF value,
- const Input::AnalogProperties& properties);
- void DrawProJoystick(QPainter& p, QPointF center, QPointF offset, float scalar, bool pressed);
- void DrawGCJoystick(QPainter& p, QPointF center, bool pressed);
+ const Common::Input::AnalogProperties& properties);
+ void DrawJoystickDot(QPainter& p, QPointF center, const Common::Input::StickStatus& stick,
+ bool raw);
+ void DrawProJoystick(QPainter& p, QPointF center, QPointF offset, float scalar,
+ const Common::Input::ButtonStatus& pressed);
+ void DrawGCJoystick(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed);
// Draw button functions
- void DrawCircleButton(QPainter& p, QPointF center, bool pressed, float button_size);
- void DrawRoundButton(QPainter& p, QPointF center, bool pressed, float width, float height,
- Direction direction = Direction::None, float radius = 2);
- void DrawMinusButton(QPainter& p, QPointF center, bool pressed, int button_size);
- void DrawPlusButton(QPainter& p, QPointF center, bool pressed, int button_size);
- void DrawGCButtonX(QPainter& p, QPointF center, bool pressed);
- void DrawGCButtonY(QPainter& p, QPointF center, bool pressed);
- void DrawGCButtonZ(QPainter& p, QPointF center, bool pressed);
+ void DrawCircleButton(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed,
+ float button_size);
+ void DrawRoundButton(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed,
+ float width, float height, Direction direction = Direction::None,
+ float radius = 2);
+ void DrawMinusButton(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed,
+ int button_size);
+ void DrawPlusButton(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed,
+ int button_size);
+ void DrawGCButtonX(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed);
+ void DrawGCButtonY(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed);
+ void DrawGCButtonZ(QPainter& p, QPointF center, const Common::Input::ButtonStatus& pressed);
void DrawArrowButtonOutline(QPainter& p, const QPointF center, float size = 1.0f);
- void DrawArrowButton(QPainter& p, QPointF center, Direction direction, bool pressed,
- float size = 1.0f);
- void DrawTriggerButton(QPainter& p, QPointF center, Direction direction, bool pressed);
+ void DrawArrowButton(QPainter& p, QPointF center, Direction direction,
+ const Common::Input::ButtonStatus& pressed, float size = 1.0f);
+ void DrawTriggerButton(QPainter& p, QPointF center, Direction direction,
+ const Common::Input::ButtonStatus& pressed);
+
+ // Draw battery functions
+ void DrawBattery(QPainter& p, QPointF center, Common::Input::BatteryLevel battery);
// Draw icon functions
void DrawSymbol(QPainter& p, QPointF center, Symbol symbol, float icon_size);
@@ -178,24 +200,23 @@ private:
void SetTextFont(QPainter& p, float text_size,
const QString& font_family = QStringLiteral("sans-serif"));
- using ButtonArray =
- std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::BUTTON_NS_END>;
- using StickArray =
- std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>;
+ bool is_controller_set{};
+ bool is_connected{};
+ bool needs_redraw{};
+ Core::HID::NpadStyleIndex controller_type;
- ControllerCallback controller_callback;
- bool is_enabled{};
bool mapping_active{};
int blink_counter{};
+ int callback_key;
QColor button_color{};
ColorMapping colors{};
- std::array<QColor, 4> led_color{};
- ButtonArray buttons{};
- StickArray sticks{};
+ Core::HID::LedPattern led_pattern{0, 0, 0, 0};
std::size_t player_index{};
- std::size_t button_mapping_index{Settings::NativeButton::BUTTON_NS_END};
- std::size_t analog_mapping_index{Settings::NativeAnalog::NUM_STICKS_HID};
- std::array<AxisValue, Settings::NativeAnalog::NUM_STICKS_HID> axis_values{};
- std::array<bool, Settings::NativeButton::NumButtons> button_values{};
- Settings::ControllerType controller_type{Settings::ControllerType::ProController};
+ Core::HID::EmulatedController* controller;
+ std::size_t button_mapping_index{Settings::NativeButton::NumButtons};
+ std::size_t analog_mapping_index{Settings::NativeAnalog::NumAnalogs};
+ Core::HID::ButtonValues button_values{};
+ Core::HID::SticksValues stick_values{};
+ Core::HID::TriggerValues trigger_values{};
+ Core::HID::BatteryValues battery_values{};
};
diff --git a/src/yuzu/configuration/configure_input_profile_dialog.cpp b/src/yuzu/configuration/configure_input_profile_dialog.cpp
index cd5a88cea..17bbe6b61 100644
--- a/src/yuzu/configuration/configure_input_profile_dialog.cpp
+++ b/src/yuzu/configuration/configure_input_profile_dialog.cpp
@@ -11,8 +11,8 @@ ConfigureInputProfileDialog::ConfigureInputProfileDialog(
QWidget* parent, InputCommon::InputSubsystem* input_subsystem, InputProfiles* profiles,
Core::System& system)
: QDialog(parent), ui(std::make_unique<Ui::ConfigureInputProfileDialog>()),
- profile_widget(
- new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, system, false)) {
+ profile_widget(new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles,
+ system.HIDCore(), system.IsPoweredOn(), false)) {
ui->setupUi(this);
ui->controllerLayout->addWidget(profile_widget);
diff --git a/src/yuzu/configuration/configure_motion_touch.cpp b/src/yuzu/configuration/configure_motion_touch.cpp
index f8e08c422..8539a5c8b 100644
--- a/src/yuzu/configuration/configure_motion_touch.cpp
+++ b/src/yuzu/configuration/configure_motion_touch.cpp
@@ -15,9 +15,9 @@
#include "common/logging/log.h"
#include "common/settings.h"
+#include "input_common/drivers/udp_client.h"
+#include "input_common/helpers/udp_protocol.h"
#include "input_common/main.h"
-#include "input_common/udp/client.h"
-#include "input_common/udp/udp.h"
#include "ui_configure_motion_touch.h"
#include "yuzu/configuration/configure_motion_touch.h"
#include "yuzu/configuration/configure_touch_from_button.h"
@@ -93,6 +93,7 @@ ConfigureMotionTouch::ConfigureMotionTouch(QWidget* parent,
"using-a-controller-or-android-phone-for-motion-or-touch-input'><span "
"style=\"text-decoration: underline; color:#039be5;\">Learn More</span></a>"));
+ setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
SetConfiguration();
UpdateUiDisplay();
ConnectEvents();
@@ -101,17 +102,14 @@ ConfigureMotionTouch::ConfigureMotionTouch(QWidget* parent,
ConfigureMotionTouch::~ConfigureMotionTouch() = default;
void ConfigureMotionTouch::SetConfiguration() {
- const Common::ParamPackage motion_param(Settings::values.motion_device.GetValue());
const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue());
- ui->touch_from_button_checkbox->setChecked(Settings::values.use_touch_from_button.GetValue());
touch_from_button_maps = Settings::values.touch_from_button_maps;
for (const auto& touch_map : touch_from_button_maps) {
ui->touch_from_button_map->addItem(QString::fromStdString(touch_map.name));
}
ui->touch_from_button_map->setCurrentIndex(
Settings::values.touch_from_button_map_index.GetValue());
- ui->motion_sensitivity->setValue(motion_param.Get("sensitivity", 0.01f));
min_x = touch_param.Get("min_x", 100);
min_y = touch_param.Get("min_y", 50);
@@ -139,9 +137,6 @@ void ConfigureMotionTouch::SetConfiguration() {
void ConfigureMotionTouch::UpdateUiDisplay() {
const QString cemuhook_udp = QStringLiteral("cemuhookudp");
- ui->motion_sensitivity_label->setVisible(true);
- ui->motion_sensitivity->setVisible(true);
-
ui->touch_calibration->setVisible(true);
ui->touch_calibration_config->setVisible(true);
ui->touch_calibration_label->setVisible(true);
@@ -312,7 +307,6 @@ void ConfigureMotionTouch::ApplyConfiguration() {
touch_param.Set("max_y", max_y);
Settings::values.touch_device = touch_param.Serialize();
- Settings::values.use_touch_from_button = ui->touch_from_button_checkbox->isChecked();
Settings::values.touch_from_button_map_index = ui->touch_from_button_map->currentIndex();
Settings::values.touch_from_button_maps = touch_from_button_maps;
Settings::values.udp_input_servers = GetUDPServerString();
diff --git a/src/yuzu/configuration/configure_motion_touch.ui b/src/yuzu/configuration/configure_motion_touch.ui
index 1e35ea946..c75a84ae4 100644
--- a/src/yuzu/configuration/configure_motion_touch.ui
+++ b/src/yuzu/configuration/configure_motion_touch.ui
@@ -2,14 +2,6 @@
<ui version="4.0">
<class>ConfigureMotionTouch</class>
<widget class="QDialog" name="ConfigureMotionTouch">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>500</width>
- <height>482</height>
- </rect>
- </property>
<property name="windowTitle">
<string>Configure Motion / Touch</string>
</property>
@@ -18,48 +10,6 @@
</property>
<layout class="QVBoxLayout">
<item>
- <widget class="QGroupBox" name="motion_group_box">
- <property name="title">
- <string>Mouse Motion</string>
- </property>
- <layout class="QVBoxLayout">
- <item>
- <layout class="QHBoxLayout">
- <item>
- <widget class="QLabel" name="motion_sensitivity_label">
- <property name="text">
- <string>Sensitivity:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QDoubleSpinBox" name="motion_sensitivity">
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="decimals">
- <number>4</number>
- </property>
- <property name="minimum">
- <double>0.010000000000000</double>
- </property>
- <property name="maximum">
- <double>10.000000000000000</double>
- </property>
- <property name="singleStep">
- <double>0.001000000000000</double>
- </property>
- <property name="value">
- <double>0.010000000000000</double>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item>
<widget class="QGroupBox" name="touch_group_box">
<property name="title">
<string>Touch</string>
@@ -101,19 +51,13 @@
</item>
<item>
<layout class="QHBoxLayout">
- <item>
- <widget class="QCheckBox" name="touch_from_button_checkbox">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Use button mapping:</string>
- </property>
- </widget>
- </item>
+ <item>
+ <widget class="QLabel" name="touch_from_button_label">
+ <property name="text">
+ <string>Touch from button profile:</string>
+ </property>
+ </widget>
+ </item>
<item>
<widget class="QComboBox" name="touch_from_button_map"/>
</item>
diff --git a/src/yuzu/configuration/configure_mouse_advanced.cpp b/src/yuzu/configuration/configure_mouse_advanced.cpp
deleted file mode 100644
index 2af3afda8..000000000
--- a/src/yuzu/configuration/configure_mouse_advanced.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#include <algorithm>
-#include <memory>
-
-#include <QKeyEvent>
-#include <QMenu>
-#include <QTimer>
-
-#include "common/assert.h"
-#include "common/param_package.h"
-#include "input_common/main.h"
-#include "ui_configure_mouse_advanced.h"
-#include "yuzu/configuration/config.h"
-#include "yuzu/configuration/configure_mouse_advanced.h"
-
-static QString GetKeyName(int key_code) {
- switch (key_code) {
- case Qt::LeftButton:
- return QObject::tr("Click 0");
- case Qt::RightButton:
- return QObject::tr("Click 1");
- case Qt::MiddleButton:
- return QObject::tr("Click 2");
- case Qt::BackButton:
- return QObject::tr("Click 3");
- case Qt::ForwardButton:
- return QObject::tr("Click 4");
- case Qt::Key_Shift:
- return QObject::tr("Shift");
- case Qt::Key_Control:
- return QObject::tr("Ctrl");
- case Qt::Key_Alt:
- return QObject::tr("Alt");
- case Qt::Key_Meta:
- return {};
- default:
- return QKeySequence(key_code).toString();
- }
-}
-
-static QString ButtonToText(const Common::ParamPackage& param) {
- if (!param.Has("engine")) {
- return QObject::tr("[not set]");
- }
-
- if (param.Get("engine", "") == "keyboard") {
- return GetKeyName(param.Get("code", 0));
- }
-
- if (param.Get("engine", "") == "sdl") {
- if (param.Has("hat")) {
- const QString hat_str = QString::fromStdString(param.Get("hat", ""));
- const QString direction_str = QString::fromStdString(param.Get("direction", ""));
-
- return QObject::tr("Hat %1 %2").arg(hat_str, direction_str);
- }
-
- if (param.Has("axis")) {
- const QString axis_str = QString::fromStdString(param.Get("axis", ""));
- const QString direction_str = QString::fromStdString(param.Get("direction", ""));
-
- return QObject::tr("Axis %1%2").arg(axis_str, direction_str);
- }
-
- if (param.Has("button")) {
- const QString button_str = QString::fromStdString(param.Get("button", ""));
-
- return QObject::tr("Button %1").arg(button_str);
- }
- return {};
- }
-
- return QObject::tr("[unknown]");
-}
-
-ConfigureMouseAdvanced::ConfigureMouseAdvanced(QWidget* parent,
- InputCommon::InputSubsystem* input_subsystem_)
- : QDialog(parent),
- ui(std::make_unique<Ui::ConfigureMouseAdvanced>()), input_subsystem{input_subsystem_},
- timeout_timer(std::make_unique<QTimer>()), poll_timer(std::make_unique<QTimer>()) {
- ui->setupUi(this);
- setFocusPolicy(Qt::ClickFocus);
-
- button_map = {
- ui->left_button, ui->right_button, ui->middle_button, ui->forward_button, ui->back_button,
- };
-
- for (int button_id = 0; button_id < Settings::NativeMouseButton::NumMouseButtons; button_id++) {
- auto* const button = button_map[button_id];
- if (button == nullptr) {
- continue;
- }
-
- button->setContextMenuPolicy(Qt::CustomContextMenu);
- connect(button, &QPushButton::clicked, [=, this] {
- HandleClick(
- button_map[button_id],
- [=, this](const Common::ParamPackage& params) {
- buttons_param[button_id] = params;
- },
- InputCommon::Polling::DeviceType::Button);
- });
- connect(button, &QPushButton::customContextMenuRequested,
- [=, this](const QPoint& menu_location) {
- QMenu context_menu;
- context_menu.addAction(tr("Clear"), [&] {
- buttons_param[button_id].Clear();
- button_map[button_id]->setText(tr("[not set]"));
- });
- context_menu.addAction(tr("Restore Default"), [&] {
- buttons_param[button_id] =
- Common::ParamPackage{InputCommon::GenerateKeyboardParam(
- Config::default_mouse_buttons[button_id])};
- button_map[button_id]->setText(ButtonToText(buttons_param[button_id]));
- });
- context_menu.exec(button_map[button_id]->mapToGlobal(menu_location));
- });
- }
-
- connect(ui->buttonClearAll, &QPushButton::clicked, [this] { ClearAll(); });
- connect(ui->buttonRestoreDefaults, &QPushButton::clicked, [this] { RestoreDefaults(); });
-
- timeout_timer->setSingleShot(true);
- connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); });
-
- connect(poll_timer.get(), &QTimer::timeout, [this] {
- Common::ParamPackage params;
- for (auto& poller : device_pollers) {
- params = poller->GetNextInput();
- if (params.Has("engine")) {
- SetPollingResult(params, false);
- return;
- }
- }
- });
-
- LoadConfiguration();
- resize(0, 0);
-}
-
-ConfigureMouseAdvanced::~ConfigureMouseAdvanced() = default;
-
-void ConfigureMouseAdvanced::ApplyConfiguration() {
- std::transform(buttons_param.begin(), buttons_param.end(),
- Settings::values.mouse_buttons.begin(),
- [](const Common::ParamPackage& param) { return param.Serialize(); });
-}
-
-void ConfigureMouseAdvanced::LoadConfiguration() {
- std::transform(Settings::values.mouse_buttons.begin(), Settings::values.mouse_buttons.end(),
- buttons_param.begin(),
- [](const std::string& str) { return Common::ParamPackage(str); });
- UpdateButtonLabels();
-}
-
-void ConfigureMouseAdvanced::changeEvent(QEvent* event) {
- if (event->type() == QEvent::LanguageChange) {
- RetranslateUI();
- }
-
- QDialog::changeEvent(event);
-}
-
-void ConfigureMouseAdvanced::RetranslateUI() {
- ui->retranslateUi(this);
-}
-
-void ConfigureMouseAdvanced::RestoreDefaults() {
- for (int button_id = 0; button_id < Settings::NativeMouseButton::NumMouseButtons; button_id++) {
- buttons_param[button_id] = Common::ParamPackage{
- InputCommon::GenerateKeyboardParam(Config::default_mouse_buttons[button_id])};
- }
-
- UpdateButtonLabels();
-}
-
-void ConfigureMouseAdvanced::ClearAll() {
- for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
- const auto* const button = button_map[i];
- if (button != nullptr && button->isEnabled()) {
- buttons_param[i].Clear();
- }
- }
-
- UpdateButtonLabels();
-}
-
-void ConfigureMouseAdvanced::UpdateButtonLabels() {
- for (int button = 0; button < Settings::NativeMouseButton::NumMouseButtons; button++) {
- button_map[button]->setText(ButtonToText(buttons_param[button]));
- }
-}
-
-void ConfigureMouseAdvanced::HandleClick(
- QPushButton* button, std::function<void(const Common::ParamPackage&)> new_input_setter,
- InputCommon::Polling::DeviceType type) {
- button->setText(tr("[press key]"));
- button->setFocus();
-
- // Keyboard keys or mouse buttons can only be used as button devices
- want_keyboard_mouse = type == InputCommon::Polling::DeviceType::Button;
- if (want_keyboard_mouse) {
- const auto iter = std::find(button_map.begin(), button_map.end(), button);
- ASSERT(iter != button_map.end());
- const auto index = std::distance(button_map.begin(), iter);
- ASSERT(index < Settings::NativeButton::NumButtons && index >= 0);
- }
-
- input_setter = new_input_setter;
-
- device_pollers = input_subsystem->GetPollers(type);
-
- for (auto& poller : device_pollers) {
- poller->Start();
- }
-
- QWidget::grabMouse();
- QWidget::grabKeyboard();
-
- timeout_timer->start(2500); // Cancel after 2.5 seconds
- poll_timer->start(50); // Check for new inputs every 50ms
-}
-
-void ConfigureMouseAdvanced::SetPollingResult(const Common::ParamPackage& params, bool abort) {
- timeout_timer->stop();
- poll_timer->stop();
- for (auto& poller : device_pollers) {
- poller->Stop();
- }
-
- QWidget::releaseMouse();
- QWidget::releaseKeyboard();
-
- if (!abort) {
- (*input_setter)(params);
- }
-
- UpdateButtonLabels();
- input_setter = std::nullopt;
-}
-
-void ConfigureMouseAdvanced::mousePressEvent(QMouseEvent* event) {
- if (!input_setter || !event) {
- return;
- }
-
- if (want_keyboard_mouse) {
- SetPollingResult(Common::ParamPackage{InputCommon::GenerateKeyboardParam(event->button())},
- false);
- } else {
- // We don't want any mouse buttons, so don't stop polling
- return;
- }
-
- SetPollingResult({}, true);
-}
-
-void ConfigureMouseAdvanced::keyPressEvent(QKeyEvent* event) {
- if (!input_setter || !event) {
- return;
- }
-
- if (event->key() != Qt::Key_Escape) {
- if (want_keyboard_mouse) {
- SetPollingResult(Common::ParamPackage{InputCommon::GenerateKeyboardParam(event->key())},
- false);
- } else {
- // Escape key wasn't pressed and we don't want any keyboard keys, so don't stop polling
- return;
- }
- }
- SetPollingResult({}, true);
-}
diff --git a/src/yuzu/configuration/configure_mouse_advanced.h b/src/yuzu/configuration/configure_mouse_advanced.h
deleted file mode 100644
index 65b6fca9a..000000000
--- a/src/yuzu/configuration/configure_mouse_advanced.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 Citra Emulator Project
-// Licensed under GPLv2 or any later version
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <memory>
-#include <optional>
-#include <QDialog>
-
-class QCheckBox;
-class QPushButton;
-class QTimer;
-
-namespace InputCommon {
-class InputSubsystem;
-}
-
-namespace Ui {
-class ConfigureMouseAdvanced;
-}
-
-class ConfigureMouseAdvanced : public QDialog {
- Q_OBJECT
-
-public:
- explicit ConfigureMouseAdvanced(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_);
- ~ConfigureMouseAdvanced() override;
-
- void ApplyConfiguration();
-
-private:
- void changeEvent(QEvent* event) override;
- void RetranslateUI();
-
- /// Load configuration settings.
- void LoadConfiguration();
- /// Restore all buttons to their default values.
- void RestoreDefaults();
- /// Clear all input configuration
- void ClearAll();
-
- /// Update UI to reflect current configuration.
- void UpdateButtonLabels();
-
- /// Called when the button was pressed.
- void HandleClick(QPushButton* button,
- std::function<void(const Common::ParamPackage&)> new_input_setter,
- InputCommon::Polling::DeviceType type);
-
- /// Finish polling and configure input using the input_setter
- void SetPollingResult(const Common::ParamPackage& params, bool abort);
-
- /// Handle mouse button press events.
- void mousePressEvent(QMouseEvent* event) override;
-
- /// Handle key press events.
- void keyPressEvent(QKeyEvent* event) override;
-
- std::unique_ptr<Ui::ConfigureMouseAdvanced> ui;
-
- InputCommon::InputSubsystem* input_subsystem;
-
- /// This will be the the setting function when an input is awaiting configuration.
- std::optional<std::function<void(const Common::ParamPackage&)>> input_setter;
-
- std::array<QPushButton*, Settings::NativeMouseButton::NumMouseButtons> button_map;
- std::array<Common::ParamPackage, Settings::NativeMouseButton::NumMouseButtons> buttons_param;
-
- std::vector<std::unique_ptr<InputCommon::Polling::DevicePoller>> device_pollers;
-
- std::unique_ptr<QTimer> timeout_timer;
- std::unique_ptr<QTimer> poll_timer;
-
- /// A flag to indicate if keyboard keys are okay when configuring an input. If this is false,
- /// keyboard events are ignored.
- bool want_keyboard_mouse = false;
-};
diff --git a/src/yuzu/configuration/configure_mouse_advanced.ui b/src/yuzu/configuration/configure_mouse_advanced.ui
deleted file mode 100644
index 5b99e1c37..000000000
--- a/src/yuzu/configuration/configure_mouse_advanced.ui
+++ /dev/null
@@ -1,335 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>ConfigureMouseAdvanced</class>
- <widget class="QDialog" name="ConfigureMouseAdvanced">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>310</width>
- <height>193</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Configure Mouse</string>
- </property>
- <property name="styleSheet">
- <string notr="true">QPushButton {
- min-width: 60px;
-}</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QGroupBox" name="gridGroupBox">
- <property name="title">
- <string>Mouse Buttons</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="3" column="5">
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <item>
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Forward:</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="forward_button">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>68</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="3" column="1">
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <item>
- <widget class="QLabel" name="label_4">
- <property name="minimumSize">
- <size>
- <width>54</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>Back:</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="back_button">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="1">
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Left:</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="left_button">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="3">
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Middle:</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="middle_button">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>68</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="6">
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="0">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="5">
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Right:</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="right_button">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>68</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="2">
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="4">
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_6">
- <item>
- <widget class="QPushButton" name="buttonClearAll">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>68</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Clear</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="buttonRestoreDefaults">
- <property name="minimumSize">
- <size>
- <width>68</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>68</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Defaults</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="styleSheet">
- <string notr="true"/>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>ConfigureMouseAdvanced</receiver>
- <slot>accept()</slot>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>ConfigureMouseAdvanced</receiver>
- <slot>reject()</slot>
- </connection>
- </connections>
-</ui>
diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp
index 8e5a4c72d..979a8db61 100644
--- a/src/yuzu/configuration/configure_tas.cpp
+++ b/src/yuzu/configuration/configure_tas.cpp
@@ -32,7 +32,6 @@ void ConfigureTasDialog::LoadConfiguration() {
ui->tas_path_edit->setText(
QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::TASDir)));
ui->tas_enable->setChecked(Settings::values.tas_enable.GetValue());
- ui->tas_control_swap->setChecked(Settings::values.tas_swap_controllers.GetValue());
ui->tas_loop_script->setChecked(Settings::values.tas_loop.GetValue());
ui->tas_pause_on_load->setChecked(Settings::values.pause_tas_on_load.GetValue());
}
@@ -40,7 +39,6 @@ void ConfigureTasDialog::LoadConfiguration() {
void ConfigureTasDialog::ApplyConfiguration() {
Common::FS::SetYuzuPath(Common::FS::YuzuPath::TASDir, ui->tas_path_edit->text().toStdString());
Settings::values.tas_enable.SetValue(ui->tas_enable->isChecked());
- Settings::values.tas_swap_controllers.SetValue(ui->tas_control_swap->isChecked());
Settings::values.tas_loop.SetValue(ui->tas_loop_script->isChecked());
Settings::values.pause_tas_on_load.SetValue(ui->tas_pause_on_load->isChecked());
}
diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui
index 7d44895c4..cf88a5bf0 100644
--- a/src/yuzu/configuration/configure_tas.ui
+++ b/src/yuzu/configuration/configure_tas.ui
@@ -59,20 +59,13 @@
</widget>
</item>
<item row="1" column="0" colspan="4">
- <widget class="QCheckBox" name="tas_control_swap">
- <property name="text">
- <string>Automatic controller profile swapping</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0" colspan="4">
<widget class="QCheckBox" name="tas_loop_script">
<property name="text">
<string>Loop script</string>
</property>
</widget>
</item>
- <item row="3" column="0" colspan="4">
+ <item row="2" column="0" colspan="4">
<widget class="QCheckBox" name="tas_pause_on_load">
<property name="enabled">
<bool>false</bool>
diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp
index 40129f228..bde0a08c4 100644
--- a/src/yuzu/configuration/configure_touch_from_button.cpp
+++ b/src/yuzu/configuration/configure_touch_from_button.cpp
@@ -163,13 +163,10 @@ void ConfigureTouchFromButton::ConnectEvents() {
connect(timeout_timer.get(), &QTimer::timeout, [this]() { SetPollingResult({}, true); });
connect(poll_timer.get(), &QTimer::timeout, [this]() {
- Common::ParamPackage params;
- for (auto& poller : device_pollers) {
- params = poller->GetNextInput();
- if (params.Has("engine")) {
- SetPollingResult(params, false);
- return;
- }
+ const auto& params = input_subsystem->GetNextInput();
+ if (params.Has("engine")) {
+ SetPollingResult(params, false);
+ return;
}
});
}
@@ -248,11 +245,7 @@ void ConfigureTouchFromButton::GetButtonInput(const int row_index, const bool is
}
};
- device_pollers = input_subsystem->GetPollers(InputCommon::Polling::DeviceType::Button);
-
- for (auto& poller : device_pollers) {
- poller->Start();
- }
+ input_subsystem->BeginMapping(InputCommon::Polling::InputType::Button);
grabKeyboard();
grabMouse();
@@ -365,14 +358,14 @@ void ConfigureTouchFromButton::SetCoordinates(const int dot_id, const QPoint& po
void ConfigureTouchFromButton::SetPollingResult(const Common::ParamPackage& params,
const bool cancel) {
+ timeout_timer->stop();
+ poll_timer->stop();
+ input_subsystem->StopMapping();
+
releaseKeyboard();
releaseMouse();
qApp->restoreOverrideCursor();
- timeout_timer->stop();
- poll_timer->stop();
- for (auto& poller : device_pollers) {
- poller->Stop();
- }
+
if (input_setter) {
(*input_setter)(params, cancel);
input_setter.reset();
diff --git a/src/yuzu/configuration/configure_touch_from_button.h b/src/yuzu/configuration/configure_touch_from_button.h
index d9513e3bc..e1400481a 100644
--- a/src/yuzu/configuration/configure_touch_from_button.h
+++ b/src/yuzu/configuration/configure_touch_from_button.h
@@ -24,10 +24,6 @@ namespace InputCommon {
class InputSubsystem;
}
-namespace InputCommon::Polling {
-class DevicePoller;
-}
-
namespace Settings {
struct TouchFromButtonMap;
}
@@ -85,7 +81,6 @@ private:
std::unique_ptr<QTimer> timeout_timer;
std::unique_ptr<QTimer> poll_timer;
- std::vector<std::unique_ptr<InputCommon::Polling::DevicePoller>> device_pollers;
std::optional<std::function<void(const Common::ParamPackage&, bool)>> input_setter;
static constexpr int DataRoleDot = Qt::ItemDataRole::UserRole + 2;
diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp
index 46a0f3025..adce04b27 100644
--- a/src/yuzu/configuration/configure_vibration.cpp
+++ b/src/yuzu/configuration/configure_vibration.cpp
@@ -59,80 +59,6 @@ void ConfigureVibration::ApplyConfiguration() {
ui->checkBoxAccurateVibration->isChecked());
}
-void ConfigureVibration::SetVibrationDevices(std::size_t player_index) {
- using namespace Settings::NativeButton;
- static constexpr std::array<std::array<Settings::NativeButton::Values, 6>, 2> buttons{{
- {DLeft, DUp, DRight, DDown, L, ZL}, // Left Buttons
- {A, B, X, Y, R, ZR}, // Right Buttons
- }};
-
- auto& player = Settings::values.players.GetValue()[player_index];
-
- for (std::size_t device_idx = 0; device_idx < buttons.size(); ++device_idx) {
- std::unordered_map<std::string, int> params_count;
-
- for (const auto button_index : buttons[device_idx]) {
- const auto& player_button = player.buttons[button_index];
-
- if (params_count.find(player_button) != params_count.end()) {
- ++params_count[player_button];
- continue;
- }
-
- params_count.insert_or_assign(player_button, 1);
- }
-
- const auto it = std::max_element(
- params_count.begin(), params_count.end(),
- [](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; });
-
- auto& vibration_param_str = player.vibrations[device_idx];
- vibration_param_str.clear();
-
- if (it->first.empty()) {
- continue;
- }
-
- const auto param = Common::ParamPackage(it->first);
-
- const auto engine = param.Get("engine", "");
- const auto guid = param.Get("guid", "");
- const auto port = param.Get("port", "");
-
- if (engine.empty() || engine == "keyboard" || engine == "mouse" || engine == "tas") {
- continue;
- }
-
- vibration_param_str += fmt::format("engine:{}", engine);
-
- if (!port.empty()) {
- vibration_param_str += fmt::format(",port:{}", port);
- }
- if (!guid.empty()) {
- vibration_param_str += fmt::format(",guid:{}", guid);
- }
- }
-
- if (player.vibrations[0] != player.vibrations[1]) {
- return;
- }
-
- if (!player.vibrations[0].empty() &&
- player.controller_type != Settings::ControllerType::RightJoycon) {
- player.vibrations[1].clear();
- } else if (!player.vibrations[1].empty() &&
- player.controller_type == Settings::ControllerType::RightJoycon) {
- player.vibrations[0].clear();
- }
-}
-
-void ConfigureVibration::SetAllVibrationDevices() {
- // Set vibration devices for all player indices including handheld
- for (std::size_t player_idx = 0; player_idx < NUM_PLAYERS + 1; ++player_idx) {
- SetVibrationDevices(player_idx);
- }
-}
-
void ConfigureVibration::changeEvent(QEvent* event) {
if (event->type() == QEvent::LanguageChange) {
RetranslateUI();
diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h
index 07411a86f..37bbc2653 100644
--- a/src/yuzu/configuration/configure_vibration.h
+++ b/src/yuzu/configuration/configure_vibration.h
@@ -24,9 +24,6 @@ public:
void ApplyConfiguration();
- static void SetVibrationDevices(std::size_t player_index);
- static void SetAllVibrationDevices();
-
private:
void changeEvent(QEvent* event) override;
void RetranslateUI();
diff --git a/src/yuzu/debugger/controller.cpp b/src/yuzu/debugger/controller.cpp
index 5a844409b..6b834c42e 100644
--- a/src/yuzu/debugger/controller.cpp
+++ b/src/yuzu/debugger/controller.cpp
@@ -6,13 +6,17 @@
#include <QLayout>
#include <QString>
#include "common/settings.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "input_common/drivers/tas_input.h"
#include "input_common/main.h"
-#include "input_common/tas/tas_input.h"
#include "yuzu/configuration/configure_input_player_widget.h"
#include "yuzu/debugger/controller.h"
-ControllerDialog::ControllerDialog(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_)
- : QWidget(parent, Qt::Dialog), input_subsystem{input_subsystem_} {
+ControllerDialog::ControllerDialog(Core::HID::HIDCore& hid_core_,
+ std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_,
+ QWidget* parent)
+ : QWidget(parent, Qt::Dialog), hid_core{hid_core_}, input_subsystem{input_subsystem_} {
setObjectName(QStringLiteral("Controller"));
setWindowTitle(tr("Controller P1"));
resize(500, 350);
@@ -31,20 +35,24 @@ ControllerDialog::ControllerDialog(QWidget* parent, InputCommon::InputSubsystem*
// Configure focus so that widget is focusable and the dialog automatically forwards focus to
// it.
setFocusProxy(widget);
- widget->SetConnectedStatus(false);
widget->setFocusPolicy(Qt::StrongFocus);
widget->setFocus();
}
void ControllerDialog::refreshConfiguration() {
- const auto& players = Settings::values.players.GetValue();
- constexpr std::size_t player = 0;
- widget->SetPlayerInputRaw(player, players[player].buttons, players[player].analogs);
- widget->SetControllerType(players[player].controller_type);
- ControllerCallback callback{[this](ControllerInput input) { InputController(input); }};
- widget->SetCallBack(callback);
- widget->repaint();
- widget->SetConnectedStatus(players[player].connected);
+ UnloadController();
+ auto* player_1 = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ // Display the correct controller
+ controller = handheld->IsConnected() ? handheld : player_1;
+
+ Core::HID::ControllerUpdateCallback engine_callback{
+ .on_change = [this](Core::HID::ControllerTriggerType type) { ControllerUpdate(type); },
+ .is_npad_service = true,
+ };
+ callback_key = controller->SetCallback(engine_callback);
+ widget->SetController(controller);
+ is_controller_set = true;
}
QAction* ControllerDialog::toggleViewAction() {
@@ -58,11 +66,18 @@ QAction* ControllerDialog::toggleViewAction() {
return toggle_view_action;
}
+void ControllerDialog::UnloadController() {
+ widget->UnloadController();
+ if (is_controller_set) {
+ controller->DeleteCallback(callback_key);
+ is_controller_set = false;
+ }
+}
+
void ControllerDialog::showEvent(QShowEvent* ev) {
if (toggle_view_action) {
toggle_view_action->setChecked(isVisible());
}
- refreshConfiguration();
QWidget::showEvent(ev);
}
@@ -70,16 +85,34 @@ void ControllerDialog::hideEvent(QHideEvent* ev) {
if (toggle_view_action) {
toggle_view_action->setChecked(isVisible());
}
- widget->SetConnectedStatus(false);
QWidget::hideEvent(ev);
}
-void ControllerDialog::InputController(ControllerInput input) {
- u32 buttons = 0;
- int index = 0;
- for (bool btn : input.button_values) {
- buttons |= (btn ? 1U : 0U) << index;
- index++;
+void ControllerDialog::ControllerUpdate(Core::HID::ControllerTriggerType type) {
+ // TODO(german77): Remove TAS from here
+ switch (type) {
+ case Core::HID::ControllerTriggerType::Button:
+ case Core::HID::ControllerTriggerType::Stick: {
+ const auto buttons_values = controller->GetButtonsValues();
+ const auto stick_values = controller->GetSticksValues();
+ u64 buttons = 0;
+ std::size_t index = 0;
+ for (const auto& button : buttons_values) {
+ buttons |= button.value ? 1LLU << index : 0;
+ index++;
+ }
+ const InputCommon::TasInput::TasAnalog left_axis = {
+ .x = stick_values[Settings::NativeAnalog::LStick].x.value,
+ .y = stick_values[Settings::NativeAnalog::LStick].y.value,
+ };
+ const InputCommon::TasInput::TasAnalog right_axis = {
+ .x = stick_values[Settings::NativeAnalog::RStick].x.value,
+ .y = stick_values[Settings::NativeAnalog::RStick].y.value,
+ };
+ input_subsystem->GetTas()->RecordInput(buttons, left_axis, right_axis);
+ break;
+ }
+ default:
+ break;
}
- input_subsystem->GetTas()->RecordInput(buttons, input.axis_values);
}
diff --git a/src/yuzu/debugger/controller.h b/src/yuzu/debugger/controller.h
index 7742db58b..52cea3326 100644
--- a/src/yuzu/debugger/controller.h
+++ b/src/yuzu/debugger/controller.h
@@ -4,9 +4,7 @@
#pragma once
-#include <QFileSystemWatcher>
#include <QWidget>
-#include "common/settings.h"
class QAction;
class QHideEvent;
@@ -17,35 +15,43 @@ namespace InputCommon {
class InputSubsystem;
}
-struct ControllerInput {
- std::array<std::pair<float, float>, Settings::NativeAnalog::NUM_STICKS_HID> axis_values{};
- std::array<bool, Settings::NativeButton::NumButtons> button_values{};
- bool changed{};
-};
-
-struct ControllerCallback {
- std::function<void(ControllerInput)> input;
-};
+namespace Core::HID {
+class HIDCore;
+class EmulatedController;
+enum class ControllerTriggerType;
+} // namespace Core::HID
class ControllerDialog : public QWidget {
Q_OBJECT
public:
- explicit ControllerDialog(QWidget* parent = nullptr,
- InputCommon::InputSubsystem* input_subsystem_ = nullptr);
+ explicit ControllerDialog(Core::HID::HIDCore& hid_core_,
+ std::shared_ptr<InputCommon::InputSubsystem> input_subsystem_,
+ QWidget* parent = nullptr);
/// Returns a QAction that can be used to toggle visibility of this dialog.
QAction* toggleViewAction();
+
+ /// Reloads the widget to apply any changes in the configuration
void refreshConfiguration();
+ /// Disables events from the emulated controller
+ void UnloadController();
+
protected:
void showEvent(QShowEvent* ev) override;
void hideEvent(QHideEvent* ev) override;
private:
- void InputController(ControllerInput input);
+ /// Redirects input from the widget to the TAS driver
+ void ControllerUpdate(Core::HID::ControllerTriggerType type);
+
+ int callback_key;
+ bool is_controller_set{};
+ Core::HID::EmulatedController* controller;
+
QAction* toggle_view_action = nullptr;
- QFileSystemWatcher* watcher = nullptr;
PlayerControlPreview* widget;
- InputCommon::InputSubsystem* input_subsystem;
+ Core::HID::HIDCore& hid_core;
+ std::shared_ptr<InputCommon::InputSubsystem> input_subsystem;
};
diff --git a/src/yuzu/debugger/profiler.cpp b/src/yuzu/debugger/profiler.cpp
index a8b254199..33110685a 100644
--- a/src/yuzu/debugger/profiler.cpp
+++ b/src/yuzu/debugger/profiler.cpp
@@ -163,7 +163,7 @@ void MicroProfileWidget::mouseReleaseEvent(QMouseEvent* ev) {
}
void MicroProfileWidget::wheelEvent(QWheelEvent* ev) {
- const auto wheel_position = ev->pos();
+ const auto wheel_position = ev->position().toPoint();
MicroProfileMousePosition(wheel_position.x() / x_scale, wheel_position.y() / y_scale,
ev->angleDelta().y() / 120);
ev->accept();
diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp
index 2af95dbe5..8b5c4a10a 100644
--- a/src/yuzu/game_list.cpp
+++ b/src/yuzu/game_list.cpp
@@ -17,6 +17,7 @@
#include <fmt/format.h>
#include "common/common_types.h"
#include "common/logging/log.h"
+#include "core/core.h"
#include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h"
#include "yuzu/compatibility_list.h"
@@ -25,6 +26,7 @@
#include "yuzu/game_list_worker.h"
#include "yuzu/main.h"
#include "yuzu/uisettings.h"
+#include "yuzu/util/controller_navigation.h"
GameListSearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist, QObject* parent)
: QObject(parent), gamelist{gamelist} {}
@@ -171,13 +173,17 @@ void GameList::OnItemExpanded(const QModelIndex& item) {
const bool is_dir = type == GameListItemType::CustomDir || type == GameListItemType::SdmcDir ||
type == GameListItemType::UserNandDir ||
type == GameListItemType::SysNandDir;
-
- if (!is_dir) {
+ const bool is_fave = type == GameListItemType::Favorites;
+ if (!is_dir && !is_fave) {
return;
}
-
- UISettings::values.game_dirs[item.data(GameListDir::GameDirRole).toInt()].expanded =
- tree_view->isExpanded(item);
+ const bool is_expanded = tree_view->isExpanded(item);
+ if (is_fave) {
+ UISettings::values.favorites_expanded = is_expanded;
+ return;
+ }
+ const int item_dir_index = item.data(GameListDir::GameDirRole).toInt();
+ UISettings::values.game_dirs[item_dir_index].expanded = is_expanded;
}
// Event in order to filter the gamelist after editing the searchfield
@@ -312,6 +318,7 @@ GameList::GameList(FileSys::VirtualFilesystem vfs, FileSys::ManualContentProvide
this->main_window = parent;
layout = new QVBoxLayout;
tree_view = new QTreeView;
+ controller_navigation = new ControllerNavigation(system.HIDCore(), this);
search_field = new GameListSearchField(this);
item_model = new QStandardItemModel(tree_view);
tree_view->setModel(item_model);
@@ -341,6 +348,18 @@ GameList::GameList(FileSys::VirtualFilesystem vfs, FileSys::ManualContentProvide
connect(tree_view, &QTreeView::customContextMenuRequested, this, &GameList::PopupContextMenu);
connect(tree_view, &QTreeView::expanded, this, &GameList::OnItemExpanded);
connect(tree_view, &QTreeView::collapsed, this, &GameList::OnItemExpanded);
+ connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent,
+ [this](Qt::Key key) {
+ // Avoid pressing buttons while playing
+ if (system.IsPoweredOn()) {
+ return;
+ }
+ if (!this->isActiveWindow()) {
+ return;
+ }
+ QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier);
+ QCoreApplication::postEvent(tree_view, event);
+ });
// We must register all custom types with the Qt Automoc system so that we are able to use
// it with signals/slots. In this case, QList falls under the umbrells of custom types.
@@ -353,7 +372,12 @@ GameList::GameList(FileSys::VirtualFilesystem vfs, FileSys::ManualContentProvide
setLayout(layout);
}
+void GameList::UnloadController() {
+ controller_navigation->UnloadController();
+}
+
GameList::~GameList() {
+ UnloadController();
emit ShouldCancelWorker();
}
@@ -438,10 +462,13 @@ void GameList::DonePopulating(const QStringList& watch_list) {
emit ShowList(!IsEmpty());
item_model->invisibleRootItem()->appendRow(new GameListAddDir());
+
+ // Add favorites row
item_model->invisibleRootItem()->insertRow(0, new GameListFavorites());
tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(),
UISettings::values.favorited_ids.size() == 0);
- tree_view->expand(item_model->invisibleRootItem()->child(0)->index());
+ tree_view->setExpanded(item_model->invisibleRootItem()->child(0)->index(),
+ UISettings::values.favorites_expanded.GetValue());
for (const auto id : UISettings::values.favorited_ids) {
AddFavorite(id);
}
diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h
index 675469e66..a94ea1477 100644
--- a/src/yuzu/game_list.h
+++ b/src/yuzu/game_list.h
@@ -24,6 +24,7 @@
#include "uisettings.h"
#include "yuzu/compatibility_list.h"
+class ControllerNavigation;
class GameListWorker;
class GameListSearchField;
class GameListDir;
@@ -88,6 +89,9 @@ public:
void SaveInterfaceLayout();
void LoadInterfaceLayout();
+ /// Disables events from the emulated controller
+ void UnloadController();
+
static const QStringList supported_file_extensions;
signals:
@@ -143,6 +147,7 @@ private:
QStandardItemModel* item_model = nullptr;
GameListWorker* current_worker = nullptr;
QFileSystemWatcher* watcher = nullptr;
+ ControllerNavigation* controller_navigation = nullptr;
CompatibilityList compatibility_list;
friend class GameListSearchField;
diff --git a/src/yuzu/loading_screen.cpp b/src/yuzu/loading_screen.cpp
index ae842306c..b001b8c23 100644
--- a/src/yuzu/loading_screen.cpp
+++ b/src/yuzu/loading_screen.cpp
@@ -136,7 +136,7 @@ void LoadingScreen::OnLoadComplete() {
void LoadingScreen::OnLoadProgress(VideoCore::LoadCallbackStage stage, std::size_t value,
std::size_t total) {
using namespace std::chrono;
- const auto now = high_resolution_clock::now();
+ const auto now = steady_clock::now();
// reset the timer if the stage changes
if (stage != previous_stage) {
ui->progress_bar->setStyleSheet(QString::fromUtf8(progressbar_style[stage]));
@@ -160,7 +160,7 @@ void LoadingScreen::OnLoadProgress(VideoCore::LoadCallbackStage stage, std::size
// If theres a drastic slowdown in the rate, then display an estimate
if (now - previous_time > milliseconds{50} || slow_shader_compile_start) {
if (!slow_shader_compile_start) {
- slow_shader_start = high_resolution_clock::now();
+ slow_shader_start = steady_clock::now();
slow_shader_compile_start = true;
slow_shader_first_value = value;
}
diff --git a/src/yuzu/loading_screen.h b/src/yuzu/loading_screen.h
index 801d08e1a..29155a77c 100644
--- a/src/yuzu/loading_screen.h
+++ b/src/yuzu/loading_screen.h
@@ -84,8 +84,8 @@ private:
// shaders, it will start quickly but end slow if new shaders were added since previous launch.
// These variables are used to detect the change in speed so we can generate an ETA
bool slow_shader_compile_start = false;
- std::chrono::high_resolution_clock::time_point slow_shader_start;
- std::chrono::high_resolution_clock::time_point previous_time;
+ std::chrono::steady_clock::time_point slow_shader_start;
+ std::chrono::steady_clock::time_point previous_time;
std::size_t slow_shader_first_value = 0;
};
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 6071a222f..b7bb43348 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -26,6 +26,8 @@
#include "core/frontend/applets/controller.h"
#include "core/frontend/applets/general_frontend.h"
#include "core/frontend/applets/software_keyboard.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
#include "core/hle/service/acc/profile_manager.h"
#include "core/hle/service/am/applet_ae.h"
#include "core/hle/service/am/applet_oe.h"
@@ -75,6 +77,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "common/fs/fs.h"
#include "common/fs/fs_paths.h"
#include "common/fs/path_util.h"
+#include "common/literals.h"
#include "common/logging/backend.h"
#include "common/logging/filter.h"
#include "common/logging/log.h"
@@ -106,8 +109,8 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "core/loader/loader.h"
#include "core/perf_stats.h"
#include "core/telemetry_session.h"
+#include "input_common/drivers/tas_input.h"
#include "input_common/main.h"
-#include "input_common/tas/tas_input.h"
#include "ui_main.h"
#include "util/overlay_dialog.h"
#include "video_core/gpu.h"
@@ -132,6 +135,8 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/main.h"
#include "yuzu/uisettings.h"
+using namespace Common::Literals;
+
#ifdef USE_DISCORD_PRESENCE
#include "yuzu/discord_impl.h"
#endif
@@ -227,6 +232,9 @@ GMainWindow::GMainWindow()
ConnectMenuEvents();
ConnectWidgetEvents();
+ system->HIDCore().ReloadInputDevices();
+ controller_dialog->refreshConfiguration();
+
const auto branch_name = std::string(Common::g_scm_branch);
const auto description = std::string(Common::g_scm_desc);
const auto build_id = std::string(Common::g_build_id);
@@ -254,10 +262,9 @@ GMainWindow::GMainWindow()
LOG_INFO(Frontend, "Host CPU: {}", cpu_string);
#endif
LOG_INFO(Frontend, "Host OS: {}", QSysInfo::prettyProductName().toStdString());
- LOG_INFO(Frontend, "Host RAM: {:.2f} GB",
- Common::GetMemInfo().TotalPhysicalMemory / 1024.0f / 1024 / 1024);
- LOG_INFO(Frontend, "Host Swap: {:.2f} GB",
- Common::GetMemInfo().TotalSwapMemory / 1024.0f / 1024 / 1024);
+ LOG_INFO(Frontend, "Host RAM: {:.2f} GiB",
+ Common::GetMemInfo().TotalPhysicalMemory / f64{1_GiB});
+ LOG_INFO(Frontend, "Host Swap: {:.2f} GiB", Common::GetMemInfo().TotalSwapMemory / f64{1_GiB});
UpdateWindowTitle();
show();
@@ -444,7 +451,7 @@ void GMainWindow::ControllerSelectorReconfigureControllers(
}
void GMainWindow::ProfileSelectorSelectProfile() {
- QtProfileSelectionDialog dialog(this);
+ QtProfileSelectionDialog dialog(system->HIDCore(), this);
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
Qt::WindowCloseButtonHint);
@@ -829,15 +836,16 @@ void GMainWindow::InitializeWidgets() {
dock_status_button->setFocusPolicy(Qt::NoFocus);
connect(dock_status_button, &QPushButton::clicked, [&] {
const bool is_docked = Settings::values.use_docked_mode.GetValue();
- auto& controller_type = Settings::values.players.GetValue()[0].controller_type;
+ auto* player_1 = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
+ auto* handheld = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld);
- if (!is_docked && controller_type == Settings::ControllerType::Handheld) {
+ if (!is_docked && handheld->IsConnected()) {
QMessageBox::warning(this, tr("Invalid config detected"),
tr("Handheld controller can't be used on docked mode. Pro "
"controller will be selected."));
- controller_type = Settings::ControllerType::ProController;
- ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), *system);
- configure_dialog.ApplyConfiguration();
+ handheld->Disconnect();
+ player_1->SetNpadStyleIndex(Core::HID::NpadStyleIndex::ProController);
+ player_1->Connect();
controller_dialog->refreshConfiguration();
}
@@ -922,7 +930,7 @@ void GMainWindow::InitializeDebugWidgets() {
waitTreeWidget->hide();
debug_menu->addAction(waitTreeWidget->toggleViewAction());
- controller_dialog = new ControllerDialog(this, input_subsystem.get());
+ controller_dialog = new ControllerDialog(system->HIDCore(), input_subsystem, this);
controller_dialog->hide();
debug_menu->addAction(controller_dialog->toggleViewAction());
@@ -952,171 +960,80 @@ void GMainWindow::InitializeRecentFileMenuActions() {
UpdateRecentFiles();
}
+void GMainWindow::LinkActionShortcut(QAction* action, const QString& action_name) {
+ static const QString main_window = QStringLiteral("Main Window");
+ action->setShortcut(hotkey_registry.GetKeySequence(main_window, action_name));
+ action->setShortcutContext(hotkey_registry.GetShortcutContext(main_window, action_name));
+
+ this->addAction(action);
+}
+
void GMainWindow::InitializeHotkeys() {
hotkey_registry.LoadHotkeys();
- const QString main_window = QStringLiteral("Main Window");
- const QString load_file = QStringLiteral("Load File");
- const QString load_amiibo = QStringLiteral("Load Amiibo");
- const QString exit_yuzu = QStringLiteral("Exit yuzu");
- const QString restart_emulation = QStringLiteral("Restart Emulation");
- const QString stop_emulation = QStringLiteral("Stop Emulation");
- const QString toggle_filter_bar = QStringLiteral("Toggle Filter Bar");
- const QString toggle_status_bar = QStringLiteral("Toggle Status Bar");
- const QString fullscreen = QStringLiteral("Fullscreen");
- const QString capture_screenshot = QStringLiteral("Capture Screenshot");
-
- ui->action_Load_File->setShortcut(hotkey_registry.GetKeySequence(main_window, load_file));
- ui->action_Load_File->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, load_file));
-
- ui->action_Load_Amiibo->setShortcut(hotkey_registry.GetKeySequence(main_window, load_amiibo));
- ui->action_Load_Amiibo->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, load_amiibo));
-
- ui->action_Exit->setShortcut(hotkey_registry.GetKeySequence(main_window, exit_yuzu));
- ui->action_Exit->setShortcutContext(hotkey_registry.GetShortcutContext(main_window, exit_yuzu));
-
- ui->action_Restart->setShortcut(hotkey_registry.GetKeySequence(main_window, restart_emulation));
- ui->action_Restart->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, restart_emulation));
-
- ui->action_Stop->setShortcut(hotkey_registry.GetKeySequence(main_window, stop_emulation));
- ui->action_Stop->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, stop_emulation));
-
- ui->action_Show_Filter_Bar->setShortcut(
- hotkey_registry.GetKeySequence(main_window, toggle_filter_bar));
- ui->action_Show_Filter_Bar->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, toggle_filter_bar));
-
- ui->action_Show_Status_Bar->setShortcut(
- hotkey_registry.GetKeySequence(main_window, toggle_status_bar));
- ui->action_Show_Status_Bar->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, toggle_status_bar));
-
- ui->action_Capture_Screenshot->setShortcut(
- hotkey_registry.GetKeySequence(main_window, capture_screenshot));
- ui->action_Capture_Screenshot->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, capture_screenshot));
-
- ui->action_Fullscreen->setShortcut(
- hotkey_registry.GetHotkey(main_window, fullscreen, this)->key());
- ui->action_Fullscreen->setShortcutContext(
- hotkey_registry.GetShortcutContext(main_window, fullscreen));
-
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load File"), this),
- &QShortcut::activated, this, &GMainWindow::OnMenuLoadFile);
- connect(
- hotkey_registry.GetHotkey(main_window, QStringLiteral("Continue/Pause Emulation"), this),
- &QShortcut::activated, this, [&] {
- if (emulation_running) {
- if (emu_thread->IsRunning()) {
- OnPauseGame();
- } else {
- OnStartGame();
- }
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Restart Emulation"), this),
- &QShortcut::activated, this, [this] {
- if (!system->IsPoweredOn()) {
- return;
- }
- BootGame(game_path);
- });
- connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
- &QShortcut::activated, ui->action_Fullscreen, &QAction::trigger);
- connect(hotkey_registry.GetHotkey(main_window, fullscreen, render_window),
- &QShortcut::activatedAmbiguously, ui->action_Fullscreen, &QAction::trigger);
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Exit Fullscreen"), this),
- &QShortcut::activated, this, [&] {
- if (emulation_running && ui->action_Fullscreen->isChecked()) {
- ui->action_Fullscreen->setChecked(false);
- ToggleFullscreen();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.use_speed_limit.SetValue(
- !Settings::values.use_speed_limit.GetValue());
- UpdateStatusBar();
- });
+ LinkActionShortcut(ui->action_Load_File, QStringLiteral("Load File"));
+ LinkActionShortcut(ui->action_Load_Amiibo, QStringLiteral("Load Amiibo"));
+ LinkActionShortcut(ui->action_Exit, QStringLiteral("Exit yuzu"));
+ LinkActionShortcut(ui->action_Restart, QStringLiteral("Restart Emulation"));
+ LinkActionShortcut(ui->action_Pause, QStringLiteral("Continue/Pause Emulation"));
+ LinkActionShortcut(ui->action_Stop, QStringLiteral("Stop Emulation"));
+ LinkActionShortcut(ui->action_Show_Filter_Bar, QStringLiteral("Toggle Filter Bar"));
+ LinkActionShortcut(ui->action_Show_Status_Bar, QStringLiteral("Toggle Status Bar"));
+ LinkActionShortcut(ui->action_Fullscreen, QStringLiteral("Fullscreen"));
+ LinkActionShortcut(ui->action_Capture_Screenshot, QStringLiteral("Capture Screenshot"));
+ LinkActionShortcut(ui->action_TAS_Start, QStringLiteral("TAS Start/Stop"));
+ LinkActionShortcut(ui->action_TAS_Record, QStringLiteral("TAS Record"));
+ LinkActionShortcut(ui->action_TAS_Reset, QStringLiteral("TAS Reset"));
+
+ static const QString main_window = QStringLiteral("Main Window");
+ const auto connect_shortcut = [&]<typename Fn>(const QString& action_name, const Fn& function) {
+ const QShortcut* hotkey = hotkey_registry.GetHotkey(main_window, action_name, this);
+ connect(hotkey, &QShortcut::activated, this, function);
+ };
+
+ connect_shortcut(QStringLiteral("Exit Fullscreen"), [&] {
+ if (emulation_running && ui->action_Fullscreen->isChecked()) {
+ ui->action_Fullscreen->setChecked(false);
+ ToggleFullscreen();
+ }
+ });
+ connect_shortcut(QStringLiteral("Toggle Speed Limit"), [&] {
+ Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue());
+ UpdateStatusBar();
+ });
constexpr u16 SPEED_LIMIT_STEP = 5;
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Increase Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- if (Settings::values.speed_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) {
- Settings::values.speed_limit.SetValue(SPEED_LIMIT_STEP +
- Settings::values.speed_limit.GetValue());
- UpdateStatusBar();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Decrease Speed Limit"), this),
- &QShortcut::activated, this, [&] {
- if (Settings::values.speed_limit.GetValue() > SPEED_LIMIT_STEP) {
- Settings::values.speed_limit.SetValue(Settings::values.speed_limit.GetValue() -
- SPEED_LIMIT_STEP);
- UpdateStatusBar();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Load Amiibo"), this),
- &QShortcut::activated, this, [&] {
- if (ui->action_Load_Amiibo->isEnabled()) {
- OnLoadAmiibo();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Capture Screenshot"), this),
- &QShortcut::activated, this, [&] {
- if (emu_thread != nullptr && emu_thread->IsRunning()) {
- OnCaptureScreenshot();
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Change Docked Mode"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.use_docked_mode.SetValue(
- !Settings::values.use_docked_mode.GetValue());
- OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(),
- Settings::values.use_docked_mode.GetValue(), *system);
- dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Mute Audio"), this),
- &QShortcut::activated, this,
- [] { Settings::values.audio_muted = !Settings::values.audio_muted; });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Framerate Limit"), this),
- &QShortcut::activated, this, [] {
- Settings::values.disable_fps_limit.SetValue(
- !Settings::values.disable_fps_limit.GetValue());
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("Toggle Mouse Panning"), this),
- &QShortcut::activated, this, [&] {
- Settings::values.mouse_panning = !Settings::values.mouse_panning;
- if (Settings::values.mouse_panning) {
- render_window->installEventFilter(render_window);
- render_window->setAttribute(Qt::WA_Hover, true);
- }
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Start/Stop"), this),
- &QShortcut::activated, this, [&] {
- if (!emulation_running) {
- return;
- }
- input_subsystem->GetTas()->StartStop();
- });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Reset"), this),
- &QShortcut::activated, this, [&] { input_subsystem->GetTas()->Reset(); });
- connect(hotkey_registry.GetHotkey(main_window, QStringLiteral("TAS Record"), this),
- &QShortcut::activated, this, [&] {
- if (!emulation_running) {
- return;
- }
- bool is_recording = input_subsystem->GetTas()->Record();
- if (!is_recording) {
- const auto res = QMessageBox::question(this, tr("TAS Recording"),
- tr("Overwrite file of player 1?"),
- QMessageBox::Yes | QMessageBox::No);
- input_subsystem->GetTas()->SaveRecording(res == QMessageBox::Yes);
- }
- });
+ connect_shortcut(QStringLiteral("Increase Speed Limit"), [&] {
+ if (Settings::values.speed_limit.GetValue() < 9999 - SPEED_LIMIT_STEP) {
+ Settings::values.speed_limit.SetValue(SPEED_LIMIT_STEP +
+ Settings::values.speed_limit.GetValue());
+ UpdateStatusBar();
+ }
+ });
+ connect_shortcut(QStringLiteral("Decrease Speed Limit"), [&] {
+ if (Settings::values.speed_limit.GetValue() > SPEED_LIMIT_STEP) {
+ Settings::values.speed_limit.SetValue(Settings::values.speed_limit.GetValue() -
+ SPEED_LIMIT_STEP);
+ UpdateStatusBar();
+ }
+ });
+ connect_shortcut(QStringLiteral("Change Docked Mode"), [&] {
+ Settings::values.use_docked_mode.SetValue(!Settings::values.use_docked_mode.GetValue());
+ OnDockedModeChanged(!Settings::values.use_docked_mode.GetValue(),
+ Settings::values.use_docked_mode.GetValue(), *system);
+ dock_status_button->setChecked(Settings::values.use_docked_mode.GetValue());
+ });
+ connect_shortcut(QStringLiteral("Mute Audio"),
+ [] { Settings::values.audio_muted = !Settings::values.audio_muted; });
+ connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] {
+ Settings::values.disable_fps_limit.SetValue(!Settings::values.disable_fps_limit.GetValue());
+ });
+ connect_shortcut(QStringLiteral("Toggle Mouse Panning"), [&] {
+ Settings::values.mouse_panning = !Settings::values.mouse_panning;
+ if (Settings::values.mouse_panning) {
+ render_window->installEventFilter(render_window);
+ render_window->setAttribute(Qt::WA_Hover, true);
+ }
+ });
}
void GMainWindow::SetDefaultUIGeometry() {
@@ -1167,13 +1084,15 @@ void GMainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
state != Qt::ApplicationActive) {
LOG_DEBUG(Frontend, "ApplicationState unusual flag: {} ", state);
}
- if (ui->action_Pause->isEnabled() &&
- (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
- auto_paused = true;
- OnPauseGame();
- } else if (ui->action_Start->isEnabled() && auto_paused && state == Qt::ApplicationActive) {
- auto_paused = false;
- OnStartGame();
+ if (emulation_running) {
+ if (emu_thread->IsRunning() &&
+ (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
+ auto_paused = true;
+ OnPauseGame();
+ } else if (!emu_thread->IsRunning() && auto_paused && state == Qt::ApplicationActive) {
+ auto_paused = false;
+ OnStartGame();
+ }
}
}
@@ -1215,61 +1134,86 @@ void GMainWindow::ConnectWidgetEvents() {
}
void GMainWindow::ConnectMenuEvents() {
+ const auto connect_menu = [&]<typename Fn>(QAction* action, const Fn& event_fn) {
+ connect(action, &QAction::triggered, this, event_fn);
+ // Add actions to this window so that hiding menus in fullscreen won't disable them
+ addAction(action);
+ // Add actions to the render window so that they work outside of single window mode
+ render_window->addAction(action);
+ };
+
// File
- connect(ui->action_Load_File, &QAction::triggered, this, &GMainWindow::OnMenuLoadFile);
- connect(ui->action_Load_Folder, &QAction::triggered, this, &GMainWindow::OnMenuLoadFolder);
- connect(ui->action_Install_File_NAND, &QAction::triggered, this,
- &GMainWindow::OnMenuInstallToNAND);
- connect(ui->action_Exit, &QAction::triggered, this, &QMainWindow::close);
- connect(ui->action_Load_Amiibo, &QAction::triggered, this, &GMainWindow::OnLoadAmiibo);
+ connect_menu(ui->action_Load_File, &GMainWindow::OnMenuLoadFile);
+ connect_menu(ui->action_Load_Folder, &GMainWindow::OnMenuLoadFolder);
+ connect_menu(ui->action_Install_File_NAND, &GMainWindow::OnMenuInstallToNAND);
+ connect_menu(ui->action_Exit, &QMainWindow::close);
+ connect_menu(ui->action_Load_Amiibo, &GMainWindow::OnLoadAmiibo);
// Emulation
- connect(ui->action_Start, &QAction::triggered, this, &GMainWindow::OnStartGame);
- connect(ui->action_Pause, &QAction::triggered, this, &GMainWindow::OnPauseGame);
- connect(ui->action_Stop, &QAction::triggered, this, &GMainWindow::OnStopGame);
- connect(ui->action_Report_Compatibility, &QAction::triggered, this,
- &GMainWindow::OnMenuReportCompatibility);
- connect(ui->action_Open_Mods_Page, &QAction::triggered, this, &GMainWindow::OnOpenModsPage);
- connect(ui->action_Open_Quickstart_Guide, &QAction::triggered, this,
- &GMainWindow::OnOpenQuickstartGuide);
- connect(ui->action_Open_FAQ, &QAction::triggered, this, &GMainWindow::OnOpenFAQ);
- connect(ui->action_Restart, &QAction::triggered, this,
- [this] { BootGame(QString(game_path)); });
- connect(ui->action_Configure, &QAction::triggered, this, &GMainWindow::OnConfigure);
- connect(ui->action_Configure_Tas, &QAction::triggered, this, &GMainWindow::OnConfigureTas);
- connect(ui->action_Configure_Current_Game, &QAction::triggered, this,
- &GMainWindow::OnConfigurePerGame);
+ connect_menu(ui->action_Pause, &GMainWindow::OnPauseContinueGame);
+ connect_menu(ui->action_Stop, &GMainWindow::OnStopGame);
+ connect_menu(ui->action_Report_Compatibility, &GMainWindow::OnMenuReportCompatibility);
+ connect_menu(ui->action_Open_Mods_Page, &GMainWindow::OnOpenModsPage);
+ connect_menu(ui->action_Open_Quickstart_Guide, &GMainWindow::OnOpenQuickstartGuide);
+ connect_menu(ui->action_Open_FAQ, &GMainWindow::OnOpenFAQ);
+ connect_menu(ui->action_Restart, &GMainWindow::OnRestartGame);
+ connect_menu(ui->action_Configure, &GMainWindow::OnConfigure);
+ connect_menu(ui->action_Configure_Current_Game, &GMainWindow::OnConfigurePerGame);
// View
- connect(ui->action_Single_Window_Mode, &QAction::triggered, this,
- &GMainWindow::ToggleWindowMode);
- connect(ui->action_Display_Dock_Widget_Headers, &QAction::triggered, this,
- &GMainWindow::OnDisplayTitleBars);
- connect(ui->action_Show_Filter_Bar, &QAction::triggered, this, &GMainWindow::OnToggleFilterBar);
+ connect_menu(ui->action_Fullscreen, &GMainWindow::ToggleFullscreen);
+ connect_menu(ui->action_Single_Window_Mode, &GMainWindow::ToggleWindowMode);
+ connect_menu(ui->action_Display_Dock_Widget_Headers, &GMainWindow::OnDisplayTitleBars);
+ connect_menu(ui->action_Show_Filter_Bar, &GMainWindow::OnToggleFilterBar);
+
connect(ui->action_Show_Status_Bar, &QAction::triggered, statusBar(), &QStatusBar::setVisible);
- connect(ui->action_Reset_Window_Size_720, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize720);
- connect(ui->action_Reset_Window_Size_900, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize900);
- connect(ui->action_Reset_Window_Size_1080, &QAction::triggered, this,
- &GMainWindow::ResetWindowSize1080);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_720);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_900);
- ui->menu_Reset_Window_Size->addAction(ui->action_Reset_Window_Size_1080);
+ connect_menu(ui->action_Reset_Window_Size_720, &GMainWindow::ResetWindowSize720);
+ connect_menu(ui->action_Reset_Window_Size_900, &GMainWindow::ResetWindowSize900);
+ connect_menu(ui->action_Reset_Window_Size_1080, &GMainWindow::ResetWindowSize1080);
+ ui->menu_Reset_Window_Size->addActions({ui->action_Reset_Window_Size_720,
+ ui->action_Reset_Window_Size_900,
+ ui->action_Reset_Window_Size_1080});
- // Fullscreen
- connect(ui->action_Fullscreen, &QAction::triggered, this, &GMainWindow::ToggleFullscreen);
+ // Tools
+ connect_menu(ui->action_Rederive, std::bind(&GMainWindow::OnReinitializeKeys, this,
+ ReinitializeKeyBehavior::Warning));
+ connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
- // Movie
- connect(ui->action_Capture_Screenshot, &QAction::triggered, this,
- &GMainWindow::OnCaptureScreenshot);
+ // TAS
+ connect_menu(ui->action_TAS_Start, &GMainWindow::OnTasStartStop);
+ connect_menu(ui->action_TAS_Record, &GMainWindow::OnTasRecord);
+ connect_menu(ui->action_TAS_Reset, &GMainWindow::OnTasReset);
+ connect_menu(ui->action_Configure_Tas, &GMainWindow::OnConfigureTas);
// Help
- connect(ui->action_Open_yuzu_Folder, &QAction::triggered, this, &GMainWindow::OnOpenYuzuFolder);
- connect(ui->action_Rederive, &QAction::triggered, this,
- std::bind(&GMainWindow::OnReinitializeKeys, this, ReinitializeKeyBehavior::Warning));
- connect(ui->action_About, &QAction::triggered, this, &GMainWindow::OnAbout);
+ connect_menu(ui->action_Open_yuzu_Folder, &GMainWindow::OnOpenYuzuFolder);
+ connect_menu(ui->action_About, &GMainWindow::OnAbout);
+}
+
+void GMainWindow::UpdateMenuState() {
+ const bool is_paused = emu_thread == nullptr || !emu_thread->IsRunning();
+
+ const std::array running_actions{
+ ui->action_Stop,
+ ui->action_Restart,
+ ui->action_Configure_Current_Game,
+ ui->action_Report_Compatibility,
+ ui->action_Load_Amiibo,
+ ui->action_Pause,
+ };
+
+ for (QAction* action : running_actions) {
+ action->setEnabled(emulation_running);
+ }
+
+ ui->action_Capture_Screenshot->setEnabled(emulation_running && !is_paused);
+
+ if (emulation_running && is_paused) {
+ ui->action_Pause->setText(tr("&Continue"));
+ } else {
+ ui->action_Pause->setText(tr("&Pause"));
+ }
}
void GMainWindow::OnDisplayTitleBars(bool show) {
@@ -1360,16 +1304,13 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p
case Core::SystemResultStatus::ErrorVideoCore:
QMessageBox::critical(
this, tr("An error occurred initializing the video core."),
- tr("yuzu has encountered an error while running the video core, please see the "
- "log for more details."
+ tr("yuzu has encountered an error while running the video core. "
+ "This is usually caused by outdated GPU drivers, including integrated ones. "
+ "Please see the log for more details. "
"For more information on accessing the log, please see the following page: "
- "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How "
- "to "
- "Upload the Log File</a>."
- "Ensure that you have the latest graphics drivers for your GPU."));
-
+ "<a href='https://yuzu-emu.org/help/reference/log-files/'>"
+ "How to Upload the Log File</a>. "));
break;
-
default:
if (result > Core::SystemResultStatus::ErrorLoader) {
const u16 loader_id = static_cast<u16>(Core::SystemResultStatus::ErrorLoader);
@@ -1405,7 +1346,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p
}
void GMainWindow::SelectAndSetCurrentUser() {
- QtProfileSelectionDialog dialog(this);
+ QtProfileSelectionDialog dialog(system->HIDCore(), this);
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
dialog.setWindowModality(Qt::WindowModal);
@@ -1439,8 +1380,6 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
Config per_game_config(*system, config_file_name, Config::ConfigType::PerGameConfig);
}
- ConfigureVibration::SetAllVibrationDevices();
-
// Disable fps limit toggle when booting a new title
Settings::values.disable_fps_limit.SetValue(false);
@@ -1562,15 +1501,8 @@ void GMainWindow::ShutdownGame() {
disconnect(render_window, &GRenderWindow::Closed, this, &GMainWindow::OnStopGame);
// Update the GUI
- ui->action_Start->setEnabled(false);
- ui->action_Start->setText(tr("Start"));
- ui->action_Pause->setEnabled(false);
- ui->action_Stop->setEnabled(false);
- ui->action_Restart->setEnabled(false);
- ui->action_Configure_Current_Game->setEnabled(false);
- ui->action_Report_Compatibility->setEnabled(false);
- ui->action_Load_Amiibo->setEnabled(false);
- ui->action_Capture_Screenshot->setEnabled(false);
+ UpdateMenuState();
+
render_window->hide();
loading_screen->hide();
loading_screen->Clear();
@@ -1582,6 +1514,10 @@ void GMainWindow::ShutdownGame() {
game_list->SetFilterFocus();
tas_label->clear();
input_subsystem->GetTas()->Stop();
+ OnTasStateChanged();
+
+ // Enable all controllers
+ system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All});
render_window->removeEventFilter(render_window);
render_window->setAttribute(Qt::WA_Hover, false);
@@ -1675,7 +1611,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target
if (has_user_save) {
// User save data
const auto select_profile = [this] {
- QtProfileSelectionDialog dialog(this);
+ QtProfileSelectionDialog dialog(system->HIDCore(), this);
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
dialog.setWindowModality(Qt::WindowModal);
@@ -2501,31 +2437,36 @@ void GMainWindow::OnStartGame() {
connect(emu_thread.get(), &EmuThread::ErrorThrown, this, &GMainWindow::OnCoreError);
- ui->action_Start->setEnabled(false);
- ui->action_Start->setText(tr("&Continue"));
-
- ui->action_Pause->setEnabled(true);
- ui->action_Stop->setEnabled(true);
- ui->action_Restart->setEnabled(true);
- ui->action_Configure_Current_Game->setEnabled(true);
- ui->action_Report_Compatibility->setEnabled(true);
+ UpdateMenuState();
+ OnTasStateChanged();
discord_rpc->Update();
- ui->action_Load_Amiibo->setEnabled(true);
- ui->action_Capture_Screenshot->setEnabled(true);
+}
+
+void GMainWindow::OnRestartGame() {
+ if (!system->IsPoweredOn()) {
+ return;
+ }
+ // Make a copy since BootGame edits game_path
+ BootGame(QString(game_path));
}
void GMainWindow::OnPauseGame() {
emu_thread->SetRunning(false);
-
- ui->action_Start->setEnabled(true);
- ui->action_Pause->setEnabled(false);
- ui->action_Stop->setEnabled(true);
- ui->action_Capture_Screenshot->setEnabled(false);
-
+ UpdateMenuState();
AllowOSSleep();
}
+void GMainWindow::OnPauseContinueGame() {
+ if (emulation_running) {
+ if (emu_thread->IsRunning()) {
+ OnPauseGame();
+ } else {
+ OnStartGame();
+ }
+ }
+}
+
void GMainWindow::OnStopGame() {
if (system->GetExitLock() && !ConfirmForceLockedExit()) {
return;
@@ -2774,7 +2715,6 @@ void GMainWindow::OnConfigure() {
ShowTelemetryCallout();
}
- controller_dialog->refreshConfiguration();
InitializeHotkeys();
if (UISettings::values.theme != old_theme) {
@@ -2807,6 +2747,7 @@ void GMainWindow::OnConfigure() {
}
UpdateStatusButtons();
+ controller_dialog->refreshConfiguration();
}
void GMainWindow::OnConfigureTas() {
@@ -2821,6 +2762,32 @@ void GMainWindow::OnConfigureTas() {
}
}
+void GMainWindow::OnTasStartStop() {
+ if (!emulation_running) {
+ return;
+ }
+ input_subsystem->GetTas()->StartStop();
+ OnTasStateChanged();
+}
+
+void GMainWindow::OnTasRecord() {
+ if (!emulation_running) {
+ return;
+ }
+ const bool is_recording = input_subsystem->GetTas()->Record();
+ if (!is_recording) {
+ const auto res =
+ QMessageBox::question(this, tr("TAS Recording"), tr("Overwrite file of player 1?"),
+ QMessageBox::Yes | QMessageBox::No);
+ input_subsystem->GetTas()->SaveRecording(res == QMessageBox::Yes);
+ }
+ OnTasStateChanged();
+}
+
+void GMainWindow::OnTasReset() {
+ input_subsystem->GetTas()->Reset();
+}
+
void GMainWindow::OnConfigurePerGame() {
const u64 title_id = system->GetCurrentProcessProgramID();
OpenPerGameConfiguration(title_id, game_path.toStdString());
@@ -2858,6 +2825,10 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file
}
void GMainWindow::OnLoadAmiibo() {
+ if (emu_thread == nullptr || !emu_thread->IsRunning()) {
+ return;
+ }
+
const QString extensions{QStringLiteral("*.bin")};
const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), {}, file_filter);
@@ -2921,6 +2892,10 @@ void GMainWindow::OnToggleFilterBar() {
}
void GMainWindow::OnCaptureScreenshot() {
+ if (emu_thread == nullptr || !emu_thread->IsRunning()) {
+ return;
+ }
+
const u64 title_id = system->GetCurrentProcessProgramID();
const auto screenshot_path =
QString::fromStdString(Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ScreenshotsDir));
@@ -3003,17 +2978,35 @@ void GMainWindow::UpdateWindowTitle(std::string_view title_name, std::string_vie
QString GMainWindow::GetTasStateDescription() const {
auto [tas_status, current_tas_frame, total_tas_frames] = input_subsystem->GetTas()->GetStatus();
switch (tas_status) {
- case TasInput::TasState::Running:
+ case InputCommon::TasInput::TasState::Running:
return tr("TAS state: Running %1/%2").arg(current_tas_frame).arg(total_tas_frames);
- case TasInput::TasState::Recording:
+ case InputCommon::TasInput::TasState::Recording:
return tr("TAS state: Recording %1").arg(total_tas_frames);
- case TasInput::TasState::Stopped:
+ case InputCommon::TasInput::TasState::Stopped:
return tr("TAS state: Idle %1/%2").arg(current_tas_frame).arg(total_tas_frames);
default:
return tr("TAS State: Invalid");
}
}
+void GMainWindow::OnTasStateChanged() {
+ bool is_running = false;
+ bool is_recording = false;
+ if (emulation_running) {
+ const InputCommon::TasInput::TasState tas_status =
+ std::get<0>(input_subsystem->GetTas()->GetStatus());
+ is_running = tas_status == InputCommon::TasInput::TasState::Running;
+ is_recording = tas_status == InputCommon::TasInput::TasState::Recording;
+ }
+
+ ui->action_TAS_Start->setText(is_running ? tr("&Stop Running") : tr("&Start"));
+ ui->action_TAS_Record->setText(is_recording ? tr("Stop R&ecording") : tr("R&ecord"));
+
+ ui->action_TAS_Start->setEnabled(emulation_running);
+ ui->action_TAS_Record->setEnabled(emulation_running);
+ ui->action_TAS_Reset->setEnabled(emulation_running);
+}
+
void GMainWindow::UpdateStatusBar() {
if (emu_thread == nullptr) {
status_bar_update_timer.stop();
@@ -3106,7 +3099,7 @@ void GMainWindow::UpdateFilterText() {
filter_status_button->setText(tr("SCALEFORCE"));
break;
case Settings::ScalingFilter::Fsr:
- filter_status_button->setText(tr("AMD'S FIDELITYFX SR"));
+ filter_status_button->setText(tr("FSR"));
break;
default:
filter_status_button->setText(tr("BILINEAR"));
@@ -3117,15 +3110,15 @@ void GMainWindow::UpdateFilterText() {
void GMainWindow::UpdateAAText() {
const auto aa_mode = Settings::values.anti_aliasing.GetValue();
switch (aa_mode) {
- case Settings::AntiAliasing::Fxaa:
- aa_status_button->setText(tr("FXAA"));
- break;
case Settings::AntiAliasing::None:
aa_status_button->setText(tr("NO AA"));
break;
- default:
+ case Settings::AntiAliasing::Fxaa:
aa_status_button->setText(tr("FXAA"));
break;
+ default:
+ aa_status_button->setText(tr("NO AA"));
+ break;
}
}
@@ -3300,9 +3293,9 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {
if (!errors.isEmpty()) {
QMessageBox::warning(
this, tr("Derivation Components Missing"),
- tr("Components are missing that may hinder key derivation from completing. "
+ tr("Encryption keys are missing. "
"<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu "
- "quickstart guide</a> to get all your keys and "
+ "quickstart guide</a> to get all your keys, firmware and "
"games.<br><br><small>(%1)</small>")
.arg(errors));
}
@@ -3387,6 +3380,11 @@ void GMainWindow::closeEvent(QCloseEvent* event) {
game_list->SaveInterfaceLayout();
hotkey_registry.SaveHotkeys();
+ // Unload controllers early
+ controller_dialog->UnloadController();
+ game_list->UnloadController();
+ system->HIDCore().UnloadInputDevices();
+
// Shutdown session if the emu thread is active...
if (emu_thread != nullptr) {
ShutdownGame();
@@ -3487,36 +3485,38 @@ void GMainWindow::filterBarSetChecked(bool state) {
}
void GMainWindow::UpdateUITheme() {
- const QString default_icons = QStringLiteral("default");
- const QString& current_theme = UISettings::values.theme;
- const bool is_default_theme = current_theme == QString::fromUtf8(UISettings::themes[0].second);
+ const QString default_theme = QStringLiteral("default");
+ QString current_theme = UISettings::values.theme;
QStringList theme_paths(default_theme_paths);
- if (is_default_theme || current_theme.isEmpty()) {
- const QString theme_uri(QStringLiteral(":default/style.qss"));
+ if (current_theme.isEmpty()) {
+ current_theme = default_theme;
+ }
+
+ if (current_theme != default_theme) {
+ QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)};
QFile f(theme_uri);
- if (f.open(QFile::ReadOnly | QFile::Text)) {
- QTextStream ts(&f);
- qApp->setStyleSheet(ts.readAll());
- setStyleSheet(ts.readAll());
- } else {
- qApp->setStyleSheet({});
- setStyleSheet({});
+ if (!f.open(QFile::ReadOnly | QFile::Text)) {
+ LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme",
+ UISettings::values.theme.toStdString());
+ current_theme = default_theme;
}
- QIcon::setThemeName(default_icons);
+ }
+
+ QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)};
+ QFile f(theme_uri);
+ if (f.open(QFile::ReadOnly | QFile::Text)) {
+ QTextStream ts(&f);
+ qApp->setStyleSheet(ts.readAll());
+ setStyleSheet(ts.readAll());
} else {
- const QString theme_uri(QLatin1Char{':'} + current_theme + QStringLiteral("/style.qss"));
- QFile f(theme_uri);
- if (f.open(QFile::ReadOnly | QFile::Text)) {
- QTextStream ts(&f);
- qApp->setStyleSheet(ts.readAll());
- setStyleSheet(ts.readAll());
- } else {
- LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found");
- }
- QIcon::setThemeName(current_theme);
+ LOG_ERROR(Frontend, "Unable to set style \"{}\", stylesheet file not found",
+ UISettings::values.theme.toStdString());
+ qApp->setStyleSheet({});
+ setStyleSheet({});
}
+ QIcon::setThemeName(current_theme);
QIcon::setThemeSearchPaths(theme_paths);
}
@@ -3552,9 +3552,6 @@ void GMainWindow::OnLanguageChanged(const QString& locale) {
LoadTranslation();
ui->retranslateUi(this);
UpdateWindowTitle();
-
- if (emulation_running)
- ui->action_Start->setText(tr("&Continue"));
}
void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) {
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 24633ff2d..0fd41ed4f 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -177,6 +177,7 @@ public slots:
void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args,
bool is_local);
void OnAppFocusStateChanged(Qt::ApplicationState state);
+ void OnTasStateChanged();
private:
void RegisterMetaTypes();
@@ -190,6 +191,7 @@ private:
void ConnectWidgetEvents();
void ConnectMenuEvents();
+ void UpdateMenuState();
void PreventOSSleep();
void AllowOSSleep();
@@ -239,7 +241,9 @@ private:
private slots:
void OnStartGame();
+ void OnRestartGame();
void OnPauseGame();
+ void OnPauseContinueGame();
void OnStopGame();
void OnMenuReportCompatibility();
void OnOpenModsPage();
@@ -268,6 +272,9 @@ private slots:
void OnMenuRecentFile();
void OnConfigure();
void OnConfigureTas();
+ void OnTasStartStop();
+ void OnTasRecord();
+ void OnTasReset();
void OnConfigurePerGame();
void OnLoadAmiibo();
void OnOpenYuzuFolder();
@@ -290,6 +297,9 @@ private slots:
void OnMouseActivity();
private:
+ /// Updates an action's shortcut and text to reflect an updated hotkey from the hotkey registry.
+ void LinkActionShortcut(QAction* action, const QString& action_name);
+
void RemoveBaseContent(u64 program_id, const QString& entry_type);
void RemoveUpdateContent(u64 program_id, const QString& entry_type);
void RemoveAddOnContent(u64 program_id, const QString& entry_type);
@@ -313,6 +323,7 @@ private:
void OpenURL(const QUrl& url);
void LoadTranslation();
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
+
QString GetTasStateDescription() const;
std::unique_ptr<Ui::MainWindow> ui;
diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui
index a62e39a06..5719b2ee4 100644
--- a/src/yuzu/main.ui
+++ b/src/yuzu/main.ui
@@ -66,7 +66,6 @@
<property name="title">
<string>&amp;Emulation</string>
</property>
- <addaction name="action_Start"/>
<addaction name="action_Pause"/>
<addaction name="action_Stop"/>
<addaction name="action_Restart"/>
@@ -79,39 +78,39 @@
<string>&amp;View</string>
</property>
<widget class="QMenu" name="menu_Reset_Window_Size">
- <property name="title">
- <string>&amp;Reset Window Size</string>
- </property>
+ <property name="title">
+ <string>&amp;Reset Window Size</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_View_Debugging">
+ <property name="title">
+ <string>&amp;Debugging</string>
+ </property>
</widget>
<action name="action_Reset_Window_Size_720">
- <property name="text">
- <string>Reset Window Size to &amp;720p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 720p</string>
- </property>
+ <property name="text">
+ <string>Reset Window Size to &amp;720p</string>
+ </property>
+ <property name="iconText">
+ <string>Reset Window Size to 720p</string>
+ </property>
</action>
<action name="action_Reset_Window_Size_900">
- <property name="text">
- <string>Reset Window Size to &amp;900p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 900p</string>
- </property>
+ <property name="text">
+ <string>Reset Window Size to &amp;900p</string>
+ </property>
+ <property name="iconText">
+ <string>Reset Window Size to 900p</string>
+ </property>
</action>
<action name="action_Reset_Window_Size_1080">
- <property name="text">
- <string>Reset Window Size to &amp;1080p</string>
- </property>
- <property name="iconText">
- <string>Reset Window Size to 1080p</string>
- </property>
- </action>
- <widget class="QMenu" name="menu_View_Debugging">
- <property name="title">
- <string>&amp;Debugging</string>
+ <property name="text">
+ <string>Reset Window Size to &amp;1080p</string>
</property>
- </widget>
+ <property name="iconText">
+ <string>Reset Window Size to 1080p</string>
+ </property>
+ </action>
<addaction name="action_Fullscreen"/>
<addaction name="action_Single_Window_Mode"/>
<addaction name="action_Display_Dock_Widget_Headers"/>
@@ -125,10 +124,20 @@
<property name="title">
<string>&amp;Tools</string>
</property>
+ <widget class="QMenu" name="menuTAS">
+ <property name="title">
+ <string>&amp;TAS</string>
+ </property>
+ <addaction name="action_TAS_Start"/>
+ <addaction name="action_TAS_Record"/>
+ <addaction name="action_TAS_Reset"/>
+ <addaction name="separator"/>
+ <addaction name="action_Configure_Tas"/>
+ </widget>
<addaction name="action_Rederive"/>
<addaction name="separator"/>
<addaction name="action_Capture_Screenshot"/>
- <addaction name="action_Configure_Tas"/>
+ <addaction name="menuTAS"/>
</widget>
<widget class="QMenu" name="menu_Help">
<property name="title">
@@ -170,14 +179,6 @@
<string>E&amp;xit</string>
</property>
</action>
- <action name="action_Start">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>&amp;Start</string>
- </property>
- </action>
<action name="action_Pause">
<property name="enabled">
<bool>false</bool>
@@ -309,7 +310,7 @@
</action>
<action name="action_Configure_Tas">
<property name="text">
- <string>Configure &amp;TAS...</string>
+ <string>&amp;Configure TAS...</string>
</property>
</action>
<action name="action_Configure_Current_Game">
@@ -320,6 +321,30 @@
<string>Configure C&amp;urrent Game...</string>
</property>
</action>
+ <action name="action_TAS_Start">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Start</string>
+ </property>
+ </action>
+ <action name="action_TAS_Reset">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Reset</string>
+ </property>
+ </action>
+ <action name="action_TAS_Record">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>R&amp;ecord</string>
+ </property>
+ </action>
</widget>
<resources>
<include location="yuzu.qrc"/>
diff --git a/src/yuzu/uisettings.cpp b/src/yuzu/uisettings.cpp
index 37499fc85..21683576c 100644
--- a/src/yuzu/uisettings.cpp
+++ b/src/yuzu/uisettings.cpp
@@ -7,8 +7,8 @@
namespace UISettings {
const Themes themes{{
- {"Light", "default"},
- {"Light Colorful", "colorful"},
+ {"Default", "default"},
+ {"Default Colorful", "colorful"},
{"Dark", "qdarkstyle"},
{"Dark Colorful", "colorful_dark"},
{"Midnight Blue", "qdarkstyle_midnight_blue"},
diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h
index 936914ef3..a610e7e25 100644
--- a/src/yuzu/uisettings.h
+++ b/src/yuzu/uisettings.h
@@ -74,7 +74,6 @@ struct Values {
QString game_dir_deprecated;
bool game_dir_deprecated_deepscan;
QVector<UISettings::GameDir> game_dirs;
- QVector<u64> favorited_ids;
QStringList recent_files;
QString language;
@@ -96,6 +95,8 @@ struct Values {
Settings::BasicSetting<uint8_t> row_2_text_id{2, "row_2_text_id"};
std::atomic_bool is_game_list_reload_pending{false};
Settings::BasicSetting<bool> cache_game_list{true, "cache_game_list"};
+ Settings::BasicSetting<bool> favorites_expanded{true, "favorites_expanded"};
+ QVector<u64> favorited_ids;
bool configuration_applied;
bool reset_to_defaults;
diff --git a/src/yuzu/util/controller_navigation.cpp b/src/yuzu/util/controller_navigation.cpp
new file mode 100644
index 000000000..86fb28b9f
--- /dev/null
+++ b/src/yuzu/util/controller_navigation.cpp
@@ -0,0 +1,177 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#include "common/settings_input.h"
+#include "core/hid/emulated_controller.h"
+#include "core/hid/hid_core.h"
+#include "yuzu/util/controller_navigation.h"
+
+ControllerNavigation::ControllerNavigation(Core::HID::HIDCore& hid_core, QWidget* parent) {
+ player1_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1);
+ handheld_controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
+ Core::HID::ControllerUpdateCallback engine_callback{
+ .on_change = [this](Core::HID::ControllerTriggerType type) { ControllerUpdateEvent(type); },
+ .is_npad_service = false,
+ };
+ player1_callback_key = player1_controller->SetCallback(engine_callback);
+ handheld_callback_key = handheld_controller->SetCallback(engine_callback);
+ is_controller_set = true;
+}
+
+ControllerNavigation::~ControllerNavigation() {
+ UnloadController();
+}
+
+void ControllerNavigation::UnloadController() {
+ if (is_controller_set) {
+ player1_controller->DeleteCallback(player1_callback_key);
+ handheld_controller->DeleteCallback(handheld_callback_key);
+ is_controller_set = false;
+ }
+}
+
+void ControllerNavigation::TriggerButton(Settings::NativeButton::Values native_button,
+ Qt::Key key) {
+ if (button_values[native_button].value && !button_values[native_button].locked) {
+ emit TriggerKeyboardEvent(key);
+ }
+}
+
+void ControllerNavigation::ControllerUpdateEvent(Core::HID::ControllerTriggerType type) {
+ std::lock_guard lock{mutex};
+ if (type == Core::HID::ControllerTriggerType::Button) {
+ ControllerUpdateButton();
+ return;
+ }
+
+ if (type == Core::HID::ControllerTriggerType::Stick) {
+ ControllerUpdateStick();
+ return;
+ }
+}
+
+void ControllerNavigation::ControllerUpdateButton() {
+ const auto controller_type = player1_controller->GetNpadStyleIndex();
+ const auto& player1_buttons = player1_controller->GetButtonsValues();
+ const auto& handheld_buttons = handheld_controller->GetButtonsValues();
+
+ for (std::size_t i = 0; i < player1_buttons.size(); ++i) {
+ const bool button = player1_buttons[i].value || handheld_buttons[i].value;
+ // Trigger only once
+ button_values[i].locked = button == button_values[i].value;
+ button_values[i].value = button;
+ }
+
+ switch (controller_type) {
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::Handheld:
+ case Core::HID::NpadStyleIndex::GameCube:
+ TriggerButton(Settings::NativeButton::A, Qt::Key_Enter);
+ TriggerButton(Settings::NativeButton::B, Qt::Key_Escape);
+ TriggerButton(Settings::NativeButton::DDown, Qt::Key_Down);
+ TriggerButton(Settings::NativeButton::DLeft, Qt::Key_Left);
+ TriggerButton(Settings::NativeButton::DRight, Qt::Key_Right);
+ TriggerButton(Settings::NativeButton::DUp, Qt::Key_Up);
+ break;
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ TriggerButton(Settings::NativeButton::DDown, Qt::Key_Enter);
+ TriggerButton(Settings::NativeButton::DLeft, Qt::Key_Escape);
+ break;
+ case Core::HID::NpadStyleIndex::JoyconRight:
+ TriggerButton(Settings::NativeButton::X, Qt::Key_Enter);
+ TriggerButton(Settings::NativeButton::A, Qt::Key_Escape);
+ break;
+ default:
+ break;
+ }
+}
+
+void ControllerNavigation::ControllerUpdateStick() {
+ const auto controller_type = player1_controller->GetNpadStyleIndex();
+ const auto& player1_sticks = player1_controller->GetSticksValues();
+ const auto& handheld_sticks = player1_controller->GetSticksValues();
+ bool update = false;
+
+ for (std::size_t i = 0; i < player1_sticks.size(); ++i) {
+ const Common::Input::StickStatus stick{
+ .left = player1_sticks[i].left || handheld_sticks[i].left,
+ .right = player1_sticks[i].right || handheld_sticks[i].right,
+ .up = player1_sticks[i].up || handheld_sticks[i].up,
+ .down = player1_sticks[i].down || handheld_sticks[i].down,
+ };
+ // Trigger only once
+ if (stick.down != stick_values[i].down || stick.left != stick_values[i].left ||
+ stick.right != stick_values[i].right || stick.up != stick_values[i].up) {
+ update = true;
+ }
+ stick_values[i] = stick;
+ }
+
+ if (!update) {
+ return;
+ }
+
+ switch (controller_type) {
+ case Core::HID::NpadStyleIndex::ProController:
+ case Core::HID::NpadStyleIndex::JoyconDual:
+ case Core::HID::NpadStyleIndex::Handheld:
+ case Core::HID::NpadStyleIndex::GameCube:
+ if (stick_values[Settings::NativeAnalog::LStick].down) {
+ emit TriggerKeyboardEvent(Qt::Key_Down);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].left) {
+ emit TriggerKeyboardEvent(Qt::Key_Left);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].right) {
+ emit TriggerKeyboardEvent(Qt::Key_Right);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].up) {
+ emit TriggerKeyboardEvent(Qt::Key_Up);
+ return;
+ }
+ break;
+ case Core::HID::NpadStyleIndex::JoyconLeft:
+ if (stick_values[Settings::NativeAnalog::LStick].left) {
+ emit TriggerKeyboardEvent(Qt::Key_Down);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].up) {
+ emit TriggerKeyboardEvent(Qt::Key_Left);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].down) {
+ emit TriggerKeyboardEvent(Qt::Key_Right);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::LStick].right) {
+ emit TriggerKeyboardEvent(Qt::Key_Up);
+ return;
+ }
+ break;
+ case Core::HID::NpadStyleIndex::JoyconRight:
+ if (stick_values[Settings::NativeAnalog::RStick].right) {
+ emit TriggerKeyboardEvent(Qt::Key_Down);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::RStick].down) {
+ emit TriggerKeyboardEvent(Qt::Key_Left);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::RStick].up) {
+ emit TriggerKeyboardEvent(Qt::Key_Right);
+ return;
+ }
+ if (stick_values[Settings::NativeAnalog::RStick].left) {
+ emit TriggerKeyboardEvent(Qt::Key_Up);
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+}
diff --git a/src/yuzu/util/controller_navigation.h b/src/yuzu/util/controller_navigation.h
new file mode 100644
index 000000000..7c616a088
--- /dev/null
+++ b/src/yuzu/util/controller_navigation.h
@@ -0,0 +1,51 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included
+
+#pragma once
+
+#include <QKeyEvent>
+#include <QObject>
+
+#include "common/input.h"
+#include "common/settings_input.h"
+
+namespace Core::HID {
+using ButtonValues = std::array<Common::Input::ButtonStatus, Settings::NativeButton::NumButtons>;
+using SticksValues = std::array<Common::Input::StickStatus, Settings::NativeAnalog::NumAnalogs>;
+enum class ControllerTriggerType;
+class EmulatedController;
+class HIDCore;
+} // namespace Core::HID
+
+class ControllerNavigation : public QObject {
+ Q_OBJECT
+
+public:
+ explicit ControllerNavigation(Core::HID::HIDCore& hid_core, QWidget* parent = nullptr);
+ ~ControllerNavigation();
+
+ /// Disables events from the emulated controller
+ void UnloadController();
+
+signals:
+ void TriggerKeyboardEvent(Qt::Key key);
+
+private:
+ void TriggerButton(Settings::NativeButton::Values native_button, Qt::Key key);
+ void ControllerUpdateEvent(Core::HID::ControllerTriggerType type);
+
+ void ControllerUpdateButton();
+
+ void ControllerUpdateStick();
+
+ Core::HID::ButtonValues button_values{};
+ Core::HID::SticksValues stick_values{};
+
+ int player1_callback_key{};
+ int handheld_callback_key{};
+ bool is_controller_set{};
+ mutable std::mutex mutex;
+ Core::HID::EmulatedController* player1_controller;
+ Core::HID::EmulatedController* handheld_controller;
+};
diff --git a/src/yuzu/util/overlay_dialog.cpp b/src/yuzu/util/overlay_dialog.cpp
index 95b148545..c66dfbdff 100644
--- a/src/yuzu/util/overlay_dialog.cpp
+++ b/src/yuzu/util/overlay_dialog.cpp
@@ -6,7 +6,8 @@
#include <QScreen>
#include "core/core.h"
-#include "core/frontend/input_interpreter.h"
+#include "core/hid/hid_types.h"
+#include "core/hid/input_interpreter.h"
#include "ui_overlay_dialog.h"
#include "yuzu/util/overlay_dialog.h"
@@ -179,9 +180,9 @@ void OverlayDialog::MoveAndResizeWindow() {
QDialog::resize(width, height);
}
-template <HIDButton... T>
+template <Core::HID::NpadButton... T>
void OverlayDialog::HandleButtonPressedOnce() {
- const auto f = [this](HIDButton button) {
+ const auto f = [this](Core::HID::NpadButton button) {
if (input_interpreter->IsButtonPressedOnce(button)) {
TranslateButtonPress(button);
}
@@ -190,7 +191,7 @@ void OverlayDialog::HandleButtonPressedOnce() {
(f(T), ...);
}
-void OverlayDialog::TranslateButtonPress(HIDButton button) {
+void OverlayDialog::TranslateButtonPress(Core::HID::NpadButton button) {
QPushButton* left_button = use_rich_text ? ui->button_cancel_rich : ui->button_cancel;
QPushButton* right_button = use_rich_text ? ui->button_ok_rich : ui->button_ok_label;
@@ -198,20 +199,20 @@ void OverlayDialog::TranslateButtonPress(HIDButton button) {
// TODO (Morph): focusPrevious/NextChild() doesn't work well with the rich text dialog, fix it
switch (button) {
- case HIDButton::A:
- case HIDButton::B:
+ case Core::HID::NpadButton::A:
+ case Core::HID::NpadButton::B:
if (left_button->hasFocus()) {
left_button->click();
} else if (right_button->hasFocus()) {
right_button->click();
}
break;
- case HIDButton::DLeft:
- case HIDButton::LStickLeft:
+ case Core::HID::NpadButton::Left:
+ case Core::HID::NpadButton::StickLLeft:
focusPreviousChild();
break;
- case HIDButton::DRight:
- case HIDButton::LStickRight:
+ case Core::HID::NpadButton::Right:
+ case Core::HID::NpadButton::StickLRight:
focusNextChild();
break;
default:
@@ -241,8 +242,10 @@ void OverlayDialog::InputThread() {
while (input_thread_running) {
input_interpreter->PollInput();
- HandleButtonPressedOnce<HIDButton::A, HIDButton::B, HIDButton::DLeft, HIDButton::DRight,
- HIDButton::LStickLeft, HIDButton::LStickRight>();
+ HandleButtonPressedOnce<Core::HID::NpadButton::A, Core::HID::NpadButton::B,
+ Core::HID::NpadButton::Left, Core::HID::NpadButton::Right,
+ Core::HID::NpadButton::StickLLeft,
+ Core::HID::NpadButton::StickLRight>();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
diff --git a/src/yuzu/util/overlay_dialog.h b/src/yuzu/util/overlay_dialog.h
index e8c388bd0..d8a140ff3 100644
--- a/src/yuzu/util/overlay_dialog.h
+++ b/src/yuzu/util/overlay_dialog.h
@@ -13,14 +13,16 @@
#include "common/common_types.h"
-enum class HIDButton : u8;
-
class InputInterpreter;
namespace Core {
class System;
}
+namespace Core::HID {
+enum class NpadButton : u64;
+}
+
namespace Ui {
class OverlayDialog;
}
@@ -79,7 +81,7 @@ private:
*
* @tparam HIDButton The list of buttons that can be converted into keyboard input.
*/
- template <HIDButton... T>
+ template <Core::HID::NpadButton... T>
void HandleButtonPressedOnce();
/**
@@ -87,7 +89,7 @@ private:
*
* @param button The button press to process.
*/
- void TranslateButtonPress(HIDButton button);
+ void TranslateButtonPress(Core::HID::NpadButton button);
void StartInputThread();
void StopInputThread();
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 33241ea98..8e9c7d211 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -24,7 +24,6 @@
#include "common/settings.h"
#include "core/hle/service/acc/profile_manager.h"
#include "input_common/main.h"
-#include "input_common/udp/client.h"
#include "yuzu_cmd/config.h"
#include "yuzu_cmd/default_ini.h"
@@ -84,163 +83,6 @@ static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs>
},
}};
-static const std::array<int, Settings::NativeMouseButton::NumMouseButtons> default_mouse_buttons = {
- SDL_SCANCODE_LEFTBRACKET, SDL_SCANCODE_RIGHTBRACKET, SDL_SCANCODE_APOSTROPHE,
- SDL_SCANCODE_MINUS, SDL_SCANCODE_EQUALS,
-};
-
-static const std::array<int, 0x8A> keyboard_keys = {
- 0,
- 0,
- 0,
- 0,
- SDL_SCANCODE_A,
- SDL_SCANCODE_B,
- SDL_SCANCODE_C,
- SDL_SCANCODE_D,
- SDL_SCANCODE_E,
- SDL_SCANCODE_F,
- SDL_SCANCODE_G,
- SDL_SCANCODE_H,
- SDL_SCANCODE_I,
- SDL_SCANCODE_J,
- SDL_SCANCODE_K,
- SDL_SCANCODE_L,
- SDL_SCANCODE_M,
- SDL_SCANCODE_N,
- SDL_SCANCODE_O,
- SDL_SCANCODE_P,
- SDL_SCANCODE_Q,
- SDL_SCANCODE_R,
- SDL_SCANCODE_S,
- SDL_SCANCODE_T,
- SDL_SCANCODE_U,
- SDL_SCANCODE_V,
- SDL_SCANCODE_W,
- SDL_SCANCODE_X,
- SDL_SCANCODE_Y,
- SDL_SCANCODE_Z,
- SDL_SCANCODE_1,
- SDL_SCANCODE_2,
- SDL_SCANCODE_3,
- SDL_SCANCODE_4,
- SDL_SCANCODE_5,
- SDL_SCANCODE_6,
- SDL_SCANCODE_7,
- SDL_SCANCODE_8,
- SDL_SCANCODE_9,
- SDL_SCANCODE_0,
- SDL_SCANCODE_RETURN,
- SDL_SCANCODE_ESCAPE,
- SDL_SCANCODE_BACKSPACE,
- SDL_SCANCODE_TAB,
- SDL_SCANCODE_SPACE,
- SDL_SCANCODE_MINUS,
- SDL_SCANCODE_EQUALS,
- SDL_SCANCODE_LEFTBRACKET,
- SDL_SCANCODE_RIGHTBRACKET,
- SDL_SCANCODE_BACKSLASH,
- 0,
- SDL_SCANCODE_SEMICOLON,
- SDL_SCANCODE_APOSTROPHE,
- SDL_SCANCODE_GRAVE,
- SDL_SCANCODE_COMMA,
- SDL_SCANCODE_PERIOD,
- SDL_SCANCODE_SLASH,
- SDL_SCANCODE_CAPSLOCK,
-
- SDL_SCANCODE_F1,
- SDL_SCANCODE_F2,
- SDL_SCANCODE_F3,
- SDL_SCANCODE_F4,
- SDL_SCANCODE_F5,
- SDL_SCANCODE_F6,
- SDL_SCANCODE_F7,
- SDL_SCANCODE_F8,
- SDL_SCANCODE_F9,
- SDL_SCANCODE_F10,
- SDL_SCANCODE_F11,
- SDL_SCANCODE_F12,
-
- 0,
- SDL_SCANCODE_SCROLLLOCK,
- SDL_SCANCODE_PAUSE,
- SDL_SCANCODE_INSERT,
- SDL_SCANCODE_HOME,
- SDL_SCANCODE_PAGEUP,
- SDL_SCANCODE_DELETE,
- SDL_SCANCODE_END,
- SDL_SCANCODE_PAGEDOWN,
- SDL_SCANCODE_RIGHT,
- SDL_SCANCODE_LEFT,
- SDL_SCANCODE_DOWN,
- SDL_SCANCODE_UP,
-
- SDL_SCANCODE_NUMLOCKCLEAR,
- SDL_SCANCODE_KP_DIVIDE,
- SDL_SCANCODE_KP_MULTIPLY,
- SDL_SCANCODE_KP_MINUS,
- SDL_SCANCODE_KP_PLUS,
- SDL_SCANCODE_KP_ENTER,
- SDL_SCANCODE_KP_1,
- SDL_SCANCODE_KP_2,
- SDL_SCANCODE_KP_3,
- SDL_SCANCODE_KP_4,
- SDL_SCANCODE_KP_5,
- SDL_SCANCODE_KP_6,
- SDL_SCANCODE_KP_7,
- SDL_SCANCODE_KP_8,
- SDL_SCANCODE_KP_9,
- SDL_SCANCODE_KP_0,
- SDL_SCANCODE_KP_PERIOD,
-
- 0,
- 0,
- SDL_SCANCODE_POWER,
- SDL_SCANCODE_KP_EQUALS,
-
- SDL_SCANCODE_F13,
- SDL_SCANCODE_F14,
- SDL_SCANCODE_F15,
- SDL_SCANCODE_F16,
- SDL_SCANCODE_F17,
- SDL_SCANCODE_F18,
- SDL_SCANCODE_F19,
- SDL_SCANCODE_F20,
- SDL_SCANCODE_F21,
- SDL_SCANCODE_F22,
- SDL_SCANCODE_F23,
- SDL_SCANCODE_F24,
-
- 0,
- SDL_SCANCODE_HELP,
- SDL_SCANCODE_MENU,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- SDL_SCANCODE_KP_COMMA,
- SDL_SCANCODE_KP_LEFTPAREN,
- SDL_SCANCODE_KP_RIGHTPAREN,
- 0,
- 0,
- 0,
- 0,
-};
-
-static const std::array<int, 8> keyboard_mods{
- SDL_SCANCODE_LCTRL, SDL_SCANCODE_LSHIFT, SDL_SCANCODE_LALT, SDL_SCANCODE_LGUI,
- SDL_SCANCODE_RCTRL, SDL_SCANCODE_RSHIFT, SDL_SCANCODE_RALT, SDL_SCANCODE_RGUI,
-};
-
template <>
void Config::ReadSetting(const std::string& group, Settings::BasicSetting<std::string>& setting) {
setting = sdl2_config->Get(group, setting.GetLabel(), setting.GetDefault());
@@ -284,16 +126,6 @@ void Config::ReadValues() {
}
ReadSetting("ControlsGeneral", Settings::values.mouse_enabled);
- for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
- std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
- Settings::values.mouse_buttons[i] = sdl2_config->Get(
- "ControlsGeneral", std::string("mouse_") + Settings::NativeMouseButton::mapping[i],
- default_param);
- if (Settings::values.mouse_buttons[i].empty())
- Settings::values.mouse_buttons[i] = default_param;
- }
-
- ReadSetting("ControlsGeneral", Settings::values.motion_device);
ReadSetting("ControlsGeneral", Settings::values.touch_device);
@@ -363,21 +195,11 @@ void Config::ReadValues() {
Settings::TouchFromButtonMap{"default", {}});
num_touch_from_button_maps = 1;
}
- ReadSetting("ControlsGeneral", Settings::values.use_touch_from_button);
Settings::values.touch_from_button_map_index = std::clamp(
Settings::values.touch_from_button_map_index.GetValue(), 0, num_touch_from_button_maps - 1);
ReadSetting("ControlsGeneral", Settings::values.udp_input_servers);
- std::transform(keyboard_keys.begin(), keyboard_keys.end(),
- Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam);
- std::transform(keyboard_mods.begin(), keyboard_mods.end(),
- Settings::values.keyboard_keys.begin() +
- Settings::NativeKeyboard::LeftControlKey,
- InputCommon::GenerateKeyboardParam);
- std::transform(keyboard_mods.begin(), keyboard_mods.end(),
- Settings::values.keyboard_mods.begin(), InputCommon::GenerateKeyboardParam);
-
// Data Storage
ReadSetting("Data Storage", Settings::values.use_virtual_sd);
FS::SetYuzuPath(FS::YuzuPath::NANDDir,
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index ecdc271a8..6d613bf7a 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -84,23 +84,10 @@ enable_accurate_vibrations=
# 0: Disabled, 1 (default): Enabled
motion_enabled =
-# for motion input, the following devices are available:
-# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
-# - "update_period": update period in milliseconds (default to 100)
-# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01)
-# - "cemuhookudp" reads motion input from a udp server that uses cemuhook's udp protocol
-motion_device=
-
-# for touch input, the following devices are available:
-# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required
-# - "cemuhookudp" reads touch input from a udp server that uses cemuhook's udp protocol
-# - "min_x", "min_y", "max_x", "max_y": defines the udp device's touch screen coordinate system
+# Defines the udp device's touch screen coordinate system for cemuhookudp devices
+# - "min_x", "min_y", "max_x", "max_y"
touch_device=
-# Whether to enable or disable touch input from button
-# 0 (default): Disabled, 1: Enabled
-use_touch_from_button=
-
# for mapping buttons to touch inputs.
#touch_from_button_map=1
#touch_from_button_maps_0_name=default
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
index 87fce0c23..57f807826 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp
@@ -9,10 +9,10 @@
#include "common/settings.h"
#include "core/core.h"
#include "core/perf_stats.h"
-#include "input_common/keyboard.h"
+#include "input_common/drivers/keyboard.h"
+#include "input_common/drivers/mouse.h"
+#include "input_common/drivers/touch_screen.h"
#include "input_common/main.h"
-#include "input_common/mouse/mouse_input.h"
-#include "input_common/sdl/sdl.h"
#include "yuzu_cmd/emu_window/emu_window_sdl2.h"
#include "yuzu_cmd/yuzu_icon.h"
@@ -32,42 +32,32 @@ EmuWindow_SDL2::~EmuWindow_SDL2() {
}
void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
- TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0), 0);
-
- input_subsystem->GetMouse()->MouseMove(x, y, 0, 0);
+ input_subsystem->GetMouse()->MouseMove(x, y, 0, 0, 0, 0);
}
-MouseInput::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) const {
+InputCommon::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) const {
switch (button) {
case SDL_BUTTON_LEFT:
- return MouseInput::MouseButton::Left;
+ return InputCommon::MouseButton::Left;
case SDL_BUTTON_RIGHT:
- return MouseInput::MouseButton::Right;
+ return InputCommon::MouseButton::Right;
case SDL_BUTTON_MIDDLE:
- return MouseInput::MouseButton::Wheel;
+ return InputCommon::MouseButton::Wheel;
case SDL_BUTTON_X1:
- return MouseInput::MouseButton::Backward;
+ return InputCommon::MouseButton::Backward;
case SDL_BUTTON_X2:
- return MouseInput::MouseButton::Forward;
+ return InputCommon::MouseButton::Forward;
default:
- return MouseInput::MouseButton::Undefined;
+ return InputCommon::MouseButton::Undefined;
}
}
void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
const auto mouse_button = SDLButtonToMouseButton(button);
- if (button == SDL_BUTTON_LEFT) {
- if (state == SDL_PRESSED) {
- TouchPressed((unsigned)std::max(x, 0), (unsigned)std::max(y, 0), 0);
- } else {
- TouchReleased(0);
- }
+ if (state == SDL_PRESSED) {
+ input_subsystem->GetMouse()->PressButton(x, y, 0, 0, mouse_button);
} else {
- if (state == SDL_PRESSED) {
- input_subsystem->GetMouse()->PressButton(x, y, mouse_button);
- } else {
- input_subsystem->GetMouse()->ReleaseButton(mouse_button);
- }
+ input_subsystem->GetMouse()->ReleaseButton(mouse_button);
}
}
@@ -82,29 +72,35 @@ std::pair<unsigned, unsigned> EmuWindow_SDL2::TouchToPixelPos(float touch_x, flo
static_cast<unsigned>(std::max(std::round(touch_y), 0.0f))};
}
-void EmuWindow_SDL2::OnFingerDown(float x, float y) {
- // TODO(NeatNit): keep track of multitouch using the fingerID and a dictionary of some kind
- // This isn't critical because the best we can do when we have that is to average them, like the
- // 3DS does
-
+void EmuWindow_SDL2::OnFingerDown(float x, float y, std::size_t id) {
+ int width, height;
+ SDL_GetWindowSize(render_window, &width, &height);
const auto [px, py] = TouchToPixelPos(x, y);
- TouchPressed(px, py, 0);
+ const float fx = px * 1.0f / width;
+ const float fy = py * 1.0f / height;
+
+ input_subsystem->GetTouchScreen()->TouchPressed(fx, fy, id);
}
-void EmuWindow_SDL2::OnFingerMotion(float x, float y) {
+void EmuWindow_SDL2::OnFingerMotion(float x, float y, std::size_t id) {
+ int width, height;
+ SDL_GetWindowSize(render_window, &width, &height);
const auto [px, py] = TouchToPixelPos(x, y);
- TouchMoved(px, py, 0);
+ const float fx = px * 1.0f / width;
+ const float fy = py * 1.0f / height;
+
+ input_subsystem->GetTouchScreen()->TouchMoved(fx, fy, id);
}
void EmuWindow_SDL2::OnFingerUp() {
- TouchReleased(0);
+ input_subsystem->GetTouchScreen()->TouchReleased(0);
}
void EmuWindow_SDL2::OnKeyEvent(int key, u8 state) {
if (state == SDL_PRESSED) {
- input_subsystem->GetKeyboard()->PressKey(key);
+ input_subsystem->GetKeyboard()->PressKey(static_cast<std::size_t>(key));
} else if (state == SDL_RELEASED) {
- input_subsystem->GetKeyboard()->ReleaseKey(key);
+ input_subsystem->GetKeyboard()->ReleaseKey(static_cast<std::size_t>(key));
}
}
@@ -205,10 +201,12 @@ void EmuWindow_SDL2::WaitEvent() {
}
break;
case SDL_FINGERDOWN:
- OnFingerDown(event.tfinger.x, event.tfinger.y);
+ OnFingerDown(event.tfinger.x, event.tfinger.y,
+ static_cast<std::size_t>(event.tfinger.touchId));
break;
case SDL_FINGERMOTION:
- OnFingerMotion(event.tfinger.x, event.tfinger.y);
+ OnFingerMotion(event.tfinger.x, event.tfinger.y,
+ static_cast<std::size_t>(event.tfinger.touchId));
break;
case SDL_FINGERUP:
OnFingerUp();
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.h b/src/yuzu_cmd/emu_window/emu_window_sdl2.h
index 4810f8775..0af002693 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2.h
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.h
@@ -16,11 +16,8 @@ class System;
namespace InputCommon {
class InputSubsystem;
-}
-
-namespace MouseInput {
enum class MouseButton;
-}
+} // namespace InputCommon
class EmuWindow_SDL2 : public Core::Frontend::EmuWindow {
public:
@@ -47,7 +44,7 @@ protected:
void OnMouseMotion(s32 x, s32 y);
/// Converts a SDL mouse button into MouseInput mouse button
- MouseInput::MouseButton SDLButtonToMouseButton(u32 button) const;
+ InputCommon::MouseButton SDLButtonToMouseButton(u32 button) const;
/// Called by WaitEvent when a mouse button is pressed or released
void OnMouseButton(u32 button, u8 state, s32 x, s32 y);
@@ -56,10 +53,10 @@ protected:
std::pair<unsigned, unsigned> TouchToPixelPos(float touch_x, float touch_y) const;
/// Called by WaitEvent when a finger starts touching the touchscreen
- void OnFingerDown(float x, float y);
+ void OnFingerDown(float x, float y, std::size_t id);
/// Called by WaitEvent when a finger moves while touching the touchscreen
- void OnFingerMotion(float x, float y);
+ void OnFingerMotion(float x, float y, std::size_t id);
/// Called by WaitEvent when a finger stops touching the touchscreen
void OnFingerUp();
diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
index a075ad08a..70db865ec 100644
--- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
+++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
@@ -17,7 +17,6 @@
#include "common/settings.h"
#include "common/string_util.h"
#include "core/core.h"
-#include "input_common/keyboard.h"
#include "input_common/main.h"
#include "video_core/renderer_base.h"
#include "yuzu_cmd/emu_window/emu_window_sdl2_gl.h"