Merge remote-tracking branch 'origin/master' into dev

This commit is contained in:
Flyinghead 2023-02-19 14:10:37 +01:00
commit a156edbd73
20 changed files with 994 additions and 888 deletions

View File

@ -73,7 +73,7 @@ if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(WINDOWS_STORE)
string(REPLACE "v" "" MS_VERSION ${GIT_VERSION})
string(REGEX REPLACE "[Vv]" "" MS_VERSION ${GIT_VERSION})
string(REPLACE "-" "." MS_VERSION ${MS_VERSION})
string(REGEX REPLACE "\.g[0-9a-f]+" "" MS_VERSION ${MS_VERSION})
string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" VERSION_3PARTS ${MS_VERSION})
@ -176,10 +176,6 @@ else()
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-fno-strict-aliasing>
$<$<COMPILE_LANGUAGE:CXX>:-Wall>)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-Wno-nullability-completeness>)
endif()
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE
@ -1184,6 +1180,7 @@ if(USE_VULKAN)
endif()
add_library(VulkanMemoryAllocator INTERFACE)
target_compile_options(VulkanMemoryAllocator INTERFACE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:AppleClang,Clang>>:-Wno-nullability-completeness>)
target_include_directories(VulkanMemoryAllocator INTERFACE core/deps/VulkanMemoryAllocator/include)
target_link_libraries(${PROJECT_NAME} PRIVATE VulkanMemoryAllocator)

View File

