From cd9dd6511d5565ac8f915bbb86d253691ba2e150 Mon Sep 17 00:00:00 2001 From: TwinAphex51224 Date: Mon, 5 Mar 2012 23:01:01 +0100 Subject: [PATCH] (PS3) Input can now be reconfigured --- input/input_luts.c | 220 +++++++++++++++++++++++++++++++++++++++++++++ input/input_luts.h | 4 + ps3/menu.c | 56 +++++------- 3 files changed, 247 insertions(+), 33 deletions(-) diff --git a/input/input_luts.c b/input/input_luts.c index 0a42fb1b78..f4d396ebb6 100644 --- a/input/input_luts.c +++ b/input/input_luts.c @@ -16,6 +16,7 @@ * If not, see . */ +#include #include "input_luts.h" uint64_t default_keybind_lut[SSNES_FIRST_META_KEY]; @@ -105,6 +106,225 @@ char platform_keybind_name_lut[SSNES_LAST_PLATFORM_KEY][256] = { "RStick D-Pad Up", "RStick D-Pad Down", }; + +uint64_t ssnes_input_find_previous_platform_key(uint64_t joykey) +{ + switch(joykey) + { + case CTRL_CIRCLE_MASK: + return CTRL_CIRCLE_MASK; + case CTRL_CROSS_MASK: + return CTRL_CIRCLE_MASK; + case CTRL_TRIANGLE_MASK: + return CTRL_CROSS_MASK; + case CTRL_SQUARE_MASK: + return CTRL_TRIANGLE_MASK; + case CTRL_UP_MASK: + return CTRL_SQUARE_MASK; + case CTRL_DOWN_MASK: + return CTRL_UP_MASK; + case CTRL_LEFT_MASK: + return CTRL_DOWN_MASK; + case CTRL_RIGHT_MASK: + return CTRL_LEFT_MASK; + case CTRL_SELECT_MASK: + return CTRL_RIGHT_MASK; + case CTRL_START_MASK: + return CTRL_SELECT_MASK; + case CTRL_L1_MASK: + return CTRL_START_MASK; + case CTRL_L2_MASK: + return CTRL_L1_MASK; + case CTRL_L3_MASK: + return CTRL_L2_MASK; + case CTRL_R1_MASK: + return CTRL_L3_MASK; + case CTRL_R2_MASK: + return CTRL_R1_MASK; + case CTRL_R3_MASK: + return CTRL_R2_MASK; + case CTRL_LSTICK_LEFT_MASK: + return CTRL_R3_MASK; + case CTRL_LSTICK_RIGHT_MASK: + return CTRL_LSTICK_LEFT_MASK; + case CTRL_LSTICK_UP_MASK: + return CTRL_LSTICK_RIGHT_MASK; + case CTRL_LSTICK_DOWN_MASK: + return CTRL_LSTICK_UP_MASK; + case CTRL_LEFT_MASK | CTRL_LSTICK_LEFT_MASK: + return CTRL_LSTICK_DOWN_MASK; + case CTRL_RIGHT_MASK | CTRL_LSTICK_RIGHT_MASK: + return (CTRL_LEFT_MASK | CTRL_LSTICK_LEFT_MASK); + case CTRL_UP_MASK | CTRL_LSTICK_UP_MASK: + return (CTRL_RIGHT_MASK | CTRL_LSTICK_RIGHT_MASK); + case CTRL_DOWN_MASK | CTRL_LSTICK_DOWN_MASK: + return (CTRL_UP_MASK | CTRL_LSTICK_UP_MASK); + case CTRL_RSTICK_LEFT_MASK: + return (CTRL_DOWN_MASK | CTRL_LSTICK_DOWN_MASK); + case CTRL_RSTICK_RIGHT_MASK: + return CTRL_RSTICK_LEFT_MASK; + case CTRL_RSTICK_UP_MASK: + return CTRL_RSTICK_RIGHT_MASK; + case CTRL_RSTICK_DOWN_MASK: + return CTRL_RSTICK_UP_MASK; + case CTRL_LEFT_MASK | CTRL_RSTICK_LEFT_MASK: + return CTRL_RSTICK_DOWN_MASK; + case CTRL_RIGHT_MASK | CTRL_RSTICK_RIGHT_MASK: + return (CTRL_LEFT_MASK | CTRL_RSTICK_LEFT_MASK); + case CTRL_UP_MASK | CTRL_RSTICK_UP_MASK: + return (CTRL_RIGHT_MASK | CTRL_RSTICK_RIGHT_MASK); + case CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK: + return (CTRL_UP_MASK | CTRL_RSTICK_UP_MASK); + } + + return NO_BTN; +} + +uint64_t ssnes_input_find_next_platform_key(uint64_t joykey) +{ + switch(joykey) + { + case CTRL_CIRCLE_MASK: + return CTRL_CROSS_MASK; + case CTRL_CROSS_MASK: + return CTRL_TRIANGLE_MASK; + case CTRL_TRIANGLE_MASK: + return CTRL_SQUARE_MASK; + case CTRL_SQUARE_MASK: + return CTRL_UP_MASK; + case CTRL_UP_MASK: + return CTRL_DOWN_MASK; + case CTRL_DOWN_MASK: + return CTRL_LEFT_MASK; + case CTRL_LEFT_MASK: + return CTRL_RIGHT_MASK; + case CTRL_RIGHT_MASK: + return CTRL_SELECT_MASK; + case CTRL_SELECT_MASK: + return CTRL_START_MASK; + case CTRL_START_MASK: + return CTRL_L1_MASK; + case CTRL_L1_MASK: + return CTRL_L2_MASK; + case CTRL_L2_MASK: + return CTRL_L3_MASK; + case CTRL_L3_MASK: + return CTRL_R1_MASK; + case CTRL_R1_MASK: + return CTRL_R2_MASK; + case CTRL_R2_MASK: + return CTRL_R3_MASK; + case CTRL_R3_MASK: + return CTRL_LSTICK_LEFT_MASK; + case CTRL_LSTICK_LEFT_MASK: + return CTRL_LSTICK_RIGHT_MASK; + case CTRL_LSTICK_RIGHT_MASK: + return CTRL_LSTICK_UP_MASK; + case CTRL_LSTICK_UP_MASK: + return CTRL_LSTICK_DOWN_MASK; + case CTRL_LSTICK_DOWN_MASK: + return (CTRL_LEFT_MASK | CTRL_LSTICK_LEFT_MASK); + case CTRL_LEFT_MASK | CTRL_LSTICK_LEFT_MASK: + return (CTRL_RIGHT_MASK | CTRL_LSTICK_RIGHT_MASK); + case CTRL_RIGHT_MASK | CTRL_LSTICK_RIGHT_MASK: + return (CTRL_UP_MASK | CTRL_LSTICK_UP_MASK); + case CTRL_UP_MASK | CTRL_LSTICK_UP_MASK: + return (CTRL_DOWN_MASK | CTRL_LSTICK_DOWN_MASK); + case CTRL_DOWN_MASK | CTRL_LSTICK_DOWN_MASK: + return CTRL_RSTICK_LEFT_MASK; + case CTRL_RSTICK_LEFT_MASK: + return CTRL_RSTICK_RIGHT_MASK; + case CTRL_RSTICK_RIGHT_MASK: + return CTRL_RSTICK_UP_MASK; + case CTRL_RSTICK_UP_MASK: + return CTRL_RSTICK_DOWN_MASK; + case CTRL_RSTICK_DOWN_MASK: + return (CTRL_LEFT_MASK | CTRL_RSTICK_LEFT_MASK); + case CTRL_LEFT_MASK | CTRL_RSTICK_LEFT_MASK: + return (CTRL_RIGHT_MASK | CTRL_RSTICK_RIGHT_MASK); + case CTRL_RIGHT_MASK | CTRL_RSTICK_RIGHT_MASK: + return (CTRL_UP_MASK | CTRL_RSTICK_UP_MASK); + case CTRL_UP_MASK | CTRL_RSTICK_UP_MASK: + return (CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK); + case CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK: + return (CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK); + } + + return NO_BTN; +} + +const char * ssnes_input_find_platform_key_label(uint64_t joykey) +{ + switch(joykey) + { + case CTRL_CIRCLE_MASK: + return "Circle button"; + case CTRL_CROSS_MASK: + return "Cross button"; + case CTRL_TRIANGLE_MASK: + return "Triangle button"; + case CTRL_SQUARE_MASK: + return "Square button"; + case CTRL_UP_MASK: + return "D-Pad Up"; + case CTRL_DOWN_MASK: + return "D-Pad Down"; + case CTRL_LEFT_MASK: + return "D-Pad Left"; + case CTRL_RIGHT_MASK: + return "D-Pad Right"; + case CTRL_SELECT_MASK: + return "Select button"; + case CTRL_START_MASK: + return "Start button"; + case CTRL_L1_MASK: + return "L1 button"; + case CTRL_L2_MASK: + return "L2 button"; + case CTRL_L3_MASK: + return "L3 button"; + case CTRL_R1_MASK: + return "R1 button"; + case CTRL_R2_MASK: + return "R2 button"; + case CTRL_R3_MASK: + return "R3 button"; + case CTRL_LSTICK_LEFT_MASK: + return "LStick Left"; + case CTRL_LSTICK_RIGHT_MASK: + return "LStick Right"; + case CTRL_LSTICK_UP_MASK: + return "LStick Up"; + case CTRL_LSTICK_DOWN_MASK: + return "LStick Down"; + case CTRL_LEFT_MASK | CTRL_LSTICK_LEFT_MASK: + return "LStick D-Pad Left"; + case CTRL_RIGHT_MASK | CTRL_LSTICK_RIGHT_MASK: + return "LStick D-Pad Right"; + case CTRL_UP_MASK | CTRL_LSTICK_UP_MASK: + return "LStick D-Pad Up"; + case CTRL_DOWN_MASK | CTRL_LSTICK_DOWN_MASK: + return "LStick D-Pad Down"; + case CTRL_RSTICK_LEFT_MASK: + return "RStick Left"; + case CTRL_RSTICK_RIGHT_MASK: + return "RStick Right"; + case CTRL_RSTICK_UP_MASK: + return "RStick Up"; + case CTRL_RSTICK_DOWN_MASK: + return "RStick Down"; + case CTRL_LEFT_MASK | CTRL_RSTICK_LEFT_MASK: + return "RStick D-Pad Left"; + case CTRL_RIGHT_MASK | CTRL_RSTICK_RIGHT_MASK: + return "RStick D-Pad Right"; + case CTRL_UP_MASK | CTRL_RSTICK_UP_MASK: + return "RStick D-Pad Up"; + case CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK: + return "RStick D-Pad Down"; + } + + return "Unknown"; +} #elif defined(_XBOX) #endif diff --git a/input/input_luts.h b/input/input_luts.h index bfa0af0d8b..fc3fef6968 100644 --- a/input/input_luts.h +++ b/input/input_luts.h @@ -72,5 +72,9 @@ extern char platform_keybind_name_lut[SSNES_LAST_PLATFORM_KEY][256]; extern uint64_t default_keybind_lut[SSNES_FIRST_META_KEY]; extern const char *default_libsnes_keybind_name_lut[SSNES_FIRST_META_KEY]; +extern const char * ssnes_input_find_platform_key_label(uint64_t joykey); +extern uint64_t ssnes_input_find_previous_platform_key(uint64_t joykey); +extern uint64_t ssnes_input_find_next_platform_key(uint64_t joykey); + #endif diff --git a/ps3/menu.c b/ps3/menu.c index 9dcb5ce389..f6e775db29 100644 --- a/ps3/menu.c +++ b/ps3/menu.c @@ -738,12 +738,15 @@ static void set_setting_label(menu * menu_obj, uint64_t currentsetting) case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_X: case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_L: case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_R: + { if(g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].joykey == default_keybind_lut[currentsetting-FIRST_CONTROL_BIND]) menu_obj->items[currentsetting].text_color = GREEN; else menu_obj->items[currentsetting].text_color = ORANGE; - snprintf(menu_obj->items[currentsetting].comment, sizeof(menu_obj->items[currentsetting].comment), "INFO - [%s] on the PS3 controller is mapped to action:\n[%s].", menu_obj->items[currentsetting].text, default_libsnes_keybind_name_lut[g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].id]); - snprintf(menu_obj->items[currentsetting].setting_text, sizeof(menu_obj->items[currentsetting].setting_text), default_libsnes_keybind_name_lut[g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].id]); + const char * value = ssnes_input_find_platform_key_label(g_settings.input.binds[currently_selected_controller_menu][currentsetting-(FIRST_CONTROL_BIND)].joykey); + snprintf(menu_obj->items[currentsetting].comment, sizeof(menu_obj->items[currentsetting].comment), "INFO - [%s] on the PS3 controller is mapped to action:\n[%s].", menu_obj->items[currentsetting].text, value); + snprintf(menu_obj->items[currentsetting].setting_text, sizeof(menu_obj->items[currentsetting].setting_text), value); + } break; case SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS: if(menu_obj->selected == currentsetting) @@ -1068,35 +1071,22 @@ static void select_directory(uint32_t menu_id) static void set_keybind_digital(uint64_t state, uint64_t system_joypad_id, uint64_t default_snes_joypad_id) { - bool found_keybind = false; + uint64_t new_key; if(CTRL_LEFT(state) | CTRL_LSTICK_LEFT(state)) { - for(uint32_t i = 0; i < SSNES_FIRST_META_KEY && !found_keybind; i++) - { - if(g_settings.input.binds[currently_selected_controller_menu][i].joykey & system_joypad_id) - { - found_keybind = true; + new_key = ssnes_input_find_previous_platform_key(g_settings.input.binds[currently_selected_controller_menu][default_snes_joypad_id].joykey); - if(g_settings.input.binds[currently_selected_controller_menu][i].id > 0) - g_settings.input.binds[currently_selected_controller_menu][i].id--; - } - } + g_settings.input.binds[currently_selected_controller_menu][default_snes_joypad_id].joykey = new_key; set_delay = DELAY_MEDIUM; } if(CTRL_RIGHT(state) || CTRL_LSTICK_RIGHT(state) || CTRL_CROSS(state)) { - for(uint32_t i = 0; i < SSNES_FIRST_META_KEY && !found_keybind; i++) - { - if(g_settings.input.binds[currently_selected_controller_menu][i].joykey & system_joypad_id) - { - found_keybind = true; + new_key = ssnes_input_find_next_platform_key(g_settings.input.binds[currently_selected_controller_menu][default_snes_joypad_id].joykey); + + g_settings.input.binds[currently_selected_controller_menu][default_snes_joypad_id].joykey = new_key; - if(g_settings.input.binds[currently_selected_controller_menu][i].id < SSNES_FIRST_META_KEY - 1) - g_settings.input.binds[currently_selected_controller_menu][i].id++; - } - } set_delay = DELAY_MEDIUM; } @@ -1774,40 +1764,40 @@ static void producesettingentry(menu * menu_obj, uint64_t switchvalue) currently_selected_controller_menu = 0; break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_UP: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_UP], SNES_DEVICE_ID_JOYPAD_UP); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_UP, SNES_DEVICE_ID_JOYPAD_UP); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_DOWN: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_DOWN], SNES_DEVICE_ID_JOYPAD_DOWN); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_DOWN, SNES_DEVICE_ID_JOYPAD_DOWN); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_LEFT: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_LEFT], SNES_DEVICE_ID_JOYPAD_LEFT); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_LEFT, SNES_DEVICE_ID_JOYPAD_LEFT); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_RIGHT: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_RIGHT], SNES_DEVICE_ID_JOYPAD_RIGHT); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_RIGHT, SNES_DEVICE_ID_JOYPAD_RIGHT); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_A: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_CIRCLE], SNES_DEVICE_ID_JOYPAD_A); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_CIRCLE, SNES_DEVICE_ID_JOYPAD_A); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_B: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_CROSS], SNES_DEVICE_ID_JOYPAD_B); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_CROSS, SNES_DEVICE_ID_JOYPAD_B); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_X: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_TRIANGLE], SNES_DEVICE_ID_JOYPAD_X); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_TRIANGLE, SNES_DEVICE_ID_JOYPAD_X); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_Y: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_SQUARE], SNES_DEVICE_ID_JOYPAD_Y); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_SQUARE, SNES_DEVICE_ID_JOYPAD_Y); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_SELECT: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_SELECT], SNES_DEVICE_ID_JOYPAD_SELECT); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_SELECT, SNES_DEVICE_ID_JOYPAD_SELECT); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_START: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_START], SNES_DEVICE_ID_JOYPAD_START); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_START, SNES_DEVICE_ID_JOYPAD_START); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_L: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_L1], SNES_DEVICE_ID_JOYPAD_L); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_L1, SNES_DEVICE_ID_JOYPAD_L); break; case SETTING_CONTROLS_SNES_DEVICE_ID_JOYPAD_R: - set_keybind_digital(state, platform_keybind_lut[PS3_DEVICE_ID_JOYPAD_R1], SNES_DEVICE_ID_JOYPAD_R); + set_keybind_digital(state, PS3_DEVICE_ID_JOYPAD_R1, SNES_DEVICE_ID_JOYPAD_R); break; case SETTING_CONTROLS_SAVE_CUSTOM_CONTROLS: if(CTRL_LEFT(state) || CTRL_LSTICK_LEFT(state) || CTRL_RIGHT(state) || CTRL_LSTICK_RIGHT(state) || CTRL_CROSS(state) || CTRL_START(state))