Skip to content

Commit 6fa36f3

Browse files
committed
[libretro] Improve directional input handling consistency
1 parent 9cc9f2d commit 6fa36f3

1 file changed

Lines changed: 97 additions & 18 deletions

File tree

platforms/libretro/libretro.cpp

Lines changed: 97 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ static bool force_gba = false;
5858
static bool sgb_enabled = true;
5959
static bool sgb_border = true;
6060
static bool allow_up_down = false;
61+
static int8_t dpad_vertical_latch = 0;
62+
static int8_t dpad_horizontal_latch = 0;
6163
static bool bootrom_dmg = false;
6264
static bool bootrom_gbc = false;
6365
static bool color_correction = true;
@@ -252,35 +254,112 @@ static void update_input(void)
252254
ib |= input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ? (1 << i) : 0;
253255
}
254256

255-
if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP))
257+
bool raw_up = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) != 0;
258+
bool raw_down = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) != 0;
259+
bool raw_left = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) != 0;
260+
bool raw_right = (ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) != 0;
261+
262+
bool up = raw_up;
263+
bool down = raw_down;
264+
bool left = raw_left;
265+
bool right = raw_right;
266+
267+
if (!allow_up_down)
256268
{
257-
if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)))
258-
core->KeyPressed(Up_Key);
269+
if (raw_up && raw_down)
270+
{
271+
if (dpad_vertical_latch > 0)
272+
{
273+
up = true;
274+
down = false;
275+
}
276+
else if (dpad_vertical_latch < 0)
277+
{
278+
up = false;
279+
down = true;
280+
}
281+
else
282+
{
283+
up = true;
284+
down = false;
285+
dpad_vertical_latch = 1;
286+
}
287+
}
288+
else if (raw_up)
289+
{
290+
up = true;
291+
down = false;
292+
dpad_vertical_latch = 1;
293+
}
294+
else if (raw_down)
295+
{
296+
up = false;
297+
down = true;
298+
dpad_vertical_latch = -1;
299+
}
300+
else
301+
{
302+
up = false;
303+
down = false;
304+
dpad_vertical_latch = 0;
305+
}
306+
307+
if (raw_left && raw_right)
308+
{
309+
if (dpad_horizontal_latch > 0)
310+
{
311+
left = true;
312+
right = false;
313+
}
314+
else if (dpad_horizontal_latch < 0)
315+
{
316+
left = false;
317+
right = true;
318+
}
319+
else
320+
{
321+
left = true;
322+
right = false;
323+
dpad_horizontal_latch = 1;
324+
}
325+
}
326+
else if (raw_left)
327+
{
328+
left = true;
329+
right = false;
330+
dpad_horizontal_latch = 1;
331+
}
332+
else if (raw_right)
333+
{
334+
left = false;
335+
right = true;
336+
dpad_horizontal_latch = -1;
337+
}
338+
else
339+
{
340+
left = false;
341+
right = false;
342+
dpad_horizontal_latch = 0;
343+
}
259344
}
345+
346+
if (up)
347+
core->KeyPressed(Up_Key);
260348
else
261349
core->KeyReleased(Up_Key);
262350

263-
if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN))
264-
{
265-
if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_UP)))
266-
core->KeyPressed(Down_Key);
267-
}
351+
if (down)
352+
core->KeyPressed(Down_Key);
268353
else
269354
core->KeyReleased(Down_Key);
270355

271-
if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT))
272-
{
273-
if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)))
274-
core->KeyPressed(Left_Key);
275-
}
356+
if (left)
357+
core->KeyPressed(Left_Key);
276358
else
277359
core->KeyReleased(Left_Key);
278360

279-
if (ib & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT))
280-
{
281-
if (allow_up_down || !(ib & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)))
282-
core->KeyPressed(Right_Key);
283-
}
361+
if (right)
362+
core->KeyPressed(Right_Key);
284363
else
285364
core->KeyReleased(Right_Key);
286365

0 commit comments

Comments
 (0)