@ -15,7 +15,7 @@ Join us on our [**Discord server**](https://discord.gg/X8YWP8w) for a chat.
## Install
### Flatpak (Linux)
### Flatpak (Linux ![ubuntu logo](https://flyinghead.github.io/flycast-builds/ubuntu.png))
1. [Set up Flatpak](https://www.flatpak.org/setup/).
@ -27,7 +27,7 @@ Join us on our [**Discord server**](https://discord.gg/X8YWP8w) for a chat.
`flatpak run org.flycast.Flycast`
### Homebrew (MacOS)
### Homebrew (MacOS ![apple logo](https://flyinghead.github.io/flycast-builds/apple.png))
1. [Set up Homebrew](https://brew.sh).
@ -35,7 +35,7 @@ Join us on our [**Discord server**](https://discord.gg/X8YWP8w) for a chat.
`brew install --cask flycast`
### Xbox One/Series
### Xbox One/Series ![xbox logo](https://flyinghead.github.io/flycast-builds/xbox.png)
#### Retail:
Open [**gamr13's github page**](https://gamr13.github.io/) from your Xbox console.
@ -43,7 +43,7 @@ Open [**gamr13's github page**](https://gamr13.github.io/) from your Xbox consol
#### Dev Mode:
Grab the latest build from [**the builds page**](https://flyinghead.github.io/flycast-builds/), or the [**GitHub Actions**](https://github.com/flyinghead/flycast/actions/workflows/uwp.yml). Then install it using the **Xbox Device Portal**.
### Binaries
### Binaries ![android](https://flyinghead.github.io/flycast-builds/android.jpg) ![windows](https://flyinghead.github.io/flycast-builds/windows.png) ![linux](https://flyinghead.github.io/flycast-builds/ubuntu.png) ![apple](https://flyinghead.github.io/flycast-builds/apple.png) ![switch](https://flyinghead.github.io/flycast-builds/switch.png) ![xbox](https://flyinghead.github.io/flycast-builds/xbox.png)
Get fresh builds for your system [**on the builds page**](https://flyinghead.github.io/flycast-builds/).

View File

@ -150,7 +150,8 @@ const WidescreenCheat CheatManager::widescreen_cheats[] =
{ "MK-5102250", "V1.001", { 0x107FDC, 0x11253C }, { 0x3F99999A, 0x3F900000 } }, // Metropolis Street Racer (v1.001) (PAL)
{ "MK-5102250", "V1.009", { 0x106B5C, 0x1111F4 }, { 0x3F99999A, 0x3F900000 } }, // Metropolis Street Racer (v1.009) (PAL)
{ "MK-51012", nullptr, { 0x10A01C, 0x1146FC }, { 0x3F99999A, 0x3F900000 } }, // Metropolis Street Racer (USA)
{ "T0000M", nullptr, { 0x1CAEAC, 0x1CAEDC }, { 0x43F00000, 0x3F400000 } }, // Millenium Racer Y2K Fighters
{ "T0000M", "MILLENNIUM RACER - Y2K FIGHTERS ",
{ 0x1CAEAC, 0x1CAEDC }, { 0x43F00000, 0x3F400000 } }, // Millenium Racer Y2K Fighters
{ "T1221M", nullptr, { 0x426B74 }, { 0x43F00000 } }, // Moero! Justice Gauken (JP)
{ "T9701D", nullptr, { 0x31290C }, { 0x3F400000 } }, // Mortal Kombat Gold (PAL)
{ "T-9701N", nullptr, { 0x337B8C }, { 0x3FA66666 } }, // Mortal Kombat Gold (USA)
@ -434,6 +435,21 @@ void CheatManager::reset(const std::string& gameId)
cheats.emplace_back(Cheat::Type::setValue, "Skip DIMM version check", true, 16, 0x0007f486, 0xe001); // mov #1, r0
cheats.back().builtIn = true;
}
else if (gameId == "Fixed BOOT strapper") // Extreme Hunting 2
{
setActive(true);
cheats.emplace_back(Cheat::Type::runNextIfEq, "skip netbd check ifeq", true, 32, 0x00067b04, 0);
cheats.back().builtIn = true;
cheats.emplace_back(Cheat::Type::setValue, "skip netbd check", true, 32, 0x00067b04, 1); // 1 skips initNetwork()
cheats.back().builtIn = true;
cheats.emplace_back(Cheat::Type::setValue, "skip netbd check 2", true, 16, 0x0009acc8, 0x0009); // not acceptable by main board
cheats.back().builtIn = true;
// ac010000 should be d202 9302, but is changed to 78c0 8c93
cheats.emplace_back(Cheat::Type::runNextIfEq, "fix boot ifeq", true, 32, 0x00010000, 0x8c9378c0);
cheats.back().builtIn = true;
cheats.emplace_back(Cheat::Type::setValue, "fix boot", true, 32, 0x00010000, 0x9302d202);
cheats.back().builtIn = true;
}
}
if (config::WidescreenGameHacks)
{

View File

@ -196,16 +196,13 @@ static void loadSpecialSettings()
NOTICE_LOG(BOOT, "Game doesn't support RGB. Using TV Composite instead");
config::Cable.override(3);
}
if (prod_id == "T9512N" // The Grinch (US)
|| prod_id == "T9503D" // The Grinch (EU)
|| prod_id == "T-9707N" // San Francisco Rush 2049 (US)
|| prod_id == "T-9709D-50" // San Francisco Rush 2049 (EU)
|| prod_id == "T7001D 50" // Jimmy White's 2 Cueball
if (prod_id == "T7001D 50" // Jimmy White's 2 Cueball
|| prod_id == "T40505D 50" // Railroad Tycoon 2 (EU)
|| prod_id == "T18702M" // Miss Moonlight
|| prod_id == "T0019M" // KenJu Atomiswave DC Conversion
|| prod_id == "T0020M" // Force Five Atomiswave DC Conversion
|| prod_id == "HDR-0187") // Fushigi no Dungeon - Fuurai no Shiren Gaiden - Onna Kenshi Asuka Kenzan!
|| prod_id == "HDR-0187" // Fushigi no Dungeon - Fuurai no Shiren Gaiden - Onna Kenshi Asuka Kenzan!
|| prod_id == "T15104D 50") // Slave Zero (PAL)
{
NOTICE_LOG(BOOT, "Forcing real BIOS");
config::UseReios.override(false);
@ -224,7 +221,8 @@ static void loadSpecialSettings()
config::Broadcast.override(1);
}
if (prod_id == "T1102M" // Densha de Go! 2
|| prod_id == "T00000A") // The Ring of the Nibelungen (demo, hack)
|| prod_id == "T00000A" // The Ring of the Nibelungen (demo, hack)
|| prod_id == "T15124N 00") // Worms Pinball (prototype)
{
NOTICE_LOG(BOOT, "Forcing Full Framebuffer Emulation");
config::EmulateFramebuffer.override(true);
@ -286,8 +284,9 @@ static void loadSpecialSettings()
else if (prod_id == "NINJA ASSAULT"
|| prod_id == "Sports Shooting USA" // AW
|| prod_id == "SEGA CLAY CHALLENGE" // AW
|| prod_id == "RANGER MISSION" // AW
|| prod_id == "EXTREME HUNTING") // AW
|| prod_id == "RANGER MISSION" // AW
|| prod_id == "EXTREME HUNTING" // AW
|| prod_id == "Fixed BOOT strapper")// Extreme hunting 2 (AW)
{
INFO_LOG(BOOT, "Enabling lightgun setup for game %s", prod_id.c_str());
settings.input.JammaSetup = JVS::LightGun;

View File

@ -261,7 +261,7 @@ static void maple_DoDma()
// Maple bus max speed: 2 Mb/s, actual speed: 1 Mb/s
//printf("Maple XFER size %d bytes - %.2f ms\n", xfer_count, xfer_count * 1000.0f / (128 * 1024));
if (!occupy)
sh4_sched_request(maple_schid, std::min((u64)xfer_count * (SH4_MAIN_CLOCK / (128 * 1024)), (u64)SH4_MAIN_CLOCK));
sh4_sched_request(maple_schid, std::min((u64)xfer_count * (SH4_MAIN_CLOCK / (256 * 1024)), (u64)SH4_MAIN_CLOCK));
}
static int maple_schd(int tag, int c, int j)

View File

@ -144,7 +144,6 @@ void sortTriangles(rend_context& ctx, RenderPass& pass, const RenderPass& previo
//re-assemble them into drawing commands
size_t initialSize = ctx.sortedTriangles.size();
int idx = -1;
int idxSize = ctx.idx.size();
@ -182,7 +181,7 @@ void sortTriangles(rend_context& ctx, RenderPass& pass, const RenderPass& previo
// Add a dummy one to signal we're using sorted triangles
ctx.sortedTriangles.push_back({ pp_base, 0, 0});
}
pass.sorted_tr_count = ctx.sortedTriangles.size() - initialSize;
pass.sorted_tr_count = ctx.sortedTriangles.size();
#if PRINT_SORT_STATS
printf("Reassembled into %d from %d\n", (int)ctx.sortedTriangles.size(), pp_end - pp_base);

View File

@ -1171,6 +1171,7 @@ static void parseRenderPass(RenderPass& pass, const RenderPass& previousPass, re
makeIndex(ctx.global_param_op, previousPass.op_count, pass.op_count, true, ctx);
makeIndex(ctx.global_param_pt, previousPass.pt_count, pass.pt_count, true, ctx);
}
pass.sorted_tr_count = previousPass.sorted_tr_count;
if (pass.autosort && !perPixel)
{
if (config::PerStripSorting)

View File

@ -12,7 +12,7 @@ Disc* cdi_parse(const char* file, std::vector<u8> *digest)
if (fsource == nullptr)
{
WARN_LOG(COMMON, "Cannot open file '%s' errno %d", file, errno);
WARN_LOG(GDROM, "Cannot open file '%s' errno %d", file, errno);
throw FlycastException(std::string("Cannot open CDI file ") + file);
}
@ -101,7 +101,15 @@ Disc* cdi_parse(const char* file, std::vector<u8> *digest)
t.CTRL=track.mode==0?0:4;
t.StartFAD=track.start_lba+track.pregap_length;
t.EndFAD=t.StartFAD+track.length-1;
t.file = new RawTrackFile(nowide::fopen(file, "rb"), track.position + track.pregap_length * track.sector_size, t.StartFAD, track.sector_size);
FILE *trackFile = nowide::fopen(file, "rb");
if (trackFile == nullptr)
{
delete rv;
std::fclose(fsource);
WARN_LOG(GDROM, "Cannot re-open file '%s' errno %d", file, errno);
throw FlycastException("Cannot re-open CDI file");
}
t.file = new RawTrackFile(trackFile, track.position + track.pregap_length * track.sector_size, t.StartFAD, track.sector_size);
rv->tracks.push_back(t);

View File

@ -58,12 +58,17 @@ class OboeBackend : AudioBackend
public:
AudioErrorCallback(OboeBackend *backend) : backend(backend) {}
void onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) override {
WARN_LOG(AUDIO, "Audio device lost. Attempting to reopen the audio stream");
// the oboe stream is already closed so make sure we don't close it twice
backend->stream.reset();
backend->term();
backend->init();
void onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) override
{
// Only attempt to recover if init was successful
if (backend->stream != nullptr)
{
WARN_LOG(AUDIO, "Audio device lost. Attempting to reopen the audio stream");
// the oboe stream is already closed so make sure we don't close it twice
backend->stream.reset();
backend->term();
backend->init();
}
}
OboeBackend *backend;

View File

@ -20,6 +20,7 @@
#include "stdclass.h"
#include "cfg/cfg.h"
#include "cfg/option.h"
#include "nowide/fstream.hpp"
#ifndef _WIN32
#include <unistd.h>
#endif
@ -218,9 +219,24 @@ void uploadCrashes(const std::string& directory)
if (config::UploadCrashLogs)
{
NOTICE_LOG(COMMON, "Uploading minidump %s", line);
std::string version = std::string(GIT_VERSION);
if (file_exists(logfile))
{
nowide::ifstream ifs(logfile);
if (ifs.is_open())
{
std::string line;
while (std::getline(ifs, line))
if (line.substr(0, 9) == "Version: ")
{
version = line.substr(9);
break;
}
}
}
std::vector<http::PostField> fields;
fields.emplace_back("upload_file_minidump", dmpfile, "application/octet-stream");
fields.emplace_back("sentry[release]", std::string(GIT_VERSION));
fields.emplace_back("sentry[release]", version);
if (file_exists(logfile))
fields.emplace_back("flycast_log", logfile, "text/plain");
// TODO config, gpu/driver, ...

View File

@ -373,7 +373,8 @@ static void reios_sys_misc()
typedef void hook_fp();
static void setup_syscall(u32 hook_addr, u32 syscall_addr) {
static void setup_syscall(u32 hook_addr, u32 syscall_addr)
{
WriteMem32(syscall_addr, hook_addr);
WriteMem16(hook_addr, REIOS_OPCODE);
@ -383,6 +384,25 @@ static void setup_syscall(u32 hook_addr, u32 syscall_addr) {
static void reios_setup_state(u32 boot_addr)
{
// San Francisco Rush checksum
short *p = (short *)GetMemPtr(0x8c0010f0, 2);
int chksum = (int)0xFFF937D1;
for (int i = 0; i < 10; i++)
chksum -= *p++;
p += 0xee - 1;
for (int i = 0; i < 3; i++)
chksum += *p++;
p += 0x347 - 1;
for (int i = 0; i < 11; i++)
chksum -= *p++;
p += 0xbf8 - 1;
for (int i = 0; i < 98; i++)
{
short v = chksum < 0 ? std::min(-chksum, 32767) : std::max(-chksum, -32768);
*p = v;
chksum += *p++;
}
// Set up AICA interrupt masks
aica::writeAicaReg(SCIEB_addr, (u16)0x48);
aica::writeAicaReg(SCILV0_addr, (u8)0x18);
@ -711,6 +731,11 @@ void reios_reset(u8* rom)
rom16[0] = REIOS_OPCODE;
// The Grinch game bug
*(u32 *)&rom[0x44c] = 0xe303d463;
// Jeremy McGrath game bug
*(u32 *)&rom[0x1c] = 0x71294118;
u8 *pFont = rom + (FONT_TABLE_ADDR % BIOS_SIZE);
// 288 12 × 24 pixels (36 bytes) characters

File diff suppressed because it is too large Load Diff

View File

@ -74,17 +74,21 @@ in vec4 in_pos;
in vec4 in_base;
in vec4 in_offs;
in vec2 in_uv;
#if pp_TwoVolumes == 1
in vec4 in_base1;
in vec4 in_offs1;
in vec2 in_uv1;
#endif
// Output
INTERPOLATION out vec4 vtx_base;
INTERPOLATION out vec4 vtx_offs;
out vec3 vtx_uv;
#if pp_TwoVolumes == 1
INTERPOLATION out vec4 vtx_base1;
INTERPOLATION out vec4 vtx_offs1;
out vec2 vtx_uv1;
#endif
flat out uint vtx_index;
void main()
@ -97,20 +101,26 @@ void main()
vtx_base = in_base;
vtx_offs = in_offs;
vtx_uv = vec3(in_uv, vpos.z);
vtx_base1 = in_base1;
vtx_offs1 = in_offs1;
vtx_uv1 = in_uv1;
#if pp_TwoVolumes == 1
vtx_base1 = in_base1;
vtx_offs1 = in_offs1;
vtx_uv1 = in_uv1;
#endif
vtx_index = uint(pp_Number) + uint(gl_VertexID);
#if pp_Gouraud == 1 && DIV_POS_Z != 1
vtx_base *= vpos.z;
vtx_offs *= vpos.z;
vtx_base1 *= vpos.z;
vtx_offs1 *= vpos.z;
#if pp_TwoVolumes == 1
vtx_base1 *= vpos.z;
vtx_offs1 *= vpos.z;
#endif
#endif
#if DIV_POS_Z != 1
vtx_uv.xy *= vpos.z;
vtx_uv1 *= vpos.z;
#if pp_TwoVolumes == 1
vtx_uv1 *= vpos.z;
#endif
vpos.w = 1.0;
vpos.z = 0.0;
#endif
@ -171,9 +181,11 @@ uniform int fog_control[2];
INTERPOLATION in vec4 vtx_base;
INTERPOLATION in vec4 vtx_offs;
in vec3 vtx_uv;
#if pp_TwoVolumes == 1
INTERPOLATION in vec4 vtx_base1;
INTERPOLATION in vec4 vtx_offs1;
in vec2 vtx_uv1;
#endif
flat in uint vtx_index;
float fog_mode2(float w)
@ -277,21 +289,27 @@ void main()
vec4 texcol;
#if pp_Palette == 0
#if DIV_POS_Z == 1
if (area1)
texcol = texture(tex1, vtx_uv1);
else
texcol = texture(tex0, vtx_uv.xy);
#if pp_TwoVolumes == 1
if (area1)
texcol = texture(tex1, vtx_uv1);
else
#endif
texcol = texture(tex0, vtx_uv.xy);
#else
if (area1)
texcol = textureProj(tex1, vec3(vtx_uv1.xy, vtx_uv.z));
else
texcol = textureProj(tex0, vtx_uv);
#if pp_TwoVolumes == 1
if (area1)
texcol = textureProj(tex1, vec3(vtx_uv1.xy, vtx_uv.z));
else
#endif
texcol = textureProj(tex0, vtx_uv);
#endif
#else
if (area1)
texcol = palettePixel(tex1, vec3(vtx_uv1.xy, vtx_uv.z));
else
texcol = palettePixel(tex0, vtx_uv);
#if pp_TwoVolumes == 1
if (area1)
texcol = palettePixel(tex1, vec3(vtx_uv1.xy, vtx_uv.z));
else
#endif
texcol = palettePixel(tex0, vtx_uv);
#endif
#if pp_BumpMap == 1
@ -459,7 +477,9 @@ void main()
class Vertex4Source : public OpenGl4Source
{
public:
Vertex4Source(bool gouraud, bool divPosZ) : OpenGl4Source() {
Vertex4Source(bool gouraud, bool divPosZ, bool twoVolumes) : OpenGl4Source()
{
addConstant("pp_TwoVolumes", twoVolumes);
addConstant("pp_Gouraud", gouraud);
addConstant("DIV_POS_Z", divPosZ);
@ -507,7 +527,7 @@ bool gl4CompilePipelineShader(gl4PipelineShader* s, const char *fragment_source
if (s->naomi2)
vertexSource = N2Vertex4Source(s).generate();
else
vertexSource = Vertex4Source(s->pp_Gouraud, s->divPosZ).generate();
vertexSource = Vertex4Source(s->pp_Gouraud, s->divPosZ, s->pp_TwoVolumes).generate();
Fragment4ShaderSource fragmentSource(s);
s->program = gl_CompileAndLink(vertex_source != nullptr ? vertex_source : vertexSource.c_str(),
@ -623,7 +643,7 @@ static void create_modvol_shader()
{
if (gl4.modvol_shader.program != 0)
return;
Vertex4Source vertexShader(false, config::NativeDepthInterpolation);
Vertex4Source vertexShader(false, config::NativeDepthInterpolation, false);
OpenGl4Source fragmentShader;
fragmentShader.addConstant("DIV_POS_Z", config::NativeDepthInterpolation)
.addSource(ShaderHeader)

View File

@ -89,7 +89,7 @@ static const char GouraudSource[] = R"(
class VulkanSource : public ShaderSource
{
public:
VulkanSource() : ShaderSource("#version 450") {}
VulkanSource() : ShaderSource("#version 430") {}
};

View File

@ -21,8 +21,6 @@
#pragma once
#include <cinttypes>
#include "vulkan.h"
#define VMA_NOT_NULL
#define VMA_NULLABLE
#include "vk_mem_alloc.h"
#if !defined(PRIu64) && defined(_WIN32)

View File

@ -166,7 +166,16 @@ public:
SDLGamepad(int maple_port, int joystick_idx, SDL_Joystick* sdl_joystick)
: GamepadDevice(maple_port, "SDL"), sdl_joystick(sdl_joystick)
{
_name = SDL_JoystickName(sdl_joystick);
const char *joyName = SDL_JoystickName(sdl_joystick);
if (joyName == nullptr)
{
WARN_LOG(INPUT, "Can't get joystick %d name: %s", joystick_idx, SDL_GetError());
_name = "Joystick " + std::to_string(joystick_idx);
}
else
{
_name = joyName;
}
sdl_joystick_instance = SDL_JoystickInstanceID(sdl_joystick);
_unique_id = "sdl_joystick_" + std::to_string(sdl_joystick_instance);
INFO_LOG(INPUT, "SDL: Opened joystick %d on port %d: '%s' unique_id=%s", sdl_joystick_instance, maple_port, _name.c_str(), _unique_id.c_str());
@ -174,12 +183,19 @@ public:
if (SDL_IsGameController(joystick_idx))
{
sdl_controller = SDL_GameControllerOpen(joystick_idx);
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(sdl_controller, SDL_CONTROLLER_AXIS_TRIGGERLEFT);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS)
leftTrigger = bind.value.axis;
bind = SDL_GameControllerGetBindForAxis(sdl_controller, SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS)
rightTrigger = bind.value.axis;
if (sdl_controller == nullptr)
{
WARN_LOG(INPUT, "Can't open game controller %d: %s", joystick_idx, SDL_GetError());
}
else
{
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(sdl_controller, SDL_CONTROLLER_AXIS_TRIGGERLEFT);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS)
leftTrigger = bind.value.axis;
bind = SDL_GameControllerGetBindForAxis(sdl_controller, SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS)
rightTrigger = bind.value.axis;
}
}
if (!find_mapping())
@ -273,50 +289,51 @@ public:
{ "paddle4", "Paddle 4" },
{ "touchpad", "Touchpad" },
};
for (SDL_GameControllerButton button = SDL_CONTROLLER_BUTTON_A; button < SDL_CONTROLLER_BUTTON_MAX; button = (SDL_GameControllerButton)(button + 1))
{
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForButton(sdl_controller, button);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON && bind.value.button == (int)code)
if (sdl_controller != nullptr)
for (SDL_GameControllerButton button = SDL_CONTROLLER_BUTTON_A; button < SDL_CONTROLLER_BUTTON_MAX; button = (SDL_GameControllerButton)(button + 1))
{
const char *sdlButton = SDL_GameControllerGetStringForButton(button);
if (sdlButton == nullptr)
return nullptr;
for (const auto& button : buttonsTable)
if (!strcmp(button.sdlButton, sdlButton))
return button.label;
return sdlButton;
}
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_HAT && (code >> 8) - 1 == (u32)bind.value.hat.hat)
{
int hat;
const char *name;
switch (code & 0xff)
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForButton(sdl_controller, button);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON && bind.value.button == (int)code)
{
case 0:
hat = SDL_HAT_UP;
name = "DPad Up";
break;
case 1:
hat = SDL_HAT_DOWN;
name = "DPad Down";
break;
case 2:
hat = SDL_HAT_LEFT;
name = "DPad Left";
break;
case 3:
hat = SDL_HAT_RIGHT;
name = "DPad Right";
break;
default:
hat = 0;
name = nullptr;
break;
const char *sdlButton = SDL_GameControllerGetStringForButton(button);
if (sdlButton == nullptr)
return nullptr;
for (const auto& button : buttonsTable)
if (!strcmp(button.sdlButton, sdlButton))
return button.label;
return sdlButton;
}
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_HAT && (code >> 8) - 1 == (u32)bind.value.hat.hat)
{
int hat;
const char *name;
switch (code & 0xff)
{
case 0:
hat = SDL_HAT_UP;
name = "DPad Up";
break;
case 1:
hat = SDL_HAT_DOWN;
name = "DPad Down";
break;
case 2:
hat = SDL_HAT_LEFT;
name = "DPad Left";
break;
case 3:
hat = SDL_HAT_RIGHT;
name = "DPad Right";
break;
default:
hat = 0;
name = nullptr;
break;
}
if (hat == bind.value.hat.hat_mask)
return name;
}
if (hat == bind.value.hat.hat_mask)
return name;
}
}
return nullptr;
}
@ -336,20 +353,21 @@ public:
{ "righttrigger", "R2" },
};
for (SDL_GameControllerAxis axis = SDL_CONTROLLER_AXIS_LEFTX; axis < SDL_CONTROLLER_AXIS_MAX; axis = (SDL_GameControllerAxis)(axis + 1))
{
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(sdl_controller, axis);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS && bind.value.axis == (int)code)
if (sdl_controller != nullptr)
for (SDL_GameControllerAxis axis = SDL_CONTROLLER_AXIS_LEFTX; axis < SDL_CONTROLLER_AXIS_MAX; axis = (SDL_GameControllerAxis)(axis + 1))
{
const char *sdlAxis = SDL_GameControllerGetStringForAxis(axis);
if (sdlAxis == nullptr)
return nullptr;
for (const auto& axis : axesTable)
if (!strcmp(axis.sdlAxis, sdlAxis))
return axis.label;
return sdlAxis;
SDL_GameControllerButtonBind bind = SDL_GameControllerGetBindForAxis(sdl_controller, axis);
if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS && bind.value.axis == (int)code)
{
const char *sdlAxis = SDL_GameControllerGetStringForAxis(axis);
if (sdlAxis == nullptr)
return nullptr;
for (const auto& axis : axesTable)
if (!strcmp(axis.sdlAxis, sdlAxis))
return axis.label;
return sdlAxis;
}
}
}
return nullptr;
}

View File

@ -340,6 +340,12 @@ static void updateAudioSession(Event event, void *)
return UIRectEdgeAll;
}
- (void)viewDidDisappear:(BOOL)animated;
{
[super viewDidDisappear:animated];
mainui_term();
}
- (void)dealloc
{
[self deinitKeyboard];

View File

@ -51,13 +51,13 @@
<constraint firstAttribute="height" constant="140" id="fly-c3-Ajo"/>
</constraints>
</imageView>
<view opaque="NO" multipleTouchEnabled="YES" tag="10" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bc4-Lc-Ghm" userLabel="UR-Button">
<view opaque="NO" multipleTouchEnabled="YES" tag="24" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bc4-Lc-Ghm" userLabel="UR-Button">
<rect key="frame" x="134" y="85" width="50" height="50"/>
</view>
<view opaque="NO" multipleTouchEnabled="YES" tag="11" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7rQ-cq-4t8" userLabel="UL-Button">
<view opaque="NO" multipleTouchEnabled="YES" tag="25" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7rQ-cq-4t8" userLabel="UL-Button">
<rect key="frame" x="44" y="85" width="50" height="50"/>
</view>
<view opaque="NO" multipleTouchEnabled="YES" tag="12" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="f6y-OJ-0oT" userLabel="DL-Button">
<view opaque="NO" multipleTouchEnabled="YES" tag="26" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="f6y-OJ-0oT" userLabel="DL-Button">
<rect key="frame" x="44" y="175" width="50" height="50"/>
</view>
<view opaque="NO" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rp6-Nd-1qa" userLabel="L-Button">
@ -144,7 +144,7 @@
<constraint firstAttribute="width" constant="80" id="Pj7-YU-3Ze"/>
</constraints>
</imageView>
<view opaque="NO" multipleTouchEnabled="YES" tag="13" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ccY-OZ-Jlp" userLabel="DR-Button">
<view opaque="NO" multipleTouchEnabled="YES" tag="27" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ccY-OZ-Jlp" userLabel="DR-Button">
<rect key="frame" x="134" y="175" width="50" height="50"/>
</view>
</subviews>

View File

@ -50,14 +50,12 @@ enum IOSButton {
IOS_BTN_PADDLE4,
IOS_BTN_TOUCHPAD,
IOS_BTN_MAX,
IOS_BTN_UP_RIGHT = 10,
IOS_BTN_UP_RIGHT,
IOS_BTN_UP_LEFT,
IOS_BTN_DOWN_LEFT,
IOS_BTN_DOWN_RIGHT,
};
enum IOSAxis {
IOS_AXIS_L1 = 1,
IOS_AXIS_R1,

View File

@ -13558,7 +13558,7 @@ struct retro_core_options_v2 options_da = {
#define CATEGORY_VIDEO_LABEL_DE NULL
#define CATEGORY_VIDEO_INFO_0_DE "Auflösung, sortierungsunabhängige Transparenz und visuelle Effekt-Einstellungen konfigurieren."
#define CATEGORY_PERFORMANCE_LABEL_DE "Leistung"
#define CATEGORY_PERFORMANCE_INFO_0_DE "Einstellungen für Mehrgängiges Rendern und Frameskip ändern."
#define CATEGORY_PERFORMANCE_INFO_0_DE "Einstellungen für Mehrgängiges Rendern und Bilder überspringen ändern."
#define CATEGORY_HACKS_LABEL_DE "Emulations-Hacks"
#define CATEGORY_HACKS_INFO_0_DE "Breitbild-Überschreibungen, GD-ROM Ladegeschwindigkeit und Textur-Austausch-Einstellungen konfigurieren."
#define CATEGORY_INPUT_LABEL_DE "Eingabe"
@ -32135,7 +32135,7 @@ struct retro_core_options_v2 options_hr = {
#define OPTION_VAL_FRENCH_HU "francia"
#define OPTION_VAL_SPANISH_HU "spanyol"
#define OPTION_VAL_ITALIAN_HU "olasz"
#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HU NULL
#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HU "HLE BIOS (újraindítás szükséges)"
#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HU "Mindenképp a magas szinten emulált BIOS használata."
#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HU "Indítás BIOS-ban (újraindítás szükséges)"
#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HU "Belépés a Dreamcast BIOS menüjébe rögtön Indításkor."
@ -32147,10 +32147,10 @@ struct retro_core_options_v2 options_hr = {
#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HU "A NAOMI szervizgombjának engedélyezése, a kabinet beállításaihoz."
#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HU "Ingyen játék a NAOMI játékokhoz"
#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HU "Az érmebeállítások ingyen játékra állítása."
#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU NULL
#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU NULL
#define CORE_OPTION_NAME_UPNP_LABEL_HU NULL
#define CORE_OPTION_NAME_UPNP_INFO_0_HU NULL
#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU "Szélessávú adapter emulálása"
#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU "Modem helyett a szélessávú Ethernet adapter emulálása. (Újraindítás szükséges.)"
#define CORE_OPTION_NAME_UPNP_LABEL_HU "UPnP engedélyezése"
#define CORE_OPTION_NAME_UPNP_INFO_0_HU "Az internetre csatlakozó router automatikus konfigurálása az online játékokhoz UPnP-n keresztül."
#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HU "Belső felbontás"
#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HU "A képelőállítás felbontása."
#define OPTION_VAL_320X240_HU NULL
@ -32208,7 +32208,7 @@ struct retro_core_options_v2 options_hr = {
#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HU "Teljes framebuffer emuláció"
#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HU "A VRAM framebuffer teljes emulálásának engedélyezése. Olyan játékokhoz hasznos, amelyek közvetlenül a VRAM-ban írják vagy olvassák a framebuffert. Bekapcsolva a belső felbontás mindenképpen 640x480 lesz és a teljesítmény erősen visszaeshet."
#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HU "RTT (Render to texture) puffer engedélyezése"
#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU NULL
#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU "Az előállított textúrák visszamásolása a GPU-ból a VRAM-ba. Ez a lehetőség rendszerint be van kapcsolva azoknál a játékoknál, amelyek igénylik. Bekapcsolt állapotban a textúra előállítás felméretezése kikapcsol, és hatással lehet a teljesítményre."
#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HU NULL
#define CORE_OPTION_NAME_FOG_LABEL_HU "Köd effekt"
#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HU "Térfogatmódosító"
@ -32263,37 +32263,37 @@ struct retro_core_options_v2 options_hr = {
#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HU "A kontroller erővisszacsatolásának engedélyezése."
#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HU "Digitális kimenetek sugárzása"
#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HU "A digitális kimenetek és az erővisszacsatolás állapotának közzététele a 8000-es TCP porton. Kompatibilis a MAME \"-output network\" opciójával."
#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU NULL
#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU NULL
#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU NULL
#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU "Fénypisztoly beállítások megjelenítése"
#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU "A fénypisztoly célkereszt megjelenítés beállításai. Figyelem: a változtatás életbelépéséhez újra be kell lépni a gyorsmenübe."
#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU "1. fénypisztoly célkeresztjének megjelenítése"
#define OPTION_VAL_WHITE_HU "Fehér"
#define OPTION_VAL_RED_HU "Vörös"
#define OPTION_VAL_GREEN_HU "Zöld"
#define OPTION_VAL_BLUE_HU "Kék"
#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU NULL
#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU NULL
#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU NULL
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU NULL
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU NULL
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU NULL
#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU "2. fénypisztoly célkeresztjének megjelenítése"
#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU "3. fénypisztoly célkeresztjének megjelenítése"
#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU "4. fénypisztoly célkeresztjének megjelenítése"
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU "Játékonként külön Visual Memory Unit/System (VMU)"
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU "Játékonként külön VMU"
#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU "Kikapcsolva minden játék ugyanazt a 4 VMU mentés fájlt (A1, B1, C1, D1) használja a RetroArch rendszerkönyvtárban. \"VMU A1\" beállításnál minden elindított játéknak külön VMU \"A1\" fájlt hoz létre. \"Minden VMU\" beállításnál minden elindított játéknak négy külön VMU fájlt (A1, B1, C1, D1) hoz létre."
#define OPTION_VAL_VMU_A1_HU NULL
#define OPTION_VAL_ALL_VMUS_HU NULL
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU NULL
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU NULL
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU NULL
#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU NULL
#define OPTION_VAL_UPPER_LEFT_HU NULL
#define OPTION_VAL_UPPER_RIGHT_HU NULL
#define OPTION_VAL_LOWER_LEFT_HU NULL
#define OPTION_VAL_LOWER_RIGHT_HU NULL
#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU NULL
#define OPTION_VAL_ALL_VMUS_HU "Minden VMU"
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU "Visual Memory Unit/System (VMU) megjelenítési beállítások jelenjenek meg"
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU "VMU megjelenítési beállítások jelenjenek meg"
#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU "Az emulált VMU LCD képernyő láthatósági, méret, helyzet, és szín beállításainak engedélyezése. Figyelem: a gyorsmenüt ki-be kell kapcsolni, hogy ez a beállítás érvényre jusson."
#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU "VMU 1 képernyő megjelenítése"
#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU "VMU 1 képernyő helyzete"
#define OPTION_VAL_UPPER_LEFT_HU "Bal felső"
#define OPTION_VAL_UPPER_RIGHT_HU "Jobb felső"
#define OPTION_VAL_LOWER_LEFT_HU "Bal alsó"
#define OPTION_VAL_LOWER_RIGHT_HU "Jobb alsó"
#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU "VMU 1 képernyő mérete"
#define OPTION_VAL_1X_HU NULL
#define OPTION_VAL_3X_HU NULL
#define OPTION_VAL_5X_HU NULL
#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU NULL
#define OPTION_VAL_DEFAULT_ON_00_HU NULL
#define OPTION_VAL_DEFAULT_OFF_01_HU NULL
#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU "VMU 1 képernyő bekapcsolt pixel színe"
#define OPTION_VAL_DEFAULT_ON_00_HU "Alapértelmezésben bekapcsolva"
#define OPTION_VAL_DEFAULT_OFF_01_HU "Alapértelmezésben kikapcsolva"
#define OPTION_VAL_BLACK_02_HU "Fekete"
#define OPTION_VAL_LIGHT_BLUE_04_HU "Világoskék"
#define OPTION_VAL_CYAN_06_HU "Ciánkék"
@ -32317,8 +32317,8 @@ struct retro_core_options_v2 options_hr = {
#define OPTION_VAL_LIGHT_PURPLE_4_25_HU "Világoslila (4)"
#define OPTION_VAL_LIGHT_YELLOW_26_HU "Halványsárga"
#define OPTION_VAL_LIGHT_YELLOW_2_27_HU "Halványsárga (2)"
#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU "VMU 1 képernyő kikapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU "VMU 1 képernyő átlátszatlansága"
#define OPTION_VAL_40_HU NULL
#define OPTION_VAL_50_HU NULL
#define OPTION_VAL_60_HU NULL
@ -32326,24 +32326,24 @@ struct retro_core_options_v2 options_hr = {
#define OPTION_VAL_80_HU NULL
#define OPTION_VAL_90_HU NULL
#define OPTION_VAL_100_HU NULL
#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU NULL
#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU "VMU 2 képernyő megjelenítése"
#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU "VMU 2 képernyő helyzete"
#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU "VMU 2 képernyő mérete"
#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU "VMU 2 képernyő bekapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU "VMU 2 képernyő kikapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU "VMU 2 képernyő átlátszatlansága"
#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU "VMU 3 képernyő megjelenítése"
#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU "VMU 3 képernyő helyzete"
#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU "VMU 3 képernyő mérete"
#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU "VMU 3 képernyő bekapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU "VMU 3 képernyő kikapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU "VMU 3 képernyő átlátszatlansága"
#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU "VMU 4 képernyő megjelenítése"
#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU "VMU 4 képernyő helyzete"
#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU "VMU 4 képernyő mérete"
#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU "VMU 4 képernyő bekapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU "VMU 4 képernyő kikapcsolt pixel színe"
#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU "VMU 4 képernyő átlátszatlansága"
struct retro_core_option_v2_category option_cats_hu[] = {
{
@ -38883,7 +38883,7 @@ struct retro_core_options_v2 options_ja = {
#define OPTION_VAL_FRENCH_KO "프랑스어"
#define OPTION_VAL_SPANISH_KO "스페인어"
#define OPTION_VAL_ITALIAN_KO "이탈리아어"
#define CORE_OPTION_NAME_HLE_BIOS_LABEL_KO NULL
#define CORE_OPTION_NAME_HLE_BIOS_LABEL_KO "HLE BIOS (재시작 필요)"
#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_KO "HLE BIOS 사용을 강제합니다."
#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_KO "BIOS 로 부트 (재시작 필요)"
#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_KO "드림캐스트 BIOS 메뉴로 부팅합니다."
@ -38895,10 +38895,10 @@ struct retro_core_options_v2 options_ja = {
#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_KO "캐비넷 설정에 들어가기위한 NAOMI 서비스 버튼을 활성화합니다."
#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_KO "NAOMI 게임을 무료 플레이로 설정"
#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_KO "무료 플레이를 위해 게임의 코인 설정을 수정합니다."
#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO NULL
#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO NULL
#define CORE_OPTION_NAME_UPNP_LABEL_KO NULL
#define CORE_OPTION_NAME_UPNP_INFO_0_KO NULL
#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO "브로드밴드 어댑터 에뮬레이션"
#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO "모뎀 대신 이더넷 브로드밴드 어댑터를 에뮬레이트합니다. (재시작 필요)"
#define CORE_OPTION_NAME_UPNP_LABEL_KO "UPnP 활성화"
#define CORE_OPTION_NAME_UPNP_INFO_0_KO "온라인 게임에서 UPnP를 사용해 자동으로 인터넷 라우터를 설정합니다."
#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_KO "내부 해상도"
#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_KO "렌더링 해상도를 변경합니다."
#define OPTION_VAL_320X240_KO NULL