diff --git a/core/deps/libchdr b/core/deps/libchdr index 8c319cf7b..8e09bf2ba 160000 --- a/core/deps/libchdr +++ b/core/deps/libchdr @@ -1 +1 @@ -Subproject commit 8c319cf7be87186857972829e343b9082341d365 +Subproject commit 8e09bf2badf8866a360babbf722fada2393b26e3 diff --git a/core/emulator.cpp b/core/emulator.cpp index fda603414..c5d349435 100644 --- a/core/emulator.cpp +++ b/core/emulator.cpp @@ -200,7 +200,8 @@ static void loadSpecialSettings() || prod_id == "T1209N" // Gigawing (US) || prod_id == "T1208M" // Gigawing (JP) || prod_id == "T1235M" // Vampire Chronicle for Matching Service - || prod_id == "T22901N"))// Roadsters (US) + || prod_id == "T22901N" // Roadsters (US) + || prod_id == "T28202M"))// Shin Nihon Pro Wrestling 4 { NOTICE_LOG(BOOT, "Game doesn't support RGB. Using TV Composite instead"); config::Cable.override(3); diff --git a/core/hw/aica/aica_if.cpp b/core/hw/aica/aica_if.cpp index b486bd7e6..6805aa908 100644 --- a/core/hw/aica/aica_if.cpp +++ b/core/hw/aica/aica_if.cpp @@ -12,6 +12,7 @@ #include "hw/sh4/sh4_sched.h" #include "profiler/dc_profiler.h" #include "hw/sh4/dyna/blockmanager.h" +#include "hw/sh4/sh4_interpreter.h" #include "hw/arm7/arm7.h" #include "cfg/option.h" @@ -404,7 +405,7 @@ static void Write_SB_ADST(u32 addr, u32 data) // Schedule the end of DMA transfer interrupt int cycles = len * (SH4_MAIN_CLOCK / 2 / G2_BUS_CLOCK); // 16 bits @ 25 MHz - if (cycles < 4096) + if (cycles < SH4_TIMESLICE / 2) dma_end_sched(0, 0, 0); else sh4_sched_request(dma_sched_id, cycles); @@ -472,10 +473,8 @@ void sbInit() // AICA hollyRegs.setHandlers(Read_SB_ADST, Write_SB_ADST); -#ifdef STRICT_MODE hollyRegs.setWriteHandler(Write_SB_STAR); hollyRegs.setWriteHandler(Write_SB_STAG); -#endif // G2 Ext device #1 hollyRegs.setWriteHandler(Write_DmaStart T DYNACALL pvr_read32p(u32 addr) { - return *(T *)&vram[pvr_map32(addr)]; + return *(T *)&vram[pvr_map32(addr) & ~(sizeof(T) - 1)]; } template u8 pvr_read32p(u32 addr); template u16 pvr_read32p(u32 addr); @@ -218,6 +218,7 @@ void DYNACALL pvr_write32p(u32 addr, T data) INFO_LOG(MEMORY, "%08x: 8-bit VRAM writes are not possible", addr); return; } + addr &= ~(sizeof(T) - 1); u32 vaddr = addr & VRAM_MASK; if (vaddr >= fb_watch_addr_start && vaddr < fb_watch_addr_end) fb_dirty = true; diff --git a/core/hw/sh4/modules/fastmmu.cpp b/core/hw/sh4/modules/fastmmu.cpp index 5f3a1787d..504ca9ae8 100644 --- a/core/hw/sh4/modules/fastmmu.cpp +++ b/core/hw/sh4/modules/fastmmu.cpp @@ -56,7 +56,8 @@ static void cache_entry(const TLB_Entry &entry) { if (entry.Data.SZ0 == 0 && entry.Data.SZ1 == 0) return; - verify(full_table_size < std::size(full_table)); + if (full_table_size >= std::size(full_table)) + return; full_table[full_table_size].entry = entry; diff --git a/core/rend/dx11/oit/dx11_oitbuffers.h b/core/rend/dx11/oit/dx11_oitbuffers.h index c8a63be44..c52b55515 100644 --- a/core/rend/dx11/oit/dx11_oitbuffers.h +++ b/core/rend/dx11/oit/dx11_oitbuffers.h @@ -45,7 +45,7 @@ public: } if (FAILED(hr)) { - WARN_LOG(RENDERER, "Pixels buffer creation failed"); + WARN_LOG(RENDERER, "Pixels buffer creation failed: %x", hr); return; } } @@ -59,7 +59,7 @@ public: hr = device->CreateUnorderedAccessView(pixelsBuffer, &uaView, &pixelsBufferView.get()); if (FAILED(hr)) - WARN_LOG(RENDERER, "Pixels buffer UAV creation failed"); + WARN_LOG(RENDERER, "Pixels buffer UAV creation failed: %x", hr); } void resize(int width, int height) @@ -84,7 +84,7 @@ public: HRESULT hr = device->CreateTexture2D(&desc, nullptr, &abufferPointersTex.get()); if (FAILED(hr)) { - WARN_LOG(RENDERER, "A-buffer texture creation failed"); + WARN_LOG(RENDERER, "A-buffer texture creation failed: %x", hr); return; } D3D11_UNORDERED_ACCESS_VIEW_DESC uaView{}; @@ -93,7 +93,7 @@ public: hr = device->CreateUnorderedAccessView(abufferPointersTex, &uaView, &abufferPointersView.get()); if (FAILED(hr)) - WARN_LOG(RENDERER, "A-buffer texture UAV creation failed"); + WARN_LOG(RENDERER, "A-buffer texture UAV creation failed: %x", hr); } void bind() diff --git a/core/rend/dx11/oit/dx11_oitshaders.cpp b/core/rend/dx11/oit/dx11_oitshaders.cpp index 2b1ad7059..c8e4a66bc 100644 --- a/core/rend/dx11/oit/dx11_oitshaders.cpp +++ b/core/rend/dx11/oit/dx11_oitshaders.cpp @@ -527,61 +527,6 @@ PSO main(in VertexIn inpix) #if PASS == PASS_COLOR pso.col = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (all(color == 0.f)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.f || all(color.rgb == 0.f)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || all(color.rgb == 0.f)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && all(color == 1.f)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && all(color == 0.f)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.f) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.f) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (all(color == 0.f)) - discard; - break; - } - break; - } - uint2 coords = uint2(inpix.pos.xy); uint idx = getNextPixelIndex(); @@ -1126,7 +1071,7 @@ ComPtr DX11OITShaders::compilePS(const char* source, const ch ComPtr shader; if (blob) { - if (device->CreatePixelShader(blob->GetBufferPointer(), blob->GetBufferSize(), nullptr, &shader.get()) != S_OK) + if (FAILED(device->CreatePixelShader(blob->GetBufferPointer(), blob->GetBufferSize(), nullptr, &shader.get()))) ERROR_LOG(RENDERER, "Pixel shader creation failed"); } diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index 236e49464..1772b22eb 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -390,60 +390,6 @@ void main() #if PASS == PASS_COLOR FragColor = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.0 || color.rgb == vec3(0.0)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || color.rgb == vec3(0.0)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && color == vec4(1.0)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.0) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.0) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - } - break; - } - ivec2 coords = ivec2(gl_FragCoord.xy); uint idx = getNextPixelIndex(); diff --git a/core/rend/vulkan/oit/oit_pipeline.cpp b/core/rend/vulkan/oit/oit_pipeline.cpp index 18a5db05d..12eede501 100644 --- a/core/rend/vulkan/oit/oit_pipeline.cpp +++ b/core/rend/vulkan/oit/oit_pipeline.cpp @@ -57,16 +57,13 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP depthOp = vk::CompareOp::eGreaterOrEqual; else depthOp = depthOps[pp.isp.DepthMode]; - bool depthWriteEnable = false; - if (pass == Pass::Depth || pass == Pass::Color) - { - // Z Write Disable seems to be ignored for punch-through. - // Fixes Worms World Party, Bust-a-Move 4 and Re-Volt - if (listType == ListType_Punch_Through) - depthWriteEnable = true; - else - depthWriteEnable = !pp.isp.ZWriteDis; - } + bool depthWriteEnable; + // Z Write Disable seems to be ignored for punch-through. + // Fixes Worms World Party, Bust-a-Move 4 and Re-Volt + if (listType == ListType_Punch_Through) + depthWriteEnable = true; + else + depthWriteEnable = !pp.isp.ZWriteDis; bool shadowed = pass == Pass::Depth && (listType == ListType_Opaque || listType == ListType_Punch_Through); vk::StencilOpState stencilOpState; diff --git a/core/rend/vulkan/oit/oit_renderpass.cpp b/core/rend/vulkan/oit/oit_renderpass.cpp index 10d04ed1c..056d693f4 100644 --- a/core/rend/vulkan/oit/oit_renderpass.cpp +++ b/core/rend/vulkan/oit/oit_renderpass.cpp @@ -36,13 +36,13 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, last ? vk::AttachmentStoreOp::eDontCare : vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare, - initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilReadOnlyOptimal, vk::ImageLayout::eDepthStencilReadOnlyOptimal), + initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal), // OP+PT depth attachment for subpass 1 vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), GetContext()->GetDepthFormat(), vk::SampleCountFlagBits::e1, initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, last ? vk::AttachmentStoreOp::eDontCare : vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare, - initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilReadOnlyOptimal, vk::ImageLayout::eDepthStencilReadOnlyOptimal), + initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal), }; vk::AttachmentReference swapChainReference(0, vk::ImageLayout::eColorAttachmentOptimal); vk::AttachmentReference colorReference(1, vk::ImageLayout::eColorAttachmentOptimal); @@ -70,17 +70,12 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) colorInput, swapChainReference, nullptr, - &depthReference2), // depth-only Tr pass when continuation + &depthReference), // depth-only Tr pass when continuation }; std::vector dependencies = GetSubpassDependencies(); - dependencies.emplace_back(VK_SUBPASS_EXTERNAL, 0, vk::PipelineStageFlagBits::eFragmentShader, - vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, - vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead, - vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite, - vk::DependencyFlagBits::eByRegion); dependencies.emplace_back(VK_SUBPASS_EXTERNAL, 1, vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eColorAttachmentOutput, - vk::AccessFlagBits::eInputAttachmentRead, vk::AccessFlagBits::eColorAttachmentWrite, vk::DependencyFlagBits::eByRegion), + vk::AccessFlagBits::eInputAttachmentRead, vk::AccessFlagBits::eColorAttachmentWrite, vk::DependencyFlagBits::eByRegion); dependencies.emplace_back(0, 1, vk::PipelineStageFlagBits::eLateFragmentTests, vk::PipelineStageFlagBits::eFragmentShader, vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite, vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead, vk::DependencyFlagBits::eByRegion); diff --git a/core/rend/vulkan/oit/oit_shaders.cpp b/core/rend/vulkan/oit/oit_shaders.cpp index df06af9f5..36136c2f6 100644 --- a/core/rend/vulkan/oit/oit_shaders.cpp +++ b/core/rend/vulkan/oit/oit_shaders.cpp @@ -396,60 +396,6 @@ void main() #if PASS == PASS_COLOR FragColor = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.0 || color.rgb == vec3(0.0)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || color.rgb == vec3(0.0)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && color == vec4(1.0)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.0) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.0) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - } - break; - } - ivec2 coords = ivec2(gl_FragCoord.xy); uint idx = getNextPixelIndex(); diff --git a/core/wsi/libretro.cpp b/core/wsi/libretro.cpp index d9b140566..7b7a44535 100644 --- a/core/wsi/libretro.cpp +++ b/core/wsi/libretro.cpp @@ -24,9 +24,7 @@ LibretroGraphicsContext theGLContext; #endif -#if defined(HAVE_D3D11) && !(defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)) #include "context.h" -#endif GraphicsContext *GraphicsContext::instance; #endif diff --git a/shell/libretro/libretro.cpp b/shell/libretro/libretro.cpp index f7c697783..e068fcc82 100644 --- a/shell/libretro/libretro.cpp +++ b/shell/libretro/libretro.cpp @@ -186,7 +186,6 @@ static retro_rumble_interface rumble; static void refresh_devices(bool first_startup); static void init_disk_control_interface(); static bool read_m3u(const char *file); -void UpdateInputState(); void gui_display_notification(const char *msg, int duration); static void updateVibration(u32 port, float power, float inclination, u32 durationMs); @@ -280,13 +279,14 @@ void retro_set_environment(retro_environment_t cb) { "Light Gun", RETRO_DEVICE_LIGHTGUN }, { "Twin Stick", RETRO_DEVICE_TWINSTICK }, { "Saturn Twin-Stick", RETRO_DEVICE_TWINSTICK_SATURN }, + { "Pointer", RETRO_DEVICE_POINTER }, { 0 }, }; static const struct retro_controller_info ports[] = { - { ports_default, 7 }, - { ports_default, 7 }, - { ports_default, 7 }, - { ports_default, 7 }, + { ports_default, 8 }, + { ports_default, 8 }, + { ports_default, 8 }, + { ports_default, 8 }, { 0 }, }; environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); @@ -1301,6 +1301,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = dc_joymap; joymap_size = std::size(dc_joymap); break; @@ -1318,6 +1319,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = nao_joymap; joymap_size = std::size(nao_joymap); break; @@ -1334,6 +1336,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = aw_joymap; joymap_size = std::size(aw_joymap); break; @@ -2210,6 +2213,7 @@ void retro_set_controller_port_device(unsigned in_port, unsigned device) } break; case RETRO_DEVICE_LIGHTGUN: + case RETRO_DEVICE_POINTER: config::MapleMainDevices[in_port] = MDT_LightGun; if (settings.platform.isConsole()) { config::MapleExpansionDevices[in_port][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; @@ -2435,8 +2439,18 @@ static void updateMouseState(u32 port) static void updateLightgunCoordinates(u32 port) { - int x = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); - int y = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + int x; + int y; + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) + { + x = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); + y = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + } + else + { + x = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); + y = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); + } if (config::Widescreen && config::ScreenStretching == 100 && !config::EmulateFramebuffer) mo_x_abs[port] = 640.f * ((x + 0x8000) * 4.f / 3.f / 0x10000 - (4.f / 3.f - 1.f) / 2.f); else @@ -2448,11 +2462,24 @@ static void updateLightgunCoordinates(u32 port) lightgun_params[port].y = mo_y_abs[port]; } +void updateLightgunCoordinatesFromAnalogStick(int port) +{ + int x = input_cb(port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X); + mo_x_abs[port] = 320 + x * 320 / 32767; + int y = input_cb(port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y); + mo_y_abs[port] = 240 + y * 240 / 32767; + + lightgun_params[port].offscreen = false; + lightgun_params[port].x = mo_x_abs[port]; + lightgun_params[port].y = mo_y_abs[port]; +} + static void UpdateInputStateNaomi(u32 port) { switch (config::MapleMainDevices[port]) { case MDT_LightGun: + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) { // // -- buttons @@ -2495,6 +2522,44 @@ static void UpdateInputStateNaomi(u32 port) updateLightgunCoordinates(port); } } + else + { + // RETRO_DEVICE_POINTER + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_B); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_START); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_UP); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_DOWN); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_LEFT); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + int pressed = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED); + int count = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_COUNT); + if (count > 1) + { + // reload + mo_x_abs[port] = 0; + mo_y_abs[port] = 0; + lightgun_params[port].offscreen = true; + } + else if (count == 1) + { + updateLightgunCoordinates(port); + } + if (pressed) + { + if (settings.platform.isAtomiswave()) + kcode[port] &= ~AWAVE_TRIGGER_KEY; + else + kcode[port] &= ~NAOMI_BTN0_KEY; + } + else + { + if (settings.platform.isAtomiswave()) + kcode[port] |= AWAVE_TRIGGER_KEY; + else + kcode[port] |= NAOMI_BTN0_KEY; + } + } break; default: @@ -2584,6 +2649,35 @@ static void UpdateInputStateNaomi(u32 port) // -- mouse, for rotary encoders updateMouseState(port); + // lightgun with analog stick + if (settings.input.JammaSetup == JVS::LightGun || settings.input.JammaSetup == JVS::LightGunAsAnalog) + { + updateLightgunCoordinatesFromAnalogStick(port); + if (input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD)) + { + mo_x_abs[port] = 0; + mo_y_abs[port] = 0; + lightgun_params[port].offscreen = true; + if (settings.platform.isAtomiswave()) + kcode[port] &= ~AWAVE_TRIGGER_KEY; + else + kcode[port] &= ~NAOMI_BTN0_KEY; + } + else if (settings.platform.isAtomiswave()) + { + // map btn0 to trigger, btn1 to btn0, etc. + u32 k = kcode[port] | (AWAVE_BTN0_KEY | AWAVE_BTN1_KEY | AWAVE_BTN2_KEY | AWAVE_BTN3_KEY | AWAVE_TRIGGER_KEY); + if ((kcode[port] & AWAVE_BTN0_KEY) == 0) + k &= ~AWAVE_TRIGGER_KEY; + if ((kcode[port] & AWAVE_BTN1_KEY) == 0) + k &= ~AWAVE_BTN0_KEY; + if ((kcode[port] & AWAVE_BTN2_KEY) == 0) + k &= ~AWAVE_BTN1_KEY; + if ((kcode[port] & AWAVE_BTN3_KEY) == 0) + k &= ~AWAVE_BTN2_KEY; + kcode[port] = k; + } + } } break; } @@ -2877,6 +2971,7 @@ static void UpdateInputState(u32 port) break; case MDT_LightGun: + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) { // // -- buttons @@ -2910,6 +3005,37 @@ static void UpdateInputState(u32 port) updateLightgunCoordinates(port); } } + else + { + // RETRO_DEVICE_POINTER + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_B); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_START); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_UP); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_DOWN); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_LEFT); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + int pressed = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED); + int count = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_COUNT); + if (count > 1) + { + // reload + mo_x_abs[port] = -1000; + mo_y_abs[port] = -1000; + lightgun_params[port].offscreen = true; + + lightgun_params[port].x = mo_x_abs[port]; + lightgun_params[port].y = mo_y_abs[port]; + } + else if (count == 1) + { + updateLightgunCoordinates(port); + } + if (pressed) + kcode[port] &= ~DC_BTN_A; + else + kcode[port] |= DC_BTN_A; + } break; case MDT_Mouse: diff --git a/shell/libretro/libretro_core_options_intl.h b/shell/libretro/libretro_core_options_intl.h index 7877f4914..21de47d70 100644 --- a/shell/libretro/libretro_core_options_intl.h +++ b/shell/libretro/libretro_core_options_intl.h @@ -33810,18 +33810,18 @@ struct retro_core_options_v2 options_hu = { #define CATEGORY_VMU_LABEL_ID NULL #define CATEGORY_VMU_INFO_0_ID NULL #define CORE_OPTION_NAME_REGION_LABEL_ID "Daerah" -#define OPTION_VAL_JAPAN_ID NULL +#define OPTION_VAL_JAPAN_ID "Jepang" #define OPTION_VAL_USA_ID NULL -#define OPTION_VAL_EUROPE_ID NULL +#define OPTION_VAL_EUROPE_ID "Eropa" #define OPTION_VAL_DEFAULT_ID NULL #define CORE_OPTION_NAME_LANGUAGE_LABEL_ID "Bahasa" #define CORE_OPTION_NAME_LANGUAGE_INFO_0_ID NULL -#define OPTION_VAL_JAPANESE_ID NULL -#define OPTION_VAL_ENGLISH_ID NULL -#define OPTION_VAL_GERMAN_ID NULL -#define OPTION_VAL_FRENCH_ID NULL -#define OPTION_VAL_SPANISH_ID NULL -#define OPTION_VAL_ITALIAN_ID NULL +#define OPTION_VAL_JAPANESE_ID "Bahasa Jepang" +#define OPTION_VAL_ENGLISH_ID "Bahasa Inggris" +#define OPTION_VAL_GERMAN_ID "Bahasa Jerman" +#define OPTION_VAL_FRENCH_ID "Bahasa Perancis" +#define OPTION_VAL_SPANISH_ID "Bahasa Spanyol" +#define OPTION_VAL_ITALIAN_ID "Bahasa Itali" #define CORE_OPTION_NAME_HLE_BIOS_LABEL_ID NULL #define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID "Paksa penggunaan BIOS emulasi tingkat tinggi." #define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID "Boot ke BIOS (Perlu Dimulai Ulang)" @@ -33879,7 +33879,7 @@ struct retro_core_options_v2 options_hu = { #define OPTION_VAL_PAL_M_ID NULL #define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID "Orientasi Layar" #define OPTION_VAL_HORIZONTAL_ID NULL -#define OPTION_VAL_VERTICAL_ID NULL +#define OPTION_VAL_VERTICAL_ID "Vertikal" #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_ID NULL @@ -33970,10 +33970,10 @@ struct retro_core_options_v2 options_hu = { #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID NULL #define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID NULL #define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID NULL -#define OPTION_VAL_UPPER_LEFT_ID NULL -#define OPTION_VAL_UPPER_RIGHT_ID NULL -#define OPTION_VAL_LOWER_LEFT_ID NULL -#define OPTION_VAL_LOWER_RIGHT_ID NULL +#define OPTION_VAL_UPPER_LEFT_ID "Kiri Atas" +#define OPTION_VAL_UPPER_RIGHT_ID "Kanan Atas" +#define OPTION_VAL_LOWER_LEFT_ID "Kiri Bawah" +#define OPTION_VAL_LOWER_RIGHT_ID "Kanan Bawah" #define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID NULL #define OPTION_VAL_1X_ID NULL #define OPTION_VAL_3X_ID NULL @@ -49051,10 +49051,10 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_12160X9120_RU NULL #define OPTION_VAL_12800X9600_RU NULL #define CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU "Тип кабеля" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выводимого сигнала. ТВ (Композитный) наиболее поддерживаемый." +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выходного сигнала. Наиболее поддерживаемым является 'ТВ (композит)'." #define OPTION_VAL_VGA_RU NULL #define OPTION_VAL_TV_RGB_RU "ТВ (RGB)" -#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композитный)" +#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композит)" #define CORE_OPTION_NAME_BROADCAST_LABEL_RU "Стандарт вещания" #define OPTION_VAL_NTSC_RU NULL #define OPTION_VAL_PAL_RU "PAL (Мир)" @@ -49064,10 +49064,10 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_HORIZONTAL_RU "Горизонтальная" #define OPTION_VAL_VERTICAL_RU "Вертикальная" #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU "Альфа-сортировка" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самый быстрый, но наименее точный)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (обычный)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (самый точный, но наиболее медленный)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самая быстрая, наименее точная)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (стандартная)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (точная, самая медленная)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU "Размер накопительного буфера пикселей" #define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU "Большие значения могут требоваться для правильного отображения высоких разрешений." #define OPTION_VAL_512MB_RU "512 МБ" #define OPTION_VAL_1GB_RU "1 ГБ" @@ -49078,21 +49078,21 @@ struct retro_core_options_v2 options_pt_pt = { #define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU "Полная эмуляция фреймбуфера" #define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU "Включает полную эмуляцию кадрового буфера в VRAM. Полезно для игр, которые напрямую производят чтение или запись фреймбуфера в VRAM. При включении внутреннее разрешение будет принудительно установлено в 640x480 и возможно сильное падение скорости." #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU "Включить буфер рендера в текстуру" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU "Копирует отрисованные текстуры из GPU обратно в VRAM. Данная настройка обычно включена для игр, которые этого требуют. При включении не используется масштабирование рендеринга текстур и возможно падение производительности." #define CORE_OPTION_NAME_MIPMAPPING_LABEL_RU "MIP-текстурирование" #define CORE_OPTION_NAME_FOG_LABEL_RU "Эффекты тумана" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU "Модификатор объема" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU "Функция графического процессора Dreamcast, которая обычно используется играми для отрисовки теней объектов. По умолчанию она должна быть включена - влияние на производительность обычно минимально или незначительно." #define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU "Анизотропная фильтрация" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Сглаживание текстур" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU NULL -#define OPTION_VAL_1_RU NULL -#define OPTION_VAL_2_RU NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU "Улучшает качество текстур на поверхностях под непрямыми углами обзора по отношению к камере. Более высокие значения повышают требования к GPU. Изменения настройки вступают в силу при перезапуске." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Фильтрация текстур" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU "Используемый режим фильтрации текстур. Применяется для принудительной фильтрации всех текстур, чтобы получить более чёткое (или сглаженное) изображение, отличное от стандартного. Любое значение не по умолчанию может приводить к ошибкам рендеринга. Для применения настройки требуется перезапуск." +#define OPTION_VAL_1_RU "Форс. методом ближайшего соседа" +#define OPTION_VAL_2_RU "Форс. линейное" #define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU "Задержка замены кадров" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избегать мерцания экрана или артефактов видео. Не рекомендуется на медленных платформах." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избежать мерцания экрана или искажения заставок. Не рекомендуется на медленных платформах." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU "Определять изменение частоты кадров" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU "Уведомлять фронтенд об изменениях внутренней частоты кадров (напр. с 60 до 30 к/с). Улучшает распределение кадров в играх с постоянной частотой в 30 или 20 к/с, но должно быть выключено для игр с плавающим значением частоты кадров (напр. Ecco the Dolphin, Unreal Tournament). Недоступно при вкл. опции 'Автопропуск кадров'." #define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU "Фильтр постобработки PowerVR2" #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU "Делает постобработку отображаемого изображения для имитации эффектов, специфичных для графического процессора PowerVR2 и аналоговых видеосигналов." #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU "Масштабирование текстур (xBRZ)" @@ -49101,14 +49101,14 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_4_RU NULL #define OPTION_VAL_6_RU NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU "Нативная глубина интерполяции" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU "Помогает при проблемах с глубиной и искажением текстур на видеокартах AMD. В ряде случаев также устраняет проблемы на видеокартах Intel." #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU "Рендеринг в отдельном потоке" #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU "Запускает графический и центральный процессоры в разных потоках. Настоятельно рекомендуется." #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU "Автоматический пропуск кадров" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU "Автоматически пропускать кадры при замедлении эмулятора. Применяется только с вкл. опцией 'Рендеринг в отдельном потоке'." #define OPTION_VAL_SOME_RU "Нормальный" -#define OPTION_VAL_MORE_RU NULL +#define OPTION_VAL_MORE_RU "Максимум" #define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU "Пропуск кадров" #define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU "Устанавливает количество кадров пропуска между отображаемыми кадрами." #define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU "Широкоэкранные чит-коды (требуется перезапуск)" @@ -49130,11 +49130,11 @@ struct retro_core_options_v2 options_pt_pt = { #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU "Мёртвая зона триггеров" #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU "Цифровые триггеры" #define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_RU "Модуль вибрации/Puru Puru" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU "Включает обратную связь контроллера." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU NULL +#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU "Включает отдачу контроллера." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU "Транслировать цифровые сигналы" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU "Транслировать события цифрового ввода и состояние вибрации в TCP-порт 8000. Совместимо с параметром MAME \"-output network\"." #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU "Показать настройки светового пистолета" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU "Включает конфигурацию параметров прицела светового пистолета. Для применения настройки требуется переключить быстрое меню." #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 1" #define OPTION_VAL_WHITE_RU "Белый" #define OPTION_VAL_RED_RU "Красный" @@ -49150,7 +49150,7 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_ALL_VMUS_RU "Все VMU" #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU "Показывать настройки отображения блока визуальной памяти (VMU)" #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU "Показывать настройки отображения VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU "Включает конфигурацию размера, положения, цвета и видимости эмулируемого ЖК-экрана VMU. Для применения настройки требуется переключить быстрое меню." #define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 1" #define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 1" #define OPTION_VAL_UPPER_LEFT_RU "Вверху слева" @@ -49184,7 +49184,7 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_LIGHT_PURPLE_3_22_RU "Светло-фиолетовый (3)" #define OPTION_VAL_LIGHT_ORANGE_23_RU "Светло-оранжевый" #define OPTION_VAL_ORANGE_24_RU "Оранжевый" -#define OPTION_VAL_LIGHT_PURPLE_4_25_RU NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_RU "Светло-фиолетовый (4)" #define OPTION_VAL_LIGHT_YELLOW_26_RU "Светло-жёлтый" #define OPTION_VAL_LIGHT_YELLOW_2_27_RU "Светло-жёлтый (2)" #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 1"