diff --git a/stepmania/Data/AutoMappings/GamePad Pro USB.ini b/stepmania/Data/AutoMappings/GamePad Pro USB.ini new file mode 100644 index 0000000000..88244c8715 --- /dev/null +++ b/stepmania/Data/AutoMappings/GamePad Pro USB.ini @@ -0,0 +1,28 @@ +[AutoMapping] +;Intentional space at the end of the Device name +DeviceRegex=GamePad Pro USB +Description=GamePad Pro USB + +[dance] +Controller1_Back=Joy1_B9 +Controller1_Down=Joy1_Down1:Joy1_B2 +Controller1_Left=Joy1_Left1:Joy1_B1 +Controller1_Right=Joy1_Right1:Joy1_B3 +Controller1_Start=Joy1_B10 +Controller1_Up=Joy1_Up1:Joy1_B4 +Controller1_UpLeft=Joy1_B5 +Controller1_UpRight=Joy1_B6 + +[pump] +Controller1_Back=Joy1_B9 +Controller1_Center=Joy1_B1 +Controller1_DownLeft=Joy1_B7 +Controller1_DownRight=Joy1_B8 +Controller1_MenuDown=Joy1_Down1 +Controller1_MenuLeft=Joy1_Left1 +Controller1_MenuRight=Joy1_Right1 +Controller1_MenuUp=Joy1_Up1 +Controller1_Start=Joy1_B10 +Controller1_UpLeft=Joy1_B5 +Controller1_UpRight=Joy1_B6 + diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index 07e82d0188..2b12a71cfd 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -77,28 +77,29 @@ static const StepsTypeInfo g_StepsTypeInfos[] = { // // Important: Every game must define the buttons: "Start", "Back", "MenuLeft", "Operator" and "MenuRight" // -const InputMapping g_AutoKeyMappings_Dance[] = -{ - { 0, KEY_DEL, GAME_BUTTON_MENULEFT, false }, - { 0, KEY_PGDN, GAME_BUTTON_MENURIGHT, false }, - { 0, KEY_HOME, GAME_BUTTON_MENUUP, false }, - { 0, KEY_END, GAME_BUTTON_MENUDOWN, false }, - { 0, KEY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, KEY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, KEY_UP, DANCE_BUTTON_UP, false }, - { 0, KEY_DOWN, DANCE_BUTTON_DOWN, false }, - { 0, KEY_KP_SLASH, GAME_BUTTON_MENULEFT, true }, - { 0, KEY_KP_ASTERISK, GAME_BUTTON_MENURIGHT, true }, - { 0, KEY_KP_HYPHEN, GAME_BUTTON_MENUUP, true }, - { 0, KEY_KP_PLUS, GAME_BUTTON_MENUDOWN, true }, - { 0, KEY_KP_C4, DANCE_BUTTON_LEFT, true }, - { 0, KEY_KP_C6, DANCE_BUTTON_RIGHT, true }, - { 0, KEY_KP_C7, DANCE_BUTTON_UP, true }, - { 0, KEY_KP_C9, DANCE_BUTTON_DOWN, true }, - { 0, KEY_KP_C7, DANCE_BUTTON_UPLEFT, true }, - { 0, KEY_KP_C9, DANCE_BUTTON_UPRIGHT, true }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Dance = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_DEL, GAME_BUTTON_MENULEFT, false ), + AutoMappingEntry( 0, KEY_PGDN, GAME_BUTTON_MENURIGHT, false ), + AutoMappingEntry( 0, KEY_HOME, GAME_BUTTON_MENUUP, false ), + AutoMappingEntry( 0, KEY_END, GAME_BUTTON_MENUDOWN, false ), + AutoMappingEntry( 0, KEY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, KEY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, KEY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, KEY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, KEY_KP_SLASH, GAME_BUTTON_MENULEFT, true ), + AutoMappingEntry( 0, KEY_KP_ASTERISK, GAME_BUTTON_MENURIGHT, true ), + AutoMappingEntry( 0, KEY_KP_HYPHEN, GAME_BUTTON_MENUUP, true ), + AutoMappingEntry( 0, KEY_KP_PLUS, GAME_BUTTON_MENUDOWN, true ), + AutoMappingEntry( 0, KEY_KP_C4, DANCE_BUTTON_LEFT, true ), + AutoMappingEntry( 0, KEY_KP_C6, DANCE_BUTTON_RIGHT, true ), + AutoMappingEntry( 0, KEY_KP_C7, DANCE_BUTTON_UP, true ), + AutoMappingEntry( 0, KEY_KP_C9, DANCE_BUTTON_DOWN, true ), + AutoMappingEntry( 0, KEY_KP_C7, DANCE_BUTTON_UPLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C9, DANCE_BUTTON_UPRIGHT, true ) +); static const int DANCE_COL_SPACING = 64; @@ -450,7 +451,7 @@ static const Game g_Game_Dance = { "UpLeft", GameButton_Invalid }, { "UpRight", GameButton_Invalid }, }, - g_AutoKeyMappings_Dance + &g_AutoKeyMappings_Dance }, { { GameButtonType_Step }, @@ -467,27 +468,27 @@ static const Game g_Game_Dance = TNS_W5, // m_mapW5To }; -const InputMapping g_AutoKeyMappings_Pump[] = -{ - { 0, KEY_Cq, PUMP_BUTTON_UPLEFT, false }, - { 0, KEY_Ce, PUMP_BUTTON_UPRIGHT, false }, - { 0, KEY_Cs, PUMP_BUTTON_CENTER, false }, - { 0, KEY_Cz, PUMP_BUTTON_DOWNLEFT, false }, - { 0, KEY_Cc, PUMP_BUTTON_DOWNRIGHT, false }, - { 0, KEY_KP_C7, PUMP_BUTTON_UPLEFT, true }, - { 0, KEY_KP_C9, PUMP_BUTTON_UPRIGHT, true }, - { 0, KEY_KP_C5, PUMP_BUTTON_CENTER, true }, - { 0, KEY_KP_C1, PUMP_BUTTON_DOWNLEFT, true }, - { 0, KEY_KP_C3, PUMP_BUTTON_DOWNRIGHT, true }, +static const AutoMappings g_AutoKeyMappings_Pump = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cq, PUMP_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, KEY_Ce, PUMP_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cs, PUMP_BUTTON_CENTER, false ), + AutoMappingEntry( 0, KEY_Cz, PUMP_BUTTON_DOWNLEFT, false ), + AutoMappingEntry( 0, KEY_Cc, PUMP_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, KEY_KP_C7, PUMP_BUTTON_UPLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C9, PUMP_BUTTON_UPRIGHT, true ), + AutoMappingEntry( 0, KEY_KP_C5, PUMP_BUTTON_CENTER, true ), + AutoMappingEntry( 0, KEY_KP_C1, PUMP_BUTTON_DOWNLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C3, PUMP_BUTTON_DOWNRIGHT, true ), // unmap confusing default MenuButtons - { 0, KEY_KP_C8, GameButton_Invalid, false }, - { 0, KEY_KP_C2, GameButton_Invalid, false }, - { 0, KEY_KP_C4, GameButton_Invalid, false }, - { 0, KEY_KP_C6, GameButton_Invalid, false }, - - InputMapping_END -}; + AutoMappingEntry( 0, KEY_KP_C8, GameButton_Invalid, false ), + AutoMappingEntry( 0, KEY_KP_C2, GameButton_Invalid, false ), + AutoMappingEntry( 0, KEY_KP_C4, GameButton_Invalid, false ), + AutoMappingEntry( 0, KEY_KP_C6, GameButton_Invalid, false ) +); static const int PUMP_COL_SPACING = 50; static const Style g_Style_Pump_Single = @@ -762,7 +763,7 @@ static const Game g_Game_Pump = { "DownLeft", MENU_BUTTON_LEFT }, { "DownRight", MENU_BUTTON_RIGHT }, }, - g_AutoKeyMappings_Pump + &g_AutoKeyMappings_Pump }, { { GameButtonType_Step }, @@ -998,17 +999,18 @@ static const Style *g_apGame_Ez2_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Ez2[] = -{ - { 0, KEY_Cz, EZ2_BUTTON_FOOTUPLEFT, false }, - { 0, KEY_Cb, EZ2_BUTTON_FOOTUPRIGHT, false }, - { 0, KEY_Cc, EZ2_BUTTON_FOOTDOWN, false }, - { 0, KEY_Cx, EZ2_BUTTON_HANDUPLEFT, false }, - { 0, KEY_Cv, EZ2_BUTTON_HANDUPRIGHT, false }, - { 0, KEY_Cs, EZ2_BUTTON_HANDLRLEFT, false }, - { 0, KEY_Cf, EZ2_BUTTON_HANDLRRIGHT, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Ez2 = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cz, EZ2_BUTTON_FOOTUPLEFT, false ), + AutoMappingEntry( 0, KEY_Cb, EZ2_BUTTON_FOOTUPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cc, EZ2_BUTTON_FOOTDOWN, false ), + AutoMappingEntry( 0, KEY_Cx, EZ2_BUTTON_HANDUPLEFT, false ), + AutoMappingEntry( 0, KEY_Cv, EZ2_BUTTON_HANDUPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cs, EZ2_BUTTON_HANDLRLEFT, false ), + AutoMappingEntry( 0, KEY_Cf, EZ2_BUTTON_HANDLRRIGHT, false ) +); static const Game g_Game_Ez2 = { @@ -1028,7 +1030,7 @@ static const Game g_Game_Ez2 = { "HandLrLeft", GameButton_Invalid }, { "HandLrRight", GameButton_Invalid }, }, - g_AutoKeyMappings_Ez2 + &g_AutoKeyMappings_Ez2 }, { { GameButtonType_Step }, @@ -1129,15 +1131,16 @@ static const Style *g_apGame_Para_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Para[] = -{ - { 0, KEY_Cz, PARA_BUTTON_LEFT, false }, - { 0, KEY_Cx, PARA_BUTTON_UPLEFT, false }, - { 0, KEY_Cc, PARA_BUTTON_UP, false }, - { 0, KEY_Cv, PARA_BUTTON_UPRIGHT, false }, - { 0, KEY_Cb, PARA_BUTTON_RIGHT, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Para = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cz, PARA_BUTTON_LEFT, false ), + AutoMappingEntry( 0, KEY_Cx, PARA_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, KEY_Cc, PARA_BUTTON_UP, false ), + AutoMappingEntry( 0, KEY_Cv, PARA_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cb, PARA_BUTTON_RIGHT, false ) +); static const Game g_Game_Para = { @@ -1155,7 +1158,7 @@ static const Game g_Game_Para = { "UpRight", MENU_BUTTON_UP }, { "Right", MENU_BUTTON_RIGHT }, }, - g_AutoKeyMappings_Para + &g_AutoKeyMappings_Para }, { { GameButtonType_Step }, @@ -1222,18 +1225,19 @@ static const Style *g_apGame_DS3DDX_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_DS3DDX[] = -{ - { 0, KEY_Ca, DS3DDX_BUTTON_HANDLEFT, false }, - { 0, KEY_Cz, DS3DDX_BUTTON_FOOTDOWNLEFT, false }, - { 0, KEY_Cq, DS3DDX_BUTTON_FOOTUPLEFT, false }, - { 0, KEY_Cw, DS3DDX_BUTTON_HANDUP, false }, - { 0, KEY_Cx, DS3DDX_BUTTON_HANDDOWN, false }, - { 0, KEY_Ce, DS3DDX_BUTTON_FOOTUPRIGHT, false }, - { 0, KEY_Cc, DS3DDX_BUTTON_FOOTDOWNRIGHT, false }, - { 0, KEY_Cd, DS3DDX_BUTTON_HANDRIGHT, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_DS3DDX = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Ca, DS3DDX_BUTTON_HANDLEFT, false ), + AutoMappingEntry( 0, KEY_Cz, DS3DDX_BUTTON_FOOTDOWNLEFT, false ), + AutoMappingEntry( 0, KEY_Cq, DS3DDX_BUTTON_FOOTUPLEFT, false ), + AutoMappingEntry( 0, KEY_Cw, DS3DDX_BUTTON_HANDUP, false ), + AutoMappingEntry( 0, KEY_Cx, DS3DDX_BUTTON_HANDDOWN, false ), + AutoMappingEntry( 0, KEY_Ce, DS3DDX_BUTTON_FOOTUPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cc, DS3DDX_BUTTON_FOOTDOWNRIGHT, false ), + AutoMappingEntry( 0, KEY_Cd, DS3DDX_BUTTON_HANDRIGHT, false ) +); static const Game g_Game_DS3DDX = { @@ -1254,7 +1258,7 @@ static const Game g_Game_DS3DDX = { "FootDownRight", GameButton_Invalid }, { "HandRight", MENU_BUTTON_RIGHT }, }, - g_AutoKeyMappings_DS3DDX + &g_AutoKeyMappings_DS3DDX }, { { GameButtonType_Step }, @@ -1479,18 +1483,19 @@ static const Style *g_apGame_Beat_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Beat[] = -{ - { 0, KEY_Cm, BEAT_BUTTON_KEY1, false }, - { 0, KEY_Ck, BEAT_BUTTON_KEY2, false }, - { 0, KEY_COMMA, BEAT_BUTTON_KEY3, false }, - { 0, KEY_Cl, BEAT_BUTTON_KEY4, false }, - { 0, KEY_PERIOD, BEAT_BUTTON_KEY5, false }, - { 0, KEY_SEMICOLON, BEAT_BUTTON_KEY6, false }, - { 0, KEY_SLASH, BEAT_BUTTON_KEY7, false }, - { 0, KEY_LSHIFT, BEAT_BUTTON_SCRATCHUP, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Beat = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cm, BEAT_BUTTON_KEY1, false ), + AutoMappingEntry( 0, KEY_Ck, BEAT_BUTTON_KEY2, false ), + AutoMappingEntry( 0, KEY_COMMA, BEAT_BUTTON_KEY3, false ), + AutoMappingEntry( 0, KEY_Cl, BEAT_BUTTON_KEY4, false ), + AutoMappingEntry( 0, KEY_PERIOD, BEAT_BUTTON_KEY5, false ), + AutoMappingEntry( 0, KEY_SEMICOLON, BEAT_BUTTON_KEY6, false ), + AutoMappingEntry( 0, KEY_SLASH, BEAT_BUTTON_KEY7, false ), + AutoMappingEntry( 0, KEY_LSHIFT, BEAT_BUTTON_SCRATCHUP, false ) +); static const Game g_Game_Beat = { @@ -1512,7 +1517,7 @@ static const Game g_Game_Beat = { "Scratch up", MENU_BUTTON_UP }, { "Scratch down", MENU_BUTTON_DOWN }, }, - g_AutoKeyMappings_Beat + &g_AutoKeyMappings_Beat }, { { GameButtonType_Step }, @@ -1657,18 +1662,19 @@ static const Style *g_apGame_Maniax_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Maniax[] = -{ - { 0, KEY_Ca, MANIAX_BUTTON_HANDUPLEFT, false }, - { 0, KEY_Cs, MANIAX_BUTTON_HANDUPRIGHT, false }, - { 0, KEY_Cz, MANIAX_BUTTON_HANDLRLEFT, false }, - { 0, KEY_Cx, MANIAX_BUTTON_HANDLRRIGHT, false }, - { 0, KEY_KP_C4, MANIAX_BUTTON_HANDUPLEFT, true }, - { 0, KEY_KP_C5, MANIAX_BUTTON_HANDUPRIGHT, true }, - { 0, KEY_KP_C1, MANIAX_BUTTON_HANDLRLEFT, true }, - { 0, KEY_KP_C2, MANIAX_BUTTON_HANDLRRIGHT, true }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Maniax = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Ca, MANIAX_BUTTON_HANDUPLEFT, false ), + AutoMappingEntry( 0, KEY_Cs, MANIAX_BUTTON_HANDUPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cz, MANIAX_BUTTON_HANDLRLEFT, false ), + AutoMappingEntry( 0, KEY_Cx, MANIAX_BUTTON_HANDLRRIGHT, false ), + AutoMappingEntry( 0, KEY_KP_C4, MANIAX_BUTTON_HANDUPLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C5, MANIAX_BUTTON_HANDUPRIGHT, true ), + AutoMappingEntry( 0, KEY_KP_C1, MANIAX_BUTTON_HANDLRLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C2, MANIAX_BUTTON_HANDLRRIGHT, true ) +); static const Game g_Game_Maniax = { @@ -1685,7 +1691,7 @@ static const Game g_Game_Maniax = { "HandLrLeft", MENU_BUTTON_DOWN }, { "HandLrRight", MENU_BUTTON_UP }, }, - g_AutoKeyMappings_Maniax + &g_AutoKeyMappings_Maniax }, { { GameButtonType_Step }, @@ -2051,28 +2057,29 @@ static const Style *g_apGame_Techno_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Techno[] = -{ - { 0, KEY_Ca, TECHNO_BUTTON_LEFT, false }, - { 0, KEY_Cd, TECHNO_BUTTON_RIGHT, false }, - { 0, KEY_Cw, TECHNO_BUTTON_UP, false }, - { 0, KEY_Cx, TECHNO_BUTTON_DOWN, false }, - { 0, KEY_Cq, TECHNO_BUTTON_UPLEFT, false }, - { 0, KEY_Ce, TECHNO_BUTTON_UPRIGHT, false }, - { 0, KEY_Cs, TECHNO_BUTTON_CENTER, false }, - { 0, KEY_Cz, TECHNO_BUTTON_DOWNLEFT, false }, - { 0, KEY_Cc, TECHNO_BUTTON_DOWNRIGHT,false }, - { 0, KEY_KP_C4, TECHNO_BUTTON_LEFT, true }, - { 0, KEY_KP_C6, TECHNO_BUTTON_RIGHT, true }, - { 0, KEY_KP_C8, TECHNO_BUTTON_UP, true }, - { 0, KEY_KP_C2, TECHNO_BUTTON_DOWN, true }, - { 0, KEY_KP_C7, TECHNO_BUTTON_UPLEFT, true }, - { 0, KEY_KP_C9, TECHNO_BUTTON_UPRIGHT, true }, - { 0, KEY_KP_C5, TECHNO_BUTTON_CENTER, true }, - { 0, KEY_KP_C1, TECHNO_BUTTON_DOWNLEFT, true }, - { 0, KEY_KP_C3, TECHNO_BUTTON_DOWNRIGHT,true }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Techno = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Ca, TECHNO_BUTTON_LEFT, false ), + AutoMappingEntry( 0, KEY_Cd, TECHNO_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, KEY_Cw, TECHNO_BUTTON_UP, false ), + AutoMappingEntry( 0, KEY_Cx, TECHNO_BUTTON_DOWN, false ), + AutoMappingEntry( 0, KEY_Cq, TECHNO_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, KEY_Ce, TECHNO_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, KEY_Cs, TECHNO_BUTTON_CENTER, false ), + AutoMappingEntry( 0, KEY_Cz, TECHNO_BUTTON_DOWNLEFT, false ), + AutoMappingEntry( 0, KEY_Cc, TECHNO_BUTTON_DOWNRIGHT,false ), + AutoMappingEntry( 0, KEY_KP_C4, TECHNO_BUTTON_LEFT, true ), + AutoMappingEntry( 0, KEY_KP_C6, TECHNO_BUTTON_RIGHT, true ), + AutoMappingEntry( 0, KEY_KP_C8, TECHNO_BUTTON_UP, true ), + AutoMappingEntry( 0, KEY_KP_C2, TECHNO_BUTTON_DOWN, true ), + AutoMappingEntry( 0, KEY_KP_C7, TECHNO_BUTTON_UPLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C9, TECHNO_BUTTON_UPRIGHT, true ), + AutoMappingEntry( 0, KEY_KP_C5, TECHNO_BUTTON_CENTER, true ), + AutoMappingEntry( 0, KEY_KP_C1, TECHNO_BUTTON_DOWNLEFT, true ), + AutoMappingEntry( 0, KEY_KP_C3, TECHNO_BUTTON_DOWNRIGHT,true ) +); static const Game g_Game_Techno = { @@ -2094,7 +2101,7 @@ static const Game g_Game_Techno = { "DownLeft", GameButton_Invalid }, { "DownRight", GameButton_Invalid }, }, - g_AutoKeyMappings_Techno + &g_AutoKeyMappings_Techno }, { { GameButtonType_Step }, @@ -2207,19 +2214,20 @@ static const Style *g_apGame_Popn_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Popn[] = -{ - { 0, KEY_Cz, POPN_BUTTON_LEFT_WHITE, false }, - { 0, KEY_Cs, POPN_BUTTON_LEFT_YELLOW,false }, - { 0, KEY_Cx, POPN_BUTTON_LEFT_GREEN, false }, - { 0, KEY_Cd, POPN_BUTTON_LEFT_BLUE, false }, - { 0, KEY_Cc, POPN_BUTTON_RED, false }, - { 0, KEY_Cf, POPN_BUTTON_RIGHT_BLUE, false }, - { 0, KEY_Cv, POPN_BUTTON_RIGHT_GREEN,false }, - { 0, KEY_Cg, POPN_BUTTON_RIGHT_YELLOW,false }, - { 0, KEY_Cb, POPN_BUTTON_RIGHT_WHITE,false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Popn = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cz, POPN_BUTTON_LEFT_WHITE, false ), + AutoMappingEntry( 0, KEY_Cs, POPN_BUTTON_LEFT_YELLOW,false ), + AutoMappingEntry( 0, KEY_Cx, POPN_BUTTON_LEFT_GREEN, false ), + AutoMappingEntry( 0, KEY_Cd, POPN_BUTTON_LEFT_BLUE, false ), + AutoMappingEntry( 0, KEY_Cc, POPN_BUTTON_RED, false ), + AutoMappingEntry( 0, KEY_Cf, POPN_BUTTON_RIGHT_BLUE, false ), + AutoMappingEntry( 0, KEY_Cv, POPN_BUTTON_RIGHT_GREEN,false ), + AutoMappingEntry( 0, KEY_Cg, POPN_BUTTON_RIGHT_YELLOW,false ), + AutoMappingEntry( 0, KEY_Cb, POPN_BUTTON_RIGHT_WHITE,false ) +); static const Game g_Game_Popn = { @@ -2241,7 +2249,7 @@ static const Game g_Game_Popn = { "Right Yellow", MENU_BUTTON_DOWN }, { "Right White", GameButton_Invalid }, }, - g_AutoKeyMappings_Popn + &g_AutoKeyMappings_Popn }, { { GameButtonType_Step }, @@ -2297,11 +2305,12 @@ static const Style *g_apGame_Karaoke_Styles[] = NULL }; -const InputMapping g_AutoKeyMappings_Karaoke[] = -{ - { 0, KEY_LEFT, KARAOKE_BUTTON_LEFT, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Karaoke = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_LEFT, KARAOKE_BUTTON_LEFT, false ) +); static const Game g_Game_Karaoke = { @@ -2315,7 +2324,7 @@ static const Game g_Game_Karaoke = { // m_szButtonNames { "Left", MENU_BUTTON_LEFT }, }, - g_AutoKeyMappings_Karaoke + &g_AutoKeyMappings_Karaoke }, { { GameButtonType_Step }, @@ -2327,18 +2336,19 @@ static const Game g_Game_Karaoke = TNS_W5, // m_mapW5To }; -const InputMapping g_AutoKeyMappings_Lights[] = -{ - { 0, KEY_Cq, LIGHTS_BUTTON_MARQUEE_UP_LEFT, false }, - { 0, KEY_Cw, LIGHTS_BUTTON_MARQUEE_UP_RIGHT, false }, - { 0, KEY_Ce, LIGHTS_BUTTON_MARQUEE_LR_LEFT, false }, - { 0, KEY_Cr, LIGHTS_BUTTON_MARQUEE_LR_RIGHT, false }, - { 0, KEY_Ct, LIGHTS_BUTTON_BUTTONS_LEFT, false }, - { 0, KEY_Cy, LIGHTS_BUTTON_BUTTONS_RIGHT, false }, - { 0, KEY_Cu, LIGHTS_BUTTON_BASS_LEFT, false }, - { 0, KEY_Ci, LIGHTS_BUTTON_BASS_RIGHT, false }, - InputMapping_END -}; +static const AutoMappings g_AutoKeyMappings_Lights = AutoMappings ( + "", + "", + "", + AutoMappingEntry( 0, KEY_Cq, LIGHTS_BUTTON_MARQUEE_UP_LEFT, false ), + AutoMappingEntry( 0, KEY_Cw, LIGHTS_BUTTON_MARQUEE_UP_RIGHT, false ), + AutoMappingEntry( 0, KEY_Ce, LIGHTS_BUTTON_MARQUEE_LR_LEFT, false ), + AutoMappingEntry( 0, KEY_Cr, LIGHTS_BUTTON_MARQUEE_LR_RIGHT, false ), + AutoMappingEntry( 0, KEY_Ct, LIGHTS_BUTTON_BUTTONS_LEFT, false ), + AutoMappingEntry( 0, KEY_Cy, LIGHTS_BUTTON_BUTTONS_RIGHT, false ), + AutoMappingEntry( 0, KEY_Cu, LIGHTS_BUTTON_BASS_LEFT, false ), + AutoMappingEntry( 0, KEY_Ci, LIGHTS_BUTTON_BASS_RIGHT, false ) +); static const Style g_Style_Lights_Cabinet = { // STYLE_LIGHTS_CABINET @@ -2409,7 +2419,7 @@ static const Game g_Game_Lights = { "BassLeft", GameButton_Invalid }, { "BassRight", GameButton_Invalid }, }, - g_AutoKeyMappings_Lights + &g_AutoKeyMappings_Lights }, { { GameButtonType_Step }, diff --git a/stepmania/src/InputMapper.cpp b/stepmania/src/InputMapper.cpp index 8bc3cd321f..8bd27fb9d8 100644 --- a/stepmania/src/InputMapper.cpp +++ b/stepmania/src/InputMapper.cpp @@ -10,6 +10,9 @@ #include "SpecialFiles.h" #include "LocalizedString.h" #include "Foreach.h" +#include "arch/Dialog/Dialog.h" + +#define AUTOMAPPINGS_DIR "/Data/AutoMappings/" static Preference g_sLastSeenInputDevices( "LastSeenInputDevices", "" ); static Preference g_bAutoMapOnJoyChange( "AutoMapOnJoyChange", true ); @@ -40,41 +43,32 @@ InputMapper::~InputMapper() void InputMapper::ClearAllMappings() { - FOREACH_ENUM( GameController, i ) - FOREACH_ENUM( GameButton, j) - for( int k=0; k aMaps; + vector aMaps; aMaps.reserve( 32 ); - for( int k=0; !g_DefaultKeyMappings[k].IsEndMarker(); k++ ) - aMaps.push_back( g_DefaultKeyMappings[k] ); - for( int k=0; !m_pInputScheme->m_Maps[k].IsEndMarker(); k++ ) - aMaps.push_back( m_pInputScheme->m_Maps[k] ); + FOREACH_CONST( AutoMappingEntry, g_DefaultKeyMappings.m_vMaps, iter ) + aMaps.push_back( *iter ); + FOREACH_CONST( AutoMappingEntry, m_pInputScheme->m_pAutoMappings->m_vMaps, iter ) + aMaps.push_back( *iter ); /* There may be duplicate GAME_BUTTON maps. Process the list backwards, * so game-specific mappings override g_DefaultKeyMappings. */ std::reverse( aMaps.begin(), aMaps.end() ); - FOREACH( InputMapping, aMaps, m ) + FOREACH( AutoMappingEntry, aMaps, m ) { - DeviceButton key = m->deviceButton; + DeviceButton key = m->m_deviceButton; DeviceInput DeviceI( DEVICE_KEYBOARD, key ); - GameInput GameI( m->SecondController? GAME_CONTROLLER_2:GAME_CONTROLLER_1, m->gb ); + GameInput GameI( m->m_bSecondController ? GAME_CONTROLLER_2 : GAME_CONTROLLER_1, m->m_gb ); if( !IsMapped(DeviceI) ) // if this key isn't already being used by another user-made mapping - SetInputMap( DeviceI, GameI, 2 ); + { + if( !GameI.IsValid() ) + ClearFromInputMap( DeviceI ); + else + SetInputMap( DeviceI, GameI, 2 ); + } } } -const AutoJoyMapping g_AutoJoyMappings[] = +static const AutoMappings g_AutoMappings[] = { - { + AutoMappings( "dance", "GIC USB Joystick", "Boom USB convertor (black/gray)", - { - { 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_12, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_12, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "4 axis 16 button joystick", "EMS USB2", - { - { 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "GamePad Pro USB ", // yes, there is a space at the end "GamePad Pro USB", - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "SideWinder Game Pad USB version 1.0", "SideWinder Game Pad USB", - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_5, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_5, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "4 axis 12 button joystick with hat switch", "Super Joy Box 5", - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_START, false }, - END_MARKER - } - }, -/* { + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ) + ), +/* AutoMappings( + "dance", "MP-8866 Dual USB Joypad", "Super Dual Box (from Lik-Sang, 2004)", //NEEDS_DANCE_PAD_MAPPING_CODE, - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false }, - { 1, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_START, false }, - END_MARKER - } - }, + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ), + ), */ - { + AutoMappings( "dance", "MP-8866 Dual USB Joypad", "Super Dual Box (from DDRGame.com, Feb 2008)", //NEEDS_DANCE_PAD_MAPPING_CODE, - { - { 0, JOY_BUTTON_3, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - //{ 0, JOY_BUTTON_5, DANCE_BUTTON_DOWNLEFT, false }, - //{ 0, JOY_BUTTON_6, DANCE_BUTTON_DOWNRIGHT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_3, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_5, DANCE_BUTTON_DOWNLEFT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_6, DANCE_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "NTPAD", "NTPAD", - { - { 0, JOY_BUTTON_13, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_16, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false }, - { 1, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "Psx Gamepad", "PSXPAD", - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_5, DANCE_BUTTON_UPRIGHT, false }, - { 1, JOY_BUTTON_8, DANCE_BUTTON_UPLEFT, false }, - { 1, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_8, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "XBOX Gamepad Plugin V0.01", "X-Box gamepad", - { - { 0, JOY_LEFT, DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_DOWN, false }, // A - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, // B - { 1, JOY_BUTTON_3, DANCE_BUTTON_LEFT, false }, // X - { 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false }, // Y - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, // L shoulder - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, // R shoulder - { 0, JOY_BUTTON_9, GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_LEFT, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_DOWN, false ), // A + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), // B + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_LEFT, false ), // X + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_UP, false ), // Y + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), // L shoulder + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), // R shoulder + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ) + ), + AutoMappings( "dance", "0b43:0003", // The EMS USB2 doesn't provide a model string, so Linux // just gives us the VendorID and ModelID in hex. "EMS USB2", - { - // Player 1. - { 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_SELECT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_5, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_6, GAME_BUTTON_COIN, false }, - // Player 2. - { 0, JOY_BUTTON_32, DANCE_BUTTON_LEFT, true }, - { 0, JOY_BUTTON_30, DANCE_BUTTON_RIGHT, true }, - { 0, JOY_BUTTON_29, DANCE_BUTTON_UP, true }, - { 0, JOY_BUTTON_31, DANCE_BUTTON_DOWN, true }, - { 1, JOY_BUTTON_20, DANCE_BUTTON_LEFT, true }, - { 1, JOY_BUTTON_18, DANCE_BUTTON_RIGHT, true }, - { 1, JOY_BUTTON_17, DANCE_BUTTON_UP, true }, - { 1, JOY_BUTTON_19, DANCE_BUTTON_DOWN, true }, - { 0, JOY_BUTTON_23, DANCE_BUTTON_UPRIGHT, true }, - { 0, JOY_BUTTON_24, DANCE_BUTTON_UPLEFT, true }, - { 0, JOY_BUTTON_25, GAME_BUTTON_SELECT, true }, - { 0, JOY_BUTTON_26, GAME_BUTTON_START, true }, - { 0, JOY_BUTTON_21, GAME_BUTTON_BACK, true }, - { 0, JOY_BUTTON_22, GAME_BUTTON_COIN, true }, - END_MARKER - } - }, - { + // Player 1. + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_SELECT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, GAME_BUTTON_COIN, false ), + // Player 2. + AutoMappingEntry( 0, JOY_BUTTON_32, DANCE_BUTTON_LEFT, true ), + AutoMappingEntry( 0, JOY_BUTTON_30, DANCE_BUTTON_RIGHT, true ), + AutoMappingEntry( 0, JOY_BUTTON_29, DANCE_BUTTON_UP, true ), + AutoMappingEntry( 0, JOY_BUTTON_31, DANCE_BUTTON_DOWN, true ), + AutoMappingEntry( 1, JOY_BUTTON_20, DANCE_BUTTON_LEFT, true ), + AutoMappingEntry( 1, JOY_BUTTON_18, DANCE_BUTTON_RIGHT, true ), + AutoMappingEntry( 1, JOY_BUTTON_17, DANCE_BUTTON_UP, true ), + AutoMappingEntry( 1, JOY_BUTTON_19, DANCE_BUTTON_DOWN, true ), + AutoMappingEntry( 0, JOY_BUTTON_23, DANCE_BUTTON_UPRIGHT, true ), + AutoMappingEntry( 0, JOY_BUTTON_24, DANCE_BUTTON_UPLEFT, true ), + AutoMappingEntry( 0, JOY_BUTTON_25, GAME_BUTTON_SELECT, true ), + AutoMappingEntry( 0, JOY_BUTTON_26, GAME_BUTTON_START, true ), + AutoMappingEntry( 0, JOY_BUTTON_21, GAME_BUTTON_BACK, true ), + AutoMappingEntry( 0, JOY_BUTTON_22, GAME_BUTTON_COIN, true ) + ), + AutoMappings( "dance", "Dance ", //Notice extra space at end "LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad - { - { 0, JOY_BUTTON_1, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_3, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_7, DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_8, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_1, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "SmartJoy PLUS Adapter", "SmartJoy PLUS Adapter", - { - { 0, JOY_LEFT, /* dpad L */ DANCE_BUTTON_LEFT, false }, - { 0, JOY_RIGHT, /* dpad R */ DANCE_BUTTON_RIGHT, false }, - { 0, JOY_UP, /* dpad U */ DANCE_BUTTON_UP, false }, - { 0, JOY_DOWN, /* dpad D */ DANCE_BUTTON_DOWN, false }, - { 1, JOY_BUTTON_4, /* Square */ DANCE_BUTTON_LEFT, false }, - { 1, JOY_BUTTON_2, /* Circle */ DANCE_BUTTON_RIGHT, false }, - { 1, JOY_BUTTON_1, /* Tri */ DANCE_BUTTON_UP, false }, - { 1, JOY_BUTTON_3, /* X */ DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_7, /* L1 */ DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_8, /* R1 */ DANCE_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_10, /* Select */ GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_5, /* R1 */ GAME_BUTTON_SELECT, false }, - { 0, JOY_BUTTON_6, /* R2 */ GAME_BUTTON_COIN, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_LEFT, /* dpad L */ DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, /* dpad R */ DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_UP, /* dpad U */ DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_DOWN, /* dpad D */ DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_4, /* Square */ DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 1, JOY_BUTTON_2, /* Circle */ DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, /* Tri */ DANCE_BUTTON_UP, false ), + AutoMappingEntry( 1, JOY_BUTTON_3, /* X */ DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, /* L1 */ DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, /* R1 */ DANCE_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, /* Select */ GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, /* R1 */ GAME_BUTTON_SELECT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, /* R2 */ GAME_BUTTON_COIN, false ) + ), + AutoMappings( "dance", "RedOctane USB Pad|XBOX DDR", // "RedOctane USB Pad" is Ignition 3s and newer Afterburners. "XBOX DDR" is older Afterburners. "RedOctane Ignition 3 or Afterburner", - { - { 0, JOY_BUTTON_1, /* dpad L */ DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, /* dpad R */ DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_3, /* dpad U */ DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, /* dpad D */ DANCE_BUTTON_DOWN, false }, - //{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false }, - //{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false }, - //{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_8, /* O */ GAME_BUTTON_START, false }, - { 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_1, /* dpad L */ DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, /* dpad R */ DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, /* dpad U */ DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, /* dpad D */ DANCE_BUTTON_DOWN, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, /* O */ GAME_BUTTON_START, false ), + AutoMappingEntry( 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false ) + ), + AutoMappings( "dance", "Joypad to USB converter", "EMS Trio Linker", - { - { 0, JOY_BUTTON_16, /* dpad L */ DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, /* dpad R */ DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_13, /* dpad U */ DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, /* dpad D */ DANCE_BUTTON_DOWN, false }, - //{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false }, - //{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false }, - //{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_2, /* O */ GAME_BUTTON_START, false }, - { 1, JOY_BUTTON_10, /* Start */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_9, /* Sel */ GAME_BUTTON_BACK, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_16, /* dpad L */ DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, /* dpad R */ DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_13, /* dpad U */ DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, /* dpad D */ DANCE_BUTTON_DOWN, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, /* O */ GAME_BUTTON_START, false ), + AutoMappingEntry( 1, JOY_BUTTON_10, /* Start */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, /* Sel */ GAME_BUTTON_BACK, false ) + ), + AutoMappings( "dance", "Positive Gaming Impact USB pad", "Positive Gaming Impact USB pad", - { - { 0, JOY_BUTTON_1, /* dpad L */ DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, /* dpad R */ DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_3, /* dpad U */ DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, /* dpad D */ DANCE_BUTTON_DOWN, false }, - //{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false }, - //{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false }, - //{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_8, /* O */ GAME_BUTTON_START, false }, - { 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_1, /* dpad L */ DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, /* dpad R */ DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, /* dpad U */ DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, /* dpad D */ DANCE_BUTTON_DOWN, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_5, /* Tri */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_6, /* Square */ GAME_BUTTON_BACK, false ), + //AutoMappingEntry{ 1, JOY_BUTTON_7, /* X */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, /* O */ GAME_BUTTON_START, false ), + AutoMappingEntry( 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false ) + ), + AutoMappings( "dance", "USB Dance Pad", "DDRGame Energy Dance Pad", - { - { 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_3, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_2, DANCE_BUTTON_UPRIGHT, false }, - //{ 0, JOY_BUTTON_1, DANCE_BUTTON_DOWNLEFT, false }, - //{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, DANCE_BUTTON_UPRIGHT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_1, DANCE_BUTTON_DOWNLEFT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "Dual USB Vibration Joystick", "PC Multi Hub Double Power Box 4", - { - { 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false }, - { 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_3, DANCE_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_2, DANCE_BUTTON_UPRIGHT, false }, - //{ 0, JOY_BUTTON_1, DANCE_BUTTON_DOWNLEFT, false }, - //{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_15, DANCE_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, DANCE_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, DANCE_BUTTON_UPRIGHT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_1, DANCE_BUTTON_DOWNLEFT, false ), + //AutoMappingEntry{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "dance", "Controller \\(Harmonix Drum Kit for Xbox 360\\)", "Rock Band drum controller (Xbox 360, Windows driver)", - { - { 0, JOY_BUTTON_3, DANCE_BUTTON_UP, false }, // blue drum - { 0, JOY_BUTTON_4, DANCE_BUTTON_DOWN, false }, // yellow drum - { 0, JOY_BUTTON_2, DANCE_BUTTON_LEFT, false }, // red drum - { 0, JOY_BUTTON_1, DANCE_BUTTON_RIGHT, false }, // green drum - { 0, JOY_HAT_LEFT, GAME_BUTTON_MENULEFT, false }, // d-pad left - { 0, JOY_HAT_RIGHT, GAME_BUTTON_MENURIGHT, false }, // d-pad right - { 0, JOY_HAT_UP, GAME_BUTTON_MENUUP, false }, // d-pad up - { 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false }, // d-pad down - { 0, JOY_BUTTON_8, GAME_BUTTON_START, false }, // start button - { 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false }, // back button - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_3, DANCE_BUTTON_UP, false ), // blue drum + AutoMappingEntry( 0, JOY_BUTTON_4, DANCE_BUTTON_DOWN, false ), // yellow drum + AutoMappingEntry( 0, JOY_BUTTON_2, DANCE_BUTTON_LEFT, false ), // red drum + AutoMappingEntry( 0, JOY_BUTTON_1, DANCE_BUTTON_RIGHT, false ), // green drum + AutoMappingEntry( 0, JOY_HAT_LEFT, GAME_BUTTON_MENULEFT, false ), // d-pad left + AutoMappingEntry( 0, JOY_HAT_RIGHT, GAME_BUTTON_MENURIGHT, false ), // d-pad right + AutoMappingEntry( 0, JOY_HAT_UP, GAME_BUTTON_MENUUP, false ), // d-pad up + AutoMappingEntry( 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false ), // d-pad down + AutoMappingEntry( 0, JOY_BUTTON_8, GAME_BUTTON_START, false ), // start button + AutoMappingEntry( 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false ) // back button + ), + AutoMappings( "pump", "Pump USB", "Pump USB pad", - { - { 0, JOY_BUTTON_1, PUMP_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_2, PUMP_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_3, PUMP_BUTTON_CENTER, false }, - { 0, JOY_BUTTON_4, PUMP_BUTTON_DOWNLEFT, false }, - { 0, JOY_BUTTON_5, PUMP_BUTTON_DOWNRIGHT, false }, - { 0, JOY_BUTTON_6, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_7, PUMP_BUTTON_UPLEFT, true }, - { 0, JOY_BUTTON_8, PUMP_BUTTON_UPRIGHT, true }, - { 0, JOY_BUTTON_9, PUMP_BUTTON_CENTER, true }, - { 0, JOY_BUTTON_10, PUMP_BUTTON_DOWNLEFT, true }, - { 0, JOY_BUTTON_11, PUMP_BUTTON_DOWNRIGHT, true }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_1, PUMP_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, PUMP_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, PUMP_BUTTON_CENTER, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, PUMP_BUTTON_DOWNLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, PUMP_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, PUMP_BUTTON_UPLEFT, true ), + AutoMappingEntry( 0, JOY_BUTTON_8, PUMP_BUTTON_UPRIGHT, true ), + AutoMappingEntry( 0, JOY_BUTTON_9, PUMP_BUTTON_CENTER, true ), + AutoMappingEntry( 0, JOY_BUTTON_10, PUMP_BUTTON_DOWNLEFT, true ), + AutoMappingEntry( 0, JOY_BUTTON_11, PUMP_BUTTON_DOWNRIGHT, true ) + ), + AutoMappings( "pump", "GamePad Pro USB ", // yes, there is a space at the end "GamePad Pro USB", - { - { 0, JOY_BUTTON_5, PUMP_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_6, PUMP_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_7, PUMP_BUTTON_DOWNLEFT, false }, - { 0, JOY_BUTTON_8, PUMP_BUTTON_DOWNRIGHT, false }, - { 0, JOY_LEFT, GAME_BUTTON_MENULEFT, false }, - { 0, JOY_RIGHT, GAME_BUTTON_MENURIGHT, false }, - { 0, JOY_UP, GAME_BUTTON_MENUUP, false }, - { 0, JOY_DOWN, GAME_BUTTON_MENUDOWN, false }, - { 1, JOY_BUTTON_1, PUMP_BUTTON_CENTER, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_5, PUMP_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_6, PUMP_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, PUMP_BUTTON_DOWNLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, PUMP_BUTTON_DOWNRIGHT, false ), + AutoMappingEntry( 0, JOY_LEFT, GAME_BUTTON_MENULEFT, false ), + AutoMappingEntry( 0, JOY_RIGHT, GAME_BUTTON_MENURIGHT, false ), + AutoMappingEntry( 0, JOY_UP, GAME_BUTTON_MENUUP, false ), + AutoMappingEntry( 0, JOY_DOWN, GAME_BUTTON_MENUDOWN, false ), + AutoMappingEntry( 1, JOY_BUTTON_1, PUMP_BUTTON_CENTER, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), + AutoMappings( "pump", "Controller \\(Harmonix Drum Kit for Xbox 360\\)", "Rock Band drum controller (Xbox 360, Windows driver)", - { - { 0, JOY_BUTTON_5, PUMP_BUTTON_CENTER, false }, // bass pedal - { 0, JOY_BUTTON_3, PUMP_BUTTON_UPRIGHT, false }, // blue drum - { 0, JOY_BUTTON_4, PUMP_BUTTON_UPLEFT, false }, // yellow drum - { 0, JOY_BUTTON_2, PUMP_BUTTON_DOWNLEFT, false }, // red drum - { 0, JOY_BUTTON_1, PUMP_BUTTON_DOWNRIGHT, false }, // green drum - { 0, JOY_HAT_LEFT, GAME_BUTTON_MENULEFT, false }, // d-pad left - { 0, JOY_HAT_RIGHT, GAME_BUTTON_MENURIGHT, false }, // d-pad right - { 0, JOY_HAT_UP, GAME_BUTTON_MENUUP, false }, // d-pad up - { 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false }, // d-pad down - { 0, JOY_BUTTON_8, GAME_BUTTON_START, false }, // start button - { 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false }, // back button - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_5, PUMP_BUTTON_CENTER, false ), // bass pedal + AutoMappingEntry( 0, JOY_BUTTON_3, PUMP_BUTTON_UPRIGHT, false ), // blue drum + AutoMappingEntry( 0, JOY_BUTTON_4, PUMP_BUTTON_UPLEFT, false ), // yellow drum + AutoMappingEntry( 0, JOY_BUTTON_2, PUMP_BUTTON_DOWNLEFT, false ), // red drum + AutoMappingEntry( 0, JOY_BUTTON_1, PUMP_BUTTON_DOWNRIGHT, false ), // green drum + AutoMappingEntry( 0, JOY_HAT_LEFT, GAME_BUTTON_MENULEFT, false ), // d-pad left + AutoMappingEntry( 0, JOY_HAT_RIGHT, GAME_BUTTON_MENURIGHT, false ), // d-pad right + AutoMappingEntry( 0, JOY_HAT_UP, GAME_BUTTON_MENUUP, false ), // d-pad up + AutoMappingEntry( 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false ), // d-pad down + AutoMappingEntry( 0, JOY_BUTTON_8, GAME_BUTTON_START, false ), // start button + AutoMappingEntry( 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false ) // back button + ), + AutoMappings( "para", "ParaParaParadise Controller", "ParaParaParadise Controller", - { - { 0, JOY_BUTTON_5, PARA_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, PARA_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_3, PARA_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, PARA_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_1, PARA_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - { 0, JOY_BUTTON_11, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_12, GAME_BUTTON_MENULEFT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_MENURIGHT, false }, - END_MARKER - } - }, - { + AutoMappingEntry( 0, JOY_BUTTON_5, PARA_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, PARA_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, PARA_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, PARA_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_1, PARA_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ), + AutoMappingEntry( 0, JOY_BUTTON_11, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_12, GAME_BUTTON_MENULEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_MENURIGHT, false ) + ), + AutoMappings( "techno", "Dance ", //Notice the extra space at end "LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad - { - { 0, JOY_BUTTON_1, TECHNO_BUTTON_UP, false }, - { 0, JOY_BUTTON_2, TECHNO_BUTTON_DOWN, false }, - { 0, JOY_BUTTON_3, TECHNO_BUTTON_LEFT, false }, - { 0, JOY_BUTTON_4, TECHNO_BUTTON_RIGHT, false }, - { 0, JOY_BUTTON_5, TECHNO_BUTTON_DOWNRIGHT,false }, - { 0, JOY_BUTTON_6, TECHNO_BUTTON_DOWNLEFT, false }, - { 0, JOY_BUTTON_7, TECHNO_BUTTON_UPRIGHT, false }, - { 0, JOY_BUTTON_8, TECHNO_BUTTON_UPLEFT, false }, - { 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false }, - { 0, JOY_BUTTON_10, GAME_BUTTON_START, false }, - END_MARKER - } - }, + AutoMappingEntry( 0, JOY_BUTTON_1, TECHNO_BUTTON_UP, false ), + AutoMappingEntry( 0, JOY_BUTTON_2, TECHNO_BUTTON_DOWN, false ), + AutoMappingEntry( 0, JOY_BUTTON_3, TECHNO_BUTTON_LEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_4, TECHNO_BUTTON_RIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_5, TECHNO_BUTTON_DOWNRIGHT,false ), + AutoMappingEntry( 0, JOY_BUTTON_6, TECHNO_BUTTON_DOWNLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_7, TECHNO_BUTTON_UPRIGHT, false ), + AutoMappingEntry( 0, JOY_BUTTON_8, TECHNO_BUTTON_UPLEFT, false ), + AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ), + AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ) + ), }; void InputMapper::Unmap( InputDevice id ) { - FOREACH_ENUM( GameController, i ) - { - FOREACH_ENUM( GameButton, j) - { - for( int k=0; k &vMmaps, GameController gc, InputDevice id ) { map MappedButtons; - - for( int k=0; !maps[k].IsEndMarker(); k++ ) + FOREACH_CONST( AutoMappingEntry, vMmaps, iter ) { GameController map_gc = gc; - if( maps[k].SecondController ) + if( iter->m_bSecondController ) { map_gc = (GameController)(map_gc+1); @@ -629,8 +545,8 @@ void InputMapper::ApplyMapping( const InputMapping *maps, GameController gc, Inp continue; } - DeviceInput di( id, maps[k].deviceButton ); - GameInput gi( map_gc, maps[k].gb ); + DeviceInput di( id, iter->m_deviceButton ); + GameInput gi( map_gc, iter->m_gb ); int iSlot = MappedButtons[gi]; ++MappedButtons[gi]; SetInputMap( di, gi, iSlot );//maps[k].iSlotIndex ); @@ -642,21 +558,62 @@ void InputMapper::AutoMapJoysticksForCurrentGame() vector vDevices; INPUTMAN->GetDevicesAndDescriptions(vDevices); - int iNumJoysticksMapped = 0; - - for( unsigned i=0; i vAutoMappings; { - InputDevice id = vDevices[i].id; - const RString &sDescription = vDevices[i].sDesc; - for( unsigned j=0; j vs; + GetDirListing( AUTOMAPPINGS_DIR "*.ini", vs, false, true ); + FOREACH_CONST( RString, vs, sFilePath ) { - const AutoJoyMapping& mapping = g_AutoJoyMappings[j]; + InputMappings km; + km.ReadMappings( m_pInputScheme, *sFilePath, true ); - if( RString(m_pInputScheme->m_szName).CompareNoCase(mapping.szGame) ) - continue; // games don't match + AutoMappings mapping( m_pInputScheme->m_szName, km.m_sDeviceRegex, km.m_sDescription ); - RString sDriverRegex = mapping.szDriverRegex; - Regex regex( sDriverRegex ); + FOREACH_ENUM( GameController, c ) + { + FOREACH_ENUM( GameButton, b ) + { + for( int s=0; s GAME_CONTROLLER_1 ); + mapping.m_vMaps.push_back( im ); + } + } + } + + vAutoMappings.push_back( mapping ); + } + + // hard-coded automaps + for( unsigned j=0; jm_szName) ) + vAutoMappings.push_back( mapping ); + } + } + + + + // + // apply auto mappings + // + int iNumJoysticksMapped = 0; + FOREACH_CONST( InputDeviceInfo, vDevices, device ) + { + InputDevice id = device->id; + const RString &sDescription = device->sDesc; + FOREACH_CONST( AutoMappings, vAutoMappings, mapping ) + { + Regex regex( mapping->m_sDriverRegex ); if( !regex.Compare(sDescription) ) continue; // driver names don't match @@ -668,10 +625,10 @@ void InputMapper::AutoMapJoysticksForCurrentGame() break; // stop mapping. We already mapped one device for each game controller. LOG->Info( "Applying default joystick mapping #%d for device '%s' (%s)", - iNumJoysticksMapped+1, mapping.szDriverRegex, mapping.szControllerName ); + iNumJoysticksMapped+1, mapping->m_sDriverRegex.c_str(), mapping->m_sControllerName.c_str() ); Unmap( id ); - ApplyMapping( mapping.maps, gc, id ); + ApplyMapping( mapping->m_vMaps, gc, id ); iNumJoysticksMapped++; } @@ -694,77 +651,14 @@ static const RString DEVICE_INPUT_SEPARATOR = ":"; // this isn't used in any key void InputMapper::ReadMappingsFromDisk() { - ClearAllMappings(); - - IniFile ini; - if( !ini.ReadFile( SpecialFiles::KEYMAPS_PATH ) ) - LOG->Trace( "Couldn't open mapping file \"%s\": %s.", - SpecialFiles::KEYMAPS_PATH.c_str(), ini.GetError().c_str() ); - - const XNode *Key = ini.GetChild( m_pInputScheme->m_szName ); - - if( Key ) - { - FOREACH_CONST_Attr( Key, i ) - { - const RString &name = i->first; - RString value; - i->second->GetValue( value ); - - GameInput GameI; - GameI.FromString( m_pInputScheme, name ); - - vector sDeviceInputStrings; - split( value, DEVICE_INPUT_SEPARATOR, sDeviceInputStrings, false ); - - for( unsigned i=0; im_szName ); - - XNode *pKey = ini.GetChild( m_pInputScheme->m_szName ); - if( pKey != NULL ) - ini.RemoveChild( pKey ); - pKey = ini.AppendChild( m_pInputScheme->m_szName ); - - // iterate over our input map and write all mappings to the ini file - FOREACH_ENUM( GameController, i ) - { - FOREACH_GameButtonInScheme( m_pInputScheme, j ) - { - GameInput GameI( i, j ); - RString sNameString = GameI.ToString( m_pInputScheme ); - - vector asValues; - for( int slot = 0; slot < NUM_USER_GAME_TO_DEVICE_SLOTS; ++slot ) // don't save data from the last (keyboard automap) slot - asValues.push_back( m_GItoDI[i][j][slot].ToString() ); - - while( asValues.size() && asValues.back() == "" ) - asValues.erase( asValues.begin()+asValues.size()-1 ); - - RString sValueString = join( DEVICE_INPUT_SEPARATOR, asValues ); - - pKey->AppendAttr( sNameString, sValueString ); - } - } - - ini.WriteFile( SpecialFiles::KEYMAPS_PATH ); + m_mappings.WriteMappings( m_pInputScheme, SpecialFiles::KEYMAPS_PATH ); } static LocalizedString CONNECTED ( "InputMapper", "Connected" ); @@ -831,51 +725,23 @@ bool InputMapper::CheckForChangedInputDevicesAndRemap( RString &sMessageOut ) void InputMapper::SetInputMap( const DeviceInput &DeviceI, const GameInput &GameI, int iSlotIndex ) { - // remove the old input - ClearFromInputMap( DeviceI ); - ClearFromInputMap( GameI, iSlotIndex ); - - ASSERT_M( GameI.controller < NUM_GameController, - ssprintf("controller: %u >= %u", GameI.controller, NUM_GameController) ); - ASSERT_M( GameI.button < NUM_GameButton, - ssprintf("button: %u >= %u", GameI.button, NUM_GameButton) ); - ASSERT_M( iSlotIndex < NUM_GAME_TO_DEVICE_SLOTS, - ssprintf("slot: %u >= %u", iSlotIndex, NUM_GAME_TO_DEVICE_SLOTS) ); - m_GItoDI[GameI.controller][GameI.button][iSlotIndex] = DeviceI; - + m_mappings.SetInputMap( DeviceI, GameI, iSlotIndex ); UpdateTempDItoGI(); } void InputMapper::ClearFromInputMap( const DeviceInput &DeviceI ) { - // search for where this DeviceI maps to - - FOREACH_ENUM( GameController, p ) - { - FOREACH_ENUM( GameButton, b) - { - for( int s=0; sm_szName; } +void InputMappings::Clear() +{ + FOREACH_ENUM( GameController, i ) + FOREACH_ENUM( GameButton, j) + for( int k=0; kTrace( "Couldn't open mapping file \"%s\": %s.", + SpecialFiles::KEYMAPS_PATH.c_str(), ini.GetError().c_str() ); + + if( bIsAutoMapping ) + { + if( !ini.GetValue( "AutoMapping", "DeviceRegex", m_sDeviceRegex ) ) + Dialog::OK( "Missing AutoMapping::DeviceRegex in '%s'", sFilePath.c_str() ); + + if( !ini.GetValue( "AutoMapping", "Description", m_sDescription ) ) + Dialog::OK( "Missing AutoMapping::Description in '%s'", sFilePath.c_str() ); + } + + const XNode *Key = ini.GetChild( pInputScheme->m_szName ); + + if( Key ) + { + FOREACH_CONST_Attr( Key, i ) + { + const RString &name = i->first; + RString value; + i->second->GetValue( value ); + + GameInput GameI; + GameI.FromString( pInputScheme, name ); + + vector sDeviceInputStrings; + split( value, DEVICE_INPUT_SEPARATOR, sDeviceInputStrings, false ); + + for( unsigned i=0; im_szName ); + + XNode *pKey = ini.GetChild( pInputScheme->m_szName ); + if( pKey != NULL ) + ini.RemoveChild( pKey ); + pKey = ini.AppendChild( pInputScheme->m_szName ); + + // iterate over our input map and write all mappings to the ini file + FOREACH_ENUM( GameController, i ) + { + FOREACH_GameButtonInScheme( pInputScheme, j ) + { + GameInput GameI( i, j ); + RString sNameString = GameI.ToString( pInputScheme ); + + vector asValues; + for( int slot = 0; slot < NUM_USER_GAME_TO_DEVICE_SLOTS; ++slot ) // don't save data from the last (keyboard automap) slot + asValues.push_back( m_GItoDI[i][j][slot].ToString() ); + + while( asValues.size() && asValues.back() == "" ) + asValues.erase( asValues.begin()+asValues.size()-1 ); + + RString sValueString = join( DEVICE_INPUT_SEPARATOR, asValues ); + + pKey->AppendAttr( sNameString, sValueString ); + } + } + + ini.WriteFile( sFilePath ); +} + +void InputMappings::SetInputMap( const DeviceInput &DeviceI, const GameInput &GameI, int iSlotIndex ) +{ + // remove the old input + ClearFromInputMap( DeviceI ); + ClearFromInputMap( GameI, iSlotIndex ); + + ASSERT_M( GameI.controller < NUM_GameController, + ssprintf("controller: %u >= %u", GameI.controller, NUM_GameController) ); + ASSERT_M( GameI.button < NUM_GameButton, + ssprintf("button: %u >= %u", GameI.button, NUM_GameButton) ); + ASSERT_M( iSlotIndex < NUM_GAME_TO_DEVICE_SLOTS, + ssprintf("slot: %u >= %u", iSlotIndex, NUM_GAME_TO_DEVICE_SLOTS) ); + m_GItoDI[GameI.controller][GameI.button][iSlotIndex] = DeviceI; +} + +void InputMappings::ClearFromInputMap( const DeviceInput &DeviceI ) +{ + // search for where this DeviceI maps to + + FOREACH_ENUM( GameController, p ) + { + FOREACH_ENUM( GameButton, b) + { + for( int s=0; s m_vMaps; }; class InputScheme @@ -43,7 +120,7 @@ public: }; /* Data for each Game-specific GameButton. This starts at GAME_BUTTON_NEXT. */ GameButtonInfo m_GameButtonInfo[NUM_GameButton]; - const InputMapping *m_Maps; + const AutoMappings *m_pAutoMappings; GameButton ButtonNameToIndex( const RString &sButtonName ) const; GameButton GameButtonToMenuButton( GameButton gb ) const; @@ -54,6 +131,26 @@ public: }; #define FOREACH_GameButtonInScheme( s, var ) for( GameButton var=(GameButton)0; varm_iButtonsPerController; enum_add( var, +1 ) ) +class InputMappings +{ +public: + // only filled for automappings + RString m_sDeviceRegex; + RString m_sDescription; + + // map from a GameInput to multiple DeviceInputs + DeviceInput m_GItoDI[NUM_GameController][NUM_GameButton][NUM_GAME_TO_DEVICE_SLOTS]; + + void Clear(); + void Unmap( InputDevice id ); + void WriteMappings( const InputScheme *pInputScheme, RString sFilePath ); + void ReadMappings( const InputScheme *pInputScheme, RString sFilePath, bool bIsAutoMapping ); + void SetInputMap( const DeviceInput &DeviceI, const GameInput &GameI, int iSlotIndex ); + + void ClearFromInputMap( const DeviceInput &DeviceI ); + bool ClearFromInputMap( const GameInput &GameI, int iSlotIndex ); +}; + class InputMapper { public: @@ -105,11 +202,10 @@ public: static MultiPlayer InputDeviceToMultiPlayer( InputDevice id ); void Unmap( InputDevice device ); - void ApplyMapping( const InputMapping *maps, GameController gc, InputDevice device ); + void ApplyMapping( const vector &vMmaps, GameController gc, InputDevice id ); protected: - // all the DeviceInputs that map to a GameInput - DeviceInput m_GItoDI[NUM_GameController][NUM_GameButton][NUM_GAME_TO_DEVICE_SLOTS]; + InputMappings m_mappings; void UpdateTempDItoGI(); const InputScheme *m_pInputScheme;