2003-02-16 04:01:45 +00:00
|
|
|
#include "global.h"
|
2002-04-16 17:31:00 +00:00
|
|
|
#include "InputMapper.h"
|
|
|
|
|
#include "IniFile.h"
|
2006-09-30 22:29:03 +00:00
|
|
|
#include "MessageManager.h"
|
2002-07-31 19:40:40 +00:00
|
|
|
#include "RageLog.h"
|
2002-09-08 06:11:59 +00:00
|
|
|
#include "InputFilter.h"
|
2002-11-29 20:37:12 +00:00
|
|
|
#include "RageUtil.h"
|
2003-05-28 02:35:05 +00:00
|
|
|
#include "PrefsManager.h"
|
|
|
|
|
#include "RageInput.h"
|
2005-12-12 09:59:37 +00:00
|
|
|
#include "SpecialFiles.h"
|
2005-12-22 03:10:04 +00:00
|
|
|
#include "LocalizedString.h"
|
2007-01-12 08:00:31 +00:00
|
|
|
#include "Foreach.h"
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
static Preference<RString> g_sLastSeenInputDevices( "LastSeenInputDevices", "" );
|
2005-12-19 00:18:33 +00:00
|
|
|
static Preference<bool> g_bAutoMapOnJoyChange( "AutoMapOnJoyChange", true );
|
|
|
|
|
|
2005-12-28 20:50:12 +00:00
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
// lookup for efficiency from a DeviceInput to a GameInput
|
|
|
|
|
// This is repopulated every time m_PItoDI changes by calling UpdateTempDItoPI().
|
|
|
|
|
map<DeviceInput, GameInput> g_tempDItoGI;
|
2006-09-30 22:29:03 +00:00
|
|
|
|
|
|
|
|
PlayerNumber g_JoinControllers;
|
2005-12-28 20:50:12 +00:00
|
|
|
};
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
InputMapper* INPUTMAPPER = NULL; // global and accessable from anywhere in our program
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2007-01-11 06:31:48 +00:00
|
|
|
static GameButton g_DedicatedMenuButtons[NUM_MenuButton] =
|
|
|
|
|
{
|
|
|
|
|
GAME_BUTTON_MENULEFT, // MENU_BUTTON_LEFT
|
|
|
|
|
GAME_BUTTON_MENURIGHT, // MENU_BUTTON_RIGHT
|
|
|
|
|
GAME_BUTTON_MENUUP, // MENU_BUTTON_UP
|
|
|
|
|
GAME_BUTTON_MENUDOWN, // MENU_BUTTON_DOWN
|
|
|
|
|
GAME_BUTTON_START, // MENU_BUTTON_START
|
|
|
|
|
GAME_BUTTON_SELECT, // MENU_BUTTON_SELECT
|
|
|
|
|
GAME_BUTTON_BACK, // MENU_BUTTON_BACK
|
|
|
|
|
GAME_BUTTON_COIN, // MENU_BUTTON_COIN
|
|
|
|
|
GAME_BUTTON_OPERATOR // MENU_BUTTON_OPERATOR
|
|
|
|
|
};
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
InputMapper::InputMapper()
|
|
|
|
|
{
|
2006-09-30 22:29:03 +00:00
|
|
|
g_JoinControllers = PLAYER_INVALID;
|
2006-09-30 09:27:34 +00:00
|
|
|
m_pInputScheme = NULL;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InputMapper::~InputMapper()
|
|
|
|
|
{
|
|
|
|
|
SaveMappingsToDisk();
|
2005-12-28 20:50:12 +00:00
|
|
|
g_tempDItoGI.clear();
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2002-07-31 19:40:40 +00:00
|
|
|
void InputMapper::ClearAllMappings()
|
|
|
|
|
{
|
2006-09-26 20:52:11 +00:00
|
|
|
FOREACH_GameController( i )
|
2006-09-27 04:29:12 +00:00
|
|
|
FOREACH_GameButton(j)
|
2002-07-31 19:40:40 +00:00
|
|
|
for( int k=0; k<NUM_GAME_TO_DEVICE_SLOTS; k++ )
|
|
|
|
|
m_GItoDI[i][j][k].MakeInvalid();
|
2006-10-09 02:12:55 +00:00
|
|
|
UpdateTempDItoGI();
|
2002-07-31 19:40:40 +00:00
|
|
|
}
|
|
|
|
|
|
2007-01-12 08:00:31 +00:00
|
|
|
struct AutoJoyMapping
|
|
|
|
|
{
|
|
|
|
|
const char *szGame;
|
|
|
|
|
const char *szDriverRegex; // reported by InputHandler
|
|
|
|
|
const char *szControllerName; // the product name of the controller
|
|
|
|
|
InputMapper::Mapping maps[32];
|
|
|
|
|
};
|
|
|
|
|
#define END_MARKER {-1, DeviceButton_Invalid, GameButton_Invalid, false }, // end marker
|
|
|
|
|
const InputMapping g_DefaultKeyMappings[] =
|
|
|
|
|
{
|
|
|
|
|
{ 0, KEY_LEFT, GAME_BUTTON_MENULEFT, false },
|
|
|
|
|
{ 0, KEY_RIGHT, GAME_BUTTON_MENURIGHT, false },
|
|
|
|
|
{ 0, KEY_UP, GAME_BUTTON_MENUUP, false },
|
|
|
|
|
{ 0, KEY_DOWN, GAME_BUTTON_MENUDOWN, false },
|
|
|
|
|
{ 0, KEY_ENTER, GAME_BUTTON_START, false },
|
|
|
|
|
{ 0, KEY_BACKSLASH, GAME_BUTTON_SELECT, false },
|
|
|
|
|
{ 0, KEY_ESC, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, KEY_KP_C4, GAME_BUTTON_MENULEFT, true },
|
|
|
|
|
{ 0, KEY_KP_C6, GAME_BUTTON_MENURIGHT, true },
|
|
|
|
|
{ 0, KEY_KP_C8, GAME_BUTTON_MENUUP, true },
|
|
|
|
|
{ 0, KEY_KP_C2, GAME_BUTTON_MENUDOWN, true },
|
|
|
|
|
{ 0, KEY_KP_ENTER, GAME_BUTTON_START, true },
|
|
|
|
|
{ 0, KEY_KP_C0, GAME_BUTTON_SELECT, true },
|
|
|
|
|
{ 0, KEY_NUMLOCK, GAME_BUTTON_BACK, true },
|
|
|
|
|
{ 0, KEY_F1, GAME_BUTTON_COIN, false },
|
|
|
|
|
{ 0, KEY_SCRLLOCK, GAME_BUTTON_OPERATOR, false },
|
|
|
|
|
END_MARKER
|
|
|
|
|
};
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
void InputMapper::AddDefaultMappingsForCurrentGameIfUnmapped()
|
2002-07-31 19:40:40 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
// Clear default mappings. Default mappings are in the third slot.
|
2006-09-26 20:52:11 +00:00
|
|
|
FOREACH_GameController( i )
|
2006-09-27 04:29:12 +00:00
|
|
|
FOREACH_GameButton(j)
|
2006-09-30 05:49:54 +00:00
|
|
|
ClearFromInputMap( GameInput(i, j), 2 );
|
2002-07-31 19:40:40 +00:00
|
|
|
|
2007-01-12 08:00:31 +00:00
|
|
|
vector<InputMapping> 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] );
|
|
|
|
|
|
|
|
|
|
/* 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 )
|
2002-07-31 19:40:40 +00:00
|
|
|
{
|
2007-01-12 08:00:31 +00:00
|
|
|
DeviceButton key = m->deviceButton;
|
|
|
|
|
DeviceInput DeviceI( DEVICE_KEYBOARD, key );
|
|
|
|
|
GameInput GameI( m->SecondController? GAME_CONTROLLER_2:GAME_CONTROLLER_1, m->gb );
|
|
|
|
|
if( !IsMapped(DeviceI) ) // if this key isn't already being used by another user-made mapping
|
|
|
|
|
SetInputMap( DeviceI, GameI, 2 );
|
2002-07-31 19:40:40 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2003-05-28 02:35:05 +00:00
|
|
|
const AutoJoyMapping g_AutoJoyMappings[] =
|
|
|
|
|
{
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-05-28 02:35:05 +00:00
|
|
|
"GIC USB Joystick",
|
2003-08-02 19:28:55 +00:00
|
|
|
"Boom USB convertor (black/gray)",
|
2003-05-28 02:35:05 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2006-02-09 00:50:00 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_12, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-05-28 02:35:05 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-08-02 19:28:55 +00:00
|
|
|
"4 axis 16 button joystick",
|
2006-02-09 00:04:01 +00:00
|
|
|
"EMS USB2",
|
2003-05-28 02:35:05 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2006-02-09 00:10:39 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-05-28 02:35:05 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-05-28 02:35:05 +00:00
|
|
|
"GamePad Pro USB ", // yes, there is a space at the end
|
2003-08-02 19:28:55 +00:00
|
|
|
"GamePad Pro USB",
|
2003-05-28 02:35:05 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-10-03 03:19:51 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-10-03 03:19:51 +00:00
|
|
|
"SideWinder Game Pad USB version 1.0",
|
|
|
|
|
"SideWinder Game Pad USB",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-08-02 19:28:55 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-08-02 19:28:55 +00:00
|
|
|
"4 axis 12 button joystick with hat switch",
|
|
|
|
|
"Super Joy Box 5",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2006-02-09 00:50:00 +00:00
|
|
|
{ 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false },
|
|
|
|
|
{ 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-08-02 19:53:36 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-08-02 19:53:36 +00:00
|
|
|
"MP-8866 Dual USB Joypad",
|
|
|
|
|
"Super Dual Box",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-07-22 07:47:27 +00:00
|
|
|
}
|
|
|
|
|
},
|
2003-10-12 17:44:33 +00:00
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-10-12 17:44:33 +00:00
|
|
|
"NTPAD",
|
|
|
|
|
"NTPAD",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-10-12 17:44:33 +00:00
|
|
|
}
|
|
|
|
|
},
|
2003-10-12 18:27:24 +00:00
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-10-12 18:27:24 +00:00
|
|
|
"Psx Gamepad",
|
|
|
|
|
"PSXPAD",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_START, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-10-12 18:27:24 +00:00
|
|
|
}
|
|
|
|
|
},
|
2003-07-22 07:47:27 +00:00
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-07-22 07:47:27 +00:00
|
|
|
"XBOX Gamepad Plugin V0.01",
|
2003-08-02 19:28:55 +00:00
|
|
|
"X-Box gamepad",
|
2003-07-22 07:47:27 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_START, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-05-28 02:35:05 +00:00
|
|
|
}
|
|
|
|
|
},
|
2003-09-19 02:05:26 +00:00
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"dance",
|
2003-09-19 02:05:26 +00:00
|
|
|
"0b43:0003", // The EMS USB2 doesn't provide a model string, so Linux
|
2006-01-27 09:51:51 +00:00
|
|
|
// just gives us the VendorID and ModelID in hex.
|
2003-10-03 03:19:51 +00:00
|
|
|
"EMS USB2",
|
2003-09-19 02:05:26 +00:00
|
|
|
{
|
|
|
|
|
// Player 1.
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 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 },
|
2003-09-19 02:05:26 +00:00
|
|
|
// Player 2.
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2005-09-12 08:48:16 +00:00
|
|
|
{ 0, JOY_BUTTON_23, DANCE_BUTTON_UPRIGHT, true },
|
|
|
|
|
{ 0, JOY_BUTTON_24, DANCE_BUTTON_UPLEFT, true },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 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 },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-09-11 02:42:29 +00:00
|
|
|
}
|
|
|
|
|
},
|
2004-10-09 07:03:15 +00:00
|
|
|
{
|
|
|
|
|
"dance",
|
|
|
|
|
"Dance ", //Notice extra space at end
|
2005-10-08 16:36:14 +00:00
|
|
|
"LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad
|
2004-10-09 07:03:15 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-10-09 07:03:15 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2005-10-07 20:21:14 +00:00
|
|
|
{
|
|
|
|
|
"dance",
|
|
|
|
|
"SmartJoy PLUS Adapter",
|
|
|
|
|
"SmartJoy PLUS Adapter",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 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 },
|
2005-10-07 20:21:14 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2006-01-26 05:50:43 +00:00
|
|
|
{
|
|
|
|
|
"dance",
|
2006-03-29 17:58:35 +00:00
|
|
|
"RedOctane USB Pad|XBOX DDR", // "RedOctane USB Pad" is Ignition 3s and newer Afterburners. "XBOX DDR" is older Afterburners.
|
2006-03-28 22:32:54 +00:00
|
|
|
"RedOctane Ignition 3 or Afterburner",
|
2006-01-26 05:50:43 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
//{ 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 },
|
2006-01-26 05:50:43 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2006-05-17 17:41:00 +00:00
|
|
|
{
|
|
|
|
|
"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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
//{ 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 },
|
2006-07-06 01:10:49 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
//{ 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 },
|
2006-05-17 17:41:00 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2003-05-28 04:22:52 +00:00
|
|
|
{
|
2004-07-25 04:27:20 +00:00
|
|
|
"pump",
|
2003-05-28 04:22:52 +00:00
|
|
|
"Pump USB",
|
2003-08-02 19:28:55 +00:00
|
|
|
"Pump USB pad",
|
2003-05-28 04:22:52 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_1, PUMP_BUTTON_UPLEFT, false },
|
2005-12-28 08:52:20 +00:00
|
|
|
{ 0, JOY_BUTTON_2, PUMP_BUTTON_UPRIGHT, false },
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_3, PUMP_BUTTON_CENTER, false },
|
2005-12-28 08:52:20 +00:00
|
|
|
{ 0, JOY_BUTTON_4, PUMP_BUTTON_DOWNLEFT, false },
|
|
|
|
|
{ 0, JOY_BUTTON_5, PUMP_BUTTON_DOWNRIGHT, false },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_6, GAME_BUTTON_BACK, false },
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_7, PUMP_BUTTON_UPLEFT, true },
|
2005-12-28 08:52:20 +00:00
|
|
|
{ 0, JOY_BUTTON_8, PUMP_BUTTON_UPRIGHT, true },
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_9, PUMP_BUTTON_CENTER, true },
|
2005-12-28 08:52:20 +00:00
|
|
|
{ 0, JOY_BUTTON_10, PUMP_BUTTON_DOWNLEFT, true },
|
|
|
|
|
{ 0, JOY_BUTTON_11, PUMP_BUTTON_DOWNRIGHT, true },
|
2004-04-20 08:27:40 +00:00
|
|
|
END_MARKER
|
2003-05-28 04:22:52 +00:00
|
|
|
}
|
|
|
|
|
},
|
2005-12-08 05:09:24 +00:00
|
|
|
{
|
|
|
|
|
"para",
|
|
|
|
|
"ParaParaParadise Controller",
|
|
|
|
|
"ParaParaParadise Controller",
|
|
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_5, PARA_BUTTON_LEFT, false },
|
|
|
|
|
{ 0, JOY_BUTTON_4, PARA_BUTTON_UPLEFT, false },
|
|
|
|
|
{ 0, JOY_BUTTON_3, PARA_BUTTON_UP, false },
|
2005-12-08 05:09:24 +00:00
|
|
|
{ 0, JOY_BUTTON_2, PARA_BUTTON_UPRIGHT, false },
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 0, JOY_BUTTON_1, PARA_BUTTON_RIGHT, false },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 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 },
|
2005-12-08 05:09:24 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2004-10-09 07:03:15 +00:00
|
|
|
{
|
|
|
|
|
"techno",
|
|
|
|
|
"Dance ", //Notice the extra space at end
|
2005-10-08 16:36:14 +00:00
|
|
|
"LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad
|
2004-10-09 07:03:15 +00:00
|
|
|
{
|
2006-01-27 09:51:51 +00:00
|
|
|
{ 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 },
|
2007-01-11 06:10:18 +00:00
|
|
|
{ 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false },
|
|
|
|
|
{ 0, JOY_BUTTON_10, GAME_BUTTON_START, false },
|
2004-10-09 07:03:15 +00:00
|
|
|
END_MARKER
|
|
|
|
|
}
|
|
|
|
|
},
|
2003-05-28 02:35:05 +00:00
|
|
|
};
|
|
|
|
|
|
2006-02-09 00:04:01 +00:00
|
|
|
void InputMapper::Unmap( InputDevice id )
|
|
|
|
|
{
|
2006-09-26 20:52:11 +00:00
|
|
|
FOREACH_GameController( i )
|
2006-02-09 00:04:01 +00:00
|
|
|
{
|
2006-09-27 04:29:12 +00:00
|
|
|
FOREACH_GameButton(j)
|
2006-02-09 00:04:01 +00:00
|
|
|
{
|
|
|
|
|
for( int k=0; k<NUM_USER_GAME_TO_DEVICE_SLOTS; k++ )
|
|
|
|
|
{
|
|
|
|
|
DeviceInput &di = m_GItoDI[i][j][k];
|
|
|
|
|
if( di.device == id )
|
|
|
|
|
di.MakeInvalid();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateTempDItoGI();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InputMapper::ApplyMapping( const Mapping *maps, GameController gc, InputDevice id )
|
2004-08-13 00:27:52 +00:00
|
|
|
{
|
2007-01-12 01:42:35 +00:00
|
|
|
map<GameInput, int> MappedButtons;
|
|
|
|
|
|
2004-08-13 00:27:52 +00:00
|
|
|
for( int k=0; !maps[k].IsEndMarker(); k++ )
|
|
|
|
|
{
|
|
|
|
|
GameController map_gc = gc;
|
|
|
|
|
if( maps[k].SecondController )
|
|
|
|
|
{
|
|
|
|
|
map_gc = (GameController)(map_gc+1);
|
|
|
|
|
|
|
|
|
|
/* If that pushed it over, then it's a second controller for a joystick
|
|
|
|
|
* that's already a second controller, so we'll just ignore it. (This
|
|
|
|
|
* can happen if eg. two primary Pump pads are connected.) */
|
2006-09-26 20:57:31 +00:00
|
|
|
if( map_gc >= NUM_GameController )
|
2004-08-13 00:27:52 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-09 00:04:01 +00:00
|
|
|
DeviceInput di( id, maps[k].deviceButton );
|
2004-08-13 00:27:52 +00:00
|
|
|
GameInput gi( map_gc, maps[k].gb );
|
2007-01-12 01:42:35 +00:00
|
|
|
int iSlot = MappedButtons[gi];
|
|
|
|
|
++MappedButtons[gi];
|
|
|
|
|
SetInputMap( di, gi, iSlot );//maps[k].iSlotIndex );
|
2004-08-13 00:27:52 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-05-28 02:35:05 +00:00
|
|
|
void InputMapper::AutoMapJoysticksForCurrentGame()
|
|
|
|
|
{
|
2006-02-27 17:51:27 +00:00
|
|
|
vector<InputDeviceInfo> vDevices;
|
|
|
|
|
INPUTMAN->GetDevicesAndDescriptions(vDevices);
|
2003-08-02 19:28:55 +00:00
|
|
|
|
|
|
|
|
int iNumJoysticksMapped = 0;
|
|
|
|
|
|
2003-05-28 02:35:05 +00:00
|
|
|
for( unsigned i=0; i<vDevices.size(); i++ )
|
|
|
|
|
{
|
2006-02-27 17:51:27 +00:00
|
|
|
InputDevice id = vDevices[i].id;
|
|
|
|
|
const RString &sDescription = vDevices[i].sDesc;
|
2006-09-13 03:11:38 +00:00
|
|
|
for( unsigned j=0; j<ARRAYLEN(g_AutoJoyMappings); j++ )
|
2003-05-28 02:35:05 +00:00
|
|
|
{
|
|
|
|
|
const AutoJoyMapping& mapping = g_AutoJoyMappings[j];
|
|
|
|
|
|
2006-09-30 08:18:36 +00:00
|
|
|
if( RString(m_pInputScheme->m_szName).CompareNoCase(mapping.szGame) )
|
2004-07-25 04:27:20 +00:00
|
|
|
continue; // games don't match
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
RString sDriverRegex = mapping.szDriverRegex;
|
2003-10-12 17:44:33 +00:00
|
|
|
Regex regex( sDriverRegex );
|
2004-07-25 04:27:20 +00:00
|
|
|
if( !regex.Compare(sDescription) )
|
|
|
|
|
continue; // driver names don't match
|
2003-05-28 02:35:05 +00:00
|
|
|
|
2004-07-25 04:27:20 +00:00
|
|
|
//
|
|
|
|
|
// We have a mapping for this joystick
|
|
|
|
|
//
|
|
|
|
|
GameController gc = (GameController)iNumJoysticksMapped;
|
2006-09-26 20:57:31 +00:00
|
|
|
if( gc >= NUM_GameController )
|
2004-07-25 04:27:20 +00:00
|
|
|
break; // stop mapping. We already mapped one device for each game controller.
|
2003-05-28 02:35:05 +00:00
|
|
|
|
2004-07-25 04:27:20 +00:00
|
|
|
LOG->Info( "Applying default joystick mapping #%d for device '%s' (%s)",
|
|
|
|
|
iNumJoysticksMapped+1, mapping.szDriverRegex, mapping.szControllerName );
|
2003-10-01 01:52:21 +00:00
|
|
|
|
2006-02-09 00:04:01 +00:00
|
|
|
Unmap( id );
|
|
|
|
|
ApplyMapping( mapping.maps, gc, id );
|
2004-07-25 04:27:20 +00:00
|
|
|
|
|
|
|
|
iNumJoysticksMapped++;
|
2003-05-28 02:35:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-30 08:18:36 +00:00
|
|
|
void InputMapper::SetInputScheme( const InputScheme *pInputScheme )
|
|
|
|
|
{
|
|
|
|
|
m_pInputScheme = pInputScheme;
|
|
|
|
|
|
|
|
|
|
ReadMappingsFromDisk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const InputScheme *InputMapper::GetInputScheme() const
|
|
|
|
|
{
|
|
|
|
|
return m_pInputScheme;
|
|
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
static const RString DEVICE_INPUT_SEPARATOR = ":"; // this isn't used in any key names
|
2005-12-19 12:52:59 +00:00
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
void InputMapper::ReadMappingsFromDisk()
|
|
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
ClearAllMappings();
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
IniFile ini;
|
2005-12-12 09:59:37 +00:00
|
|
|
if( !ini.ReadFile( SpecialFiles::KEYMAPS_PATH ) )
|
|
|
|
|
LOG->Trace( "Couldn't open mapping file \"%s\": %s.",
|
|
|
|
|
SpecialFiles::KEYMAPS_PATH.c_str(), ini.GetError().c_str() );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2006-09-30 08:18:36 +00:00
|
|
|
const XNode *Key = ini.GetChild( m_pInputScheme->m_szName );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2003-01-03 22:37:44 +00:00
|
|
|
if( Key )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2005-01-26 09:13:59 +00:00
|
|
|
FOREACH_CONST_Attr( Key, i )
|
2002-07-31 19:40:40 +00:00
|
|
|
{
|
2006-01-22 01:00:06 +00:00
|
|
|
const RString &name = i->first;
|
2006-10-02 22:52:57 +00:00
|
|
|
RString value;
|
2006-10-03 00:07:01 +00:00
|
|
|
i->second->GetValue( value );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2002-07-31 19:40:40 +00:00
|
|
|
GameInput GameI;
|
2006-09-30 08:18:36 +00:00
|
|
|
GameI.FromString( m_pInputScheme, name );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
vector<RString> sDeviceInputStrings;
|
2005-12-19 12:52:59 +00:00
|
|
|
split( value, DEVICE_INPUT_SEPARATOR, sDeviceInputStrings, false );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2002-11-16 08:55:46 +00:00
|
|
|
for( unsigned i=0; i<sDeviceInputStrings.size() && i<unsigned(NUM_GAME_TO_DEVICE_SLOTS); i++ )
|
2002-07-31 19:40:40 +00:00
|
|
|
{
|
|
|
|
|
DeviceInput DeviceI;
|
2005-12-09 01:48:20 +00:00
|
|
|
DeviceI.FromString( sDeviceInputStrings[i] );
|
2002-07-31 19:40:40 +00:00
|
|
|
if( DeviceI.IsValid() )
|
|
|
|
|
SetInputMap( DeviceI, GameI, i );
|
|
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-07-31 19:40:40 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
AddDefaultMappingsForCurrentGameIfUnmapped();
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InputMapper::SaveMappingsToDisk()
|
|
|
|
|
{
|
|
|
|
|
IniFile ini;
|
2005-12-12 09:59:37 +00:00
|
|
|
ini.ReadFile( SpecialFiles::KEYMAPS_PATH );
|
2003-01-18 03:54:41 +00:00
|
|
|
|
|
|
|
|
// erase the key so that we overwrite everything for this game
|
2006-09-30 08:18:36 +00:00
|
|
|
ini.DeleteKey( m_pInputScheme->m_szName );
|
|
|
|
|
|
|
|
|
|
XNode *pKey = ini.GetChild( m_pInputScheme->m_szName );
|
|
|
|
|
if( pKey != NULL )
|
|
|
|
|
ini.RemoveChild( pKey );
|
|
|
|
|
pKey = ini.AppendChild( m_pInputScheme->m_szName );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
// iterate over our input map and write all mappings to the ini file
|
2005-04-24 02:15:41 +00:00
|
|
|
FOREACH_GameController( i )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-11-21 05:39:56 +00:00
|
|
|
FOREACH_GameButtonInScheme( m_pInputScheme, j )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-11-21 05:39:56 +00:00
|
|
|
GameInput GameI( i, j );
|
2006-09-30 08:18:36 +00:00
|
|
|
RString sNameString = GameI.ToString( m_pInputScheme );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
vector<RString> asValues;
|
2006-01-26 06:05:35 +00:00
|
|
|
for( int slot = 0; slot < NUM_USER_GAME_TO_DEVICE_SLOTS; ++slot ) // don't save data from the last (keyboard automap) slot
|
2005-12-09 01:48:20 +00:00
|
|
|
asValues.push_back( m_GItoDI[i][j][slot].ToString() );
|
2005-12-08 05:09:24 +00:00
|
|
|
|
2005-02-20 05:00:56 +00:00
|
|
|
while( asValues.size() && asValues.back() == "" )
|
|
|
|
|
asValues.erase( asValues.begin()+asValues.size()-1 );
|
2005-12-08 05:09:24 +00:00
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
RString sValueString = join( DEVICE_INPUT_SEPARATOR, asValues );
|
2005-02-20 05:00:56 +00:00
|
|
|
|
2006-09-30 08:18:36 +00:00
|
|
|
pKey->AppendAttr( sNameString, sValueString );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-12-12 09:59:37 +00:00
|
|
|
ini.WriteFile( SpecialFiles::KEYMAPS_PATH );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
static LocalizedString CONNECTED ( "InputMapper", "Connected" );
|
|
|
|
|
static LocalizedString DISCONNECTED ( "InputMapper", "Disconnected" );
|
|
|
|
|
static LocalizedString AUTOMAPPING_ALL_JOYSTICKS ( "InputMapper", "Auto-mapping all joysticks." );
|
|
|
|
|
bool InputMapper::CheckForChangedInputDevicesAndRemap( RString &sMessageOut )
|
2005-12-18 23:45:46 +00:00
|
|
|
{
|
2006-02-27 17:51:27 +00:00
|
|
|
// Only check for changes in joysticks since that's all we know how to remap.
|
|
|
|
|
|
2005-12-18 23:45:46 +00:00
|
|
|
// update last seen joysticks
|
2006-02-27 17:51:27 +00:00
|
|
|
vector<InputDeviceInfo> vDevices;
|
|
|
|
|
INPUTMAN->GetDevicesAndDescriptions( vDevices );
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
// Strip non-joysticks.
|
|
|
|
|
vector<RString> vsLastSeenJoysticks;
|
|
|
|
|
split( g_sLastSeenInputDevices, ",", vsLastSeenJoysticks );
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
vector<RString> vsCurrent;
|
|
|
|
|
vector<RString> vsCurrentJoysticks;
|
|
|
|
|
for( int i=vDevices.size()-1; i>=0; i-- )
|
|
|
|
|
{
|
|
|
|
|
vsCurrent.push_back( vDevices[i].sDesc );
|
|
|
|
|
if( IsJoystick(vDevices[i].id) )
|
|
|
|
|
{
|
|
|
|
|
vsCurrentJoysticks.push_back( vDevices[i].sDesc );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
vector<RString>::iterator iter = find( vsLastSeenJoysticks.begin(), vsLastSeenJoysticks.end(), vDevices[i].sDesc );
|
|
|
|
|
if( iter != vsLastSeenJoysticks.end() )
|
|
|
|
|
vsLastSeenJoysticks.erase( iter );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-07-08 07:07:37 +00:00
|
|
|
bool bJoysticksChanged = vsCurrentJoysticks != vsLastSeenJoysticks;
|
2006-02-27 17:51:27 +00:00
|
|
|
if( !bJoysticksChanged )
|
|
|
|
|
return false;
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
vector<RString> vsConnects, vsDisconnects;
|
2006-02-27 17:51:27 +00:00
|
|
|
GetConnectsDisconnects( vsLastSeenJoysticks, vsCurrentJoysticks, vsDisconnects, vsConnects );
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
sMessageOut = RString();
|
2005-12-18 23:45:46 +00:00
|
|
|
if( !vsConnects.empty() )
|
2006-02-27 17:51:27 +00:00
|
|
|
sMessageOut += CONNECTED.GetValue()+": " + join( "\n", vsConnects ) + "\n";
|
2005-12-18 23:45:46 +00:00
|
|
|
if( !vsDisconnects.empty() )
|
2006-02-27 17:51:27 +00:00
|
|
|
sMessageOut += DISCONNECTED.GetValue()+": " + join( "\n", vsDisconnects ) + "\n";
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2005-12-19 00:18:33 +00:00
|
|
|
if( g_bAutoMapOnJoyChange )
|
2005-12-18 23:45:46 +00:00
|
|
|
{
|
2006-02-27 17:51:27 +00:00
|
|
|
sMessageOut += AUTOMAPPING_ALL_JOYSTICKS.GetValue();
|
2005-12-18 23:45:46 +00:00
|
|
|
AutoMapJoysticksForCurrentGame();
|
|
|
|
|
SaveMappingsToDisk();
|
2006-01-26 04:51:07 +00:00
|
|
|
MESSAGEMAN->Broadcast( Message_AutoJoyMappingApplied );
|
2005-12-18 23:45:46 +00:00
|
|
|
}
|
|
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
LOG->Info( sMessageOut );
|
2005-12-18 23:45:46 +00:00
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
g_sLastSeenInputDevices.Set( join(",",vsCurrent) );
|
2005-12-18 23:45:46 +00:00
|
|
|
PREFSMAN->SavePrefsToDisk();
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2005-10-15 16:47:44 +00:00
|
|
|
void InputMapper::SetInputMap( const DeviceInput &DeviceI, const GameInput &GameI, int iSlotIndex )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
// remove the old input
|
|
|
|
|
ClearFromInputMap( DeviceI );
|
|
|
|
|
ClearFromInputMap( GameI, iSlotIndex );
|
2006-01-27 10:11:50 +00:00
|
|
|
|
2006-09-26 20:57:31 +00:00
|
|
|
ASSERT_M( GameI.controller < NUM_GameController,
|
|
|
|
|
ssprintf("controller: %u >= %u", GameI.controller, NUM_GameController) );
|
2006-09-27 04:39:51 +00:00
|
|
|
ASSERT_M( GameI.button < NUM_GameButton,
|
|
|
|
|
ssprintf("button: %u >= %u", GameI.button, NUM_GameButton) );
|
2006-01-27 10:11:50 +00:00
|
|
|
ASSERT_M( iSlotIndex < NUM_GAME_TO_DEVICE_SLOTS,
|
|
|
|
|
ssprintf("slot: %u >= %u", iSlotIndex, NUM_GAME_TO_DEVICE_SLOTS) );
|
2002-07-27 19:29:51 +00:00
|
|
|
m_GItoDI[GameI.controller][GameI.button][iSlotIndex] = DeviceI;
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
UpdateTempDItoGI();
|
|
|
|
|
}
|
|
|
|
|
|
2005-10-15 16:47:44 +00:00
|
|
|
void InputMapper::ClearFromInputMap( const DeviceInput &DeviceI )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
// search for where this DeviceI maps to
|
|
|
|
|
|
2006-09-26 20:52:11 +00:00
|
|
|
FOREACH_GameController( p )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-09-27 04:29:12 +00:00
|
|
|
FOREACH_GameButton(b)
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
for( int s=0; s<NUM_GAME_TO_DEVICE_SLOTS; s++ )
|
|
|
|
|
{
|
|
|
|
|
if( m_GItoDI[p][b][s] == DeviceI )
|
2002-07-31 19:40:40 +00:00
|
|
|
m_GItoDI[p][b][s].MakeInvalid();
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateTempDItoGI();
|
|
|
|
|
}
|
|
|
|
|
|
2005-12-09 03:05:17 +00:00
|
|
|
bool InputMapper::ClearFromInputMap( const GameInput &GameI, int iSlotIndex )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
if( !GameI.IsValid() )
|
2005-12-09 03:05:17 +00:00
|
|
|
return false;
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2005-12-09 03:05:17 +00:00
|
|
|
DeviceInput &di = m_GItoDI[GameI.controller][GameI.button][iSlotIndex];
|
|
|
|
|
if( !di.IsValid() )
|
|
|
|
|
return false;
|
|
|
|
|
di.MakeInvalid();
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
UpdateTempDItoGI();
|
2005-12-09 03:05:17 +00:00
|
|
|
return true;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2005-10-15 16:47:44 +00:00
|
|
|
bool InputMapper::IsMapped( const DeviceInput &DeviceI )
|
2002-07-31 19:40:40 +00:00
|
|
|
{
|
2005-12-28 20:50:12 +00:00
|
|
|
return g_tempDItoGI.find(DeviceI) != g_tempDItoGI.end();
|
2002-07-31 19:40:40 +00:00
|
|
|
}
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
void InputMapper::UpdateTempDItoGI()
|
|
|
|
|
{
|
2005-12-28 20:50:12 +00:00
|
|
|
// repopulate g_tempDItoGI
|
|
|
|
|
g_tempDItoGI.clear();
|
2006-09-15 05:25:51 +00:00
|
|
|
FOREACH_GameController( n )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-09-15 05:25:51 +00:00
|
|
|
FOREACH_GameButton( b )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
for( int s=0; s<NUM_GAME_TO_DEVICE_SLOTS; s++ )
|
|
|
|
|
{
|
2006-09-15 05:25:51 +00:00
|
|
|
const DeviceInput &DeviceI = m_GItoDI[n][b][s];
|
|
|
|
|
if( !DeviceI.IsValid() )
|
|
|
|
|
continue;
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2006-09-15 05:25:51 +00:00
|
|
|
g_tempDItoGI[DeviceI] = GameInput( n, b );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-10-15 16:47:44 +00:00
|
|
|
bool InputMapper::DeviceToGame( const DeviceInput &DeviceI, GameInput& GameI ) // return true if there is a mapping from device to pad
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2005-12-28 20:50:12 +00:00
|
|
|
GameI = g_tempDItoGI[DeviceI];
|
2006-09-26 20:59:40 +00:00
|
|
|
return GameI.controller != GameController_Invalid;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2006-09-13 03:20:59 +00:00
|
|
|
bool InputMapper::GameToDevice( const GameInput &GameI, int iSlotNum, DeviceInput& DeviceI ) // return true if there is a mapping from pad to device
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-09-13 03:20:59 +00:00
|
|
|
DeviceI = m_GItoDI[GameI.controller][GameI.button][iSlotNum];
|
2006-09-26 21:10:47 +00:00
|
|
|
return DeviceI.device != InputDevice_Invalid;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2006-09-13 09:57:07 +00:00
|
|
|
PlayerNumber InputMapper::ControllerToPlayerNumber( GameController controller )
|
|
|
|
|
{
|
2006-09-30 22:29:03 +00:00
|
|
|
if( g_JoinControllers != PLAYER_INVALID )
|
|
|
|
|
return g_JoinControllers;
|
2006-09-13 09:57:07 +00:00
|
|
|
else
|
|
|
|
|
return (PlayerNumber) controller;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-14 20:37:41 +00:00
|
|
|
MenuButton InputMapper::GameToMenu( const GameInput &GameI )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-09-30 08:18:36 +00:00
|
|
|
return m_pInputScheme->GameInputToMenuButton( GameI );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2006-09-30 22:29:03 +00:00
|
|
|
/* If set (not PLAYER_INVALID), inputs from both GameControllers will be mapped
|
|
|
|
|
* to the specified player. If PLAYER_INVALID, GameControllers will be mapped
|
|
|
|
|
* individually. */
|
|
|
|
|
void InputMapper::SetJoinControllers( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
g_JoinControllers = pn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-09-14 20:45:51 +00:00
|
|
|
void InputMapper::MenuToGame( MenuButton MenuI, PlayerNumber pn, GameInput GameIout[4] )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2006-09-30 22:29:03 +00:00
|
|
|
if( g_JoinControllers != PLAYER_INVALID )
|
|
|
|
|
pn = PLAYER_INVALID;
|
2006-09-30 03:08:18 +00:00
|
|
|
|
2006-09-30 08:18:36 +00:00
|
|
|
m_pInputScheme->MenuButtonToGameInputs( MenuI, pn, GameIout );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2002-07-31 19:40:40 +00:00
|
|
|
|
2006-09-08 04:04:40 +00:00
|
|
|
bool InputMapper::IsBeingPressed( const GameInput &GameI, MultiPlayer mp, const DeviceInputList *pButtonState )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_GAME_TO_DEVICE_SLOTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
DeviceInput DeviceI;
|
|
|
|
|
|
|
|
|
|
if( GameToDevice( GameI, i, DeviceI ) )
|
2006-07-01 02:16:38 +00:00
|
|
|
{
|
2006-10-07 03:43:41 +00:00
|
|
|
if( mp != MultiPlayer_Invalid )
|
2006-07-01 02:16:38 +00:00
|
|
|
DeviceI.device = MultiPlayerToInputDevice(mp);
|
2006-09-08 04:04:40 +00:00
|
|
|
if( INPUTFILTER->IsBeingPressed(DeviceI, pButtonState) )
|
2002-04-16 17:31:00 +00:00
|
|
|
return true;
|
2006-07-01 02:16:38 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-14 20:45:51 +00:00
|
|
|
bool InputMapper::IsBeingPressed( MenuButton MenuI, PlayerNumber pn )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
GameInput GameI[4];
|
2006-09-14 03:34:52 +00:00
|
|
|
MenuToGame( MenuI, pn, GameI );
|
2002-07-31 19:40:40 +00:00
|
|
|
for( int i=0; i<4; i++ )
|
2006-09-08 02:12:30 +00:00
|
|
|
if( GameI[i].IsValid() && IsBeingPressed(GameI[i]) )
|
2002-07-31 19:40:40 +00:00
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
|
|
|
|
|
2006-09-14 20:39:54 +00:00
|
|
|
void InputMapper::RepeatStopKey( const GameInput &GameI )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_GAME_TO_DEVICE_SLOTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
DeviceInput DeviceI;
|
|
|
|
|
|
|
|
|
|
if( GameToDevice( GameI, i, DeviceI ) )
|
|
|
|
|
INPUTFILTER->RepeatStopKey( DeviceI );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InputMapper::RepeatStopKey( MenuButton MenuI, PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
GameInput GameI[4];
|
|
|
|
|
MenuToGame( MenuI, pn, GameI );
|
|
|
|
|
for( int i=0; i<4; i++ )
|
|
|
|
|
if( GameI[i].IsValid() )
|
|
|
|
|
RepeatStopKey( GameI[i] );
|
|
|
|
|
}
|
|
|
|
|
|
2006-07-01 02:16:38 +00:00
|
|
|
float InputMapper::GetSecsHeld( const GameInput &GameI, MultiPlayer mp )
|
2002-10-18 19:01:32 +00:00
|
|
|
{
|
|
|
|
|
float fMaxSecsHeld = 0;
|
|
|
|
|
|
|
|
|
|
for( int i=0; i<NUM_GAME_TO_DEVICE_SLOTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
DeviceInput DeviceI;
|
|
|
|
|
if( GameToDevice( GameI, i, DeviceI ) )
|
2006-07-01 02:16:38 +00:00
|
|
|
{
|
2006-10-07 03:43:41 +00:00
|
|
|
if( mp != MultiPlayer_Invalid )
|
2006-07-01 02:16:38 +00:00
|
|
|
DeviceI.device = MultiPlayerToInputDevice(mp);
|
2002-10-18 19:01:32 +00:00
|
|
|
fMaxSecsHeld = max( fMaxSecsHeld, INPUTFILTER->GetSecsHeld(DeviceI) );
|
2006-07-01 02:16:38 +00:00
|
|
|
}
|
2002-10-18 19:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fMaxSecsHeld;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-14 20:45:51 +00:00
|
|
|
float InputMapper::GetSecsHeld( MenuButton MenuI, PlayerNumber pn )
|
2002-10-18 19:01:32 +00:00
|
|
|
{
|
|
|
|
|
float fMaxSecsHeld = 0;
|
|
|
|
|
|
|
|
|
|
GameInput GameI[4];
|
2006-09-14 03:34:52 +00:00
|
|
|
MenuToGame( MenuI, pn, GameI );
|
2002-10-18 19:01:32 +00:00
|
|
|
for( int i=0; i<4; i++ )
|
|
|
|
|
if( GameI[i].IsValid() )
|
|
|
|
|
fMaxSecsHeld = max( fMaxSecsHeld, GetSecsHeld(GameI[i]) );
|
|
|
|
|
|
|
|
|
|
return fMaxSecsHeld;
|
|
|
|
|
}
|
|
|
|
|
|
2005-10-15 16:47:44 +00:00
|
|
|
void InputMapper::ResetKeyRepeat( const GameInput &GameI )
|
2003-11-25 21:46:30 +00:00
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_GAME_TO_DEVICE_SLOTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
DeviceInput DeviceI;
|
|
|
|
|
if( GameToDevice( GameI, i, DeviceI ) )
|
|
|
|
|
INPUTFILTER->ResetKeyRepeat( DeviceI );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-14 20:45:51 +00:00
|
|
|
void InputMapper::ResetKeyRepeat( MenuButton MenuI, PlayerNumber pn )
|
2003-11-25 21:46:30 +00:00
|
|
|
{
|
|
|
|
|
GameInput GameI[4];
|
2006-09-14 03:34:52 +00:00
|
|
|
MenuToGame( MenuI, pn, GameI );
|
2003-11-25 21:46:30 +00:00
|
|
|
for( int i=0; i<4; i++ )
|
|
|
|
|
if( GameI[i].IsValid() )
|
|
|
|
|
ResetKeyRepeat( GameI[i] );
|
|
|
|
|
}
|
|
|
|
|
|
2005-08-30 16:22:48 +00:00
|
|
|
InputDevice InputMapper::MultiPlayerToInputDevice( MultiPlayer mp )
|
|
|
|
|
{
|
2006-10-07 03:43:41 +00:00
|
|
|
if( mp == MultiPlayer_Invalid )
|
2006-09-26 21:10:47 +00:00
|
|
|
return InputDevice_Invalid;
|
2005-12-28 21:05:43 +00:00
|
|
|
return enum_add2( DEVICE_JOY1, mp );
|
2005-08-30 16:22:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MultiPlayer InputMapper::InputDeviceToMultiPlayer( InputDevice id )
|
|
|
|
|
{
|
2006-09-26 21:10:47 +00:00
|
|
|
if( id == InputDevice_Invalid )
|
2006-10-07 03:43:41 +00:00
|
|
|
return MultiPlayer_Invalid;
|
2005-12-28 21:05:43 +00:00
|
|
|
return enum_add2( MultiPlayer_1, id - DEVICE_JOY1 );
|
2005-08-30 16:22:48 +00:00
|
|
|
}
|
|
|
|
|
|
2006-09-30 22:36:01 +00:00
|
|
|
GameButton InputScheme::ButtonNameToIndex( const RString &sButtonName ) const
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<m_iButtonsPerController; i++ )
|
2007-01-12 22:57:55 +00:00
|
|
|
if( stricmp(GetGameButtonName(i), sButtonName) == 0 )
|
2006-09-30 22:36:01 +00:00
|
|
|
return i;
|
|
|
|
|
|
|
|
|
|
return GameButton_Invalid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MenuButton InputScheme::GameInputToMenuButton( GameInput GameI ) const
|
|
|
|
|
{
|
|
|
|
|
FOREACH_MenuButton(i)
|
2007-01-11 06:31:48 +00:00
|
|
|
if( g_DedicatedMenuButtons[i] == GameI.button )
|
2006-09-30 22:36:01 +00:00
|
|
|
return i;
|
|
|
|
|
|
|
|
|
|
if( !PREFSMAN->m_bOnlyDedicatedMenuButtons )
|
|
|
|
|
{
|
|
|
|
|
FOREACH_MenuButton(i)
|
|
|
|
|
if( m_SecondaryMenuButton[i] == GameI.button )
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-07 04:25:28 +00:00
|
|
|
return MenuButton_Invalid; // invalid GameInput
|
2006-09-30 22:36:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InputScheme::MenuButtonToGameInputs( MenuButton MenuI, PlayerNumber pn, GameInput GameIout[4] ) const
|
|
|
|
|
{
|
2006-10-07 04:25:28 +00:00
|
|
|
ASSERT( MenuI != MenuButton_Invalid );
|
2006-09-30 22:36:01 +00:00
|
|
|
|
|
|
|
|
GameIout[0].MakeInvalid(); // initialize
|
|
|
|
|
GameIout[1].MakeInvalid();
|
|
|
|
|
GameIout[2].MakeInvalid();
|
|
|
|
|
GameIout[3].MakeInvalid();
|
|
|
|
|
|
|
|
|
|
vector<GameController> controller;
|
|
|
|
|
if( pn == PLAYER_INVALID )
|
|
|
|
|
{
|
|
|
|
|
controller.push_back( GAME_CONTROLLER_1 );
|
|
|
|
|
controller.push_back( GAME_CONTROLLER_2 );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
controller.push_back( (GameController)pn );
|
|
|
|
|
}
|
|
|
|
|
|
2007-01-11 06:31:48 +00:00
|
|
|
GameButton button[2] = { g_DedicatedMenuButtons[MenuI], m_SecondaryMenuButton[MenuI] };
|
2006-09-30 22:36:01 +00:00
|
|
|
int iNumButtonsUsing = PREFSMAN->m_bOnlyDedicatedMenuButtons ? 1 : 2;
|
|
|
|
|
|
2006-11-21 06:57:07 +00:00
|
|
|
int iOut = 0;
|
2006-09-30 22:36:01 +00:00
|
|
|
for( size_t i=0; i<controller.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
for( int j=0; j<iNumButtonsUsing; j++ )
|
|
|
|
|
{
|
2006-11-21 06:57:07 +00:00
|
|
|
if( button[j] == GameButton_Invalid )
|
|
|
|
|
continue;
|
|
|
|
|
GameIout[iOut].controller = controller[i];
|
|
|
|
|
GameIout[iOut].button = button[j];
|
|
|
|
|
++iOut;
|
2006-09-30 22:36:01 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-21 07:16:19 +00:00
|
|
|
MenuButton InputScheme::GetMenuButtonSecondaryFunction( GameButton gb ) const
|
|
|
|
|
{
|
|
|
|
|
FOREACH_MenuButton(mb)
|
|
|
|
|
if( m_SecondaryMenuButton[mb] == gb )
|
|
|
|
|
return mb;
|
|
|
|
|
|
|
|
|
|
return MenuButton_Invalid;
|
|
|
|
|
}
|
|
|
|
|
|
2007-01-12 22:57:55 +00:00
|
|
|
static const char *g_szCommonGameButtonNames[] =
|
|
|
|
|
{
|
|
|
|
|
"MenuLeft",
|
|
|
|
|
"MenuRight",
|
|
|
|
|
"MenuUp",
|
|
|
|
|
"MenuDown",
|
|
|
|
|
"Start",
|
|
|
|
|
"Select",
|
|
|
|
|
"Back",
|
|
|
|
|
"Coin",
|
|
|
|
|
"Operator",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const char *InputScheme::GetGameButtonName( GameButton gb ) const
|
|
|
|
|
{
|
|
|
|
|
COMPILE_ASSERT( GAME_BUTTON_NEXT == ARRAYLEN(g_szCommonGameButtonNames) );
|
|
|
|
|
if( gb < GAME_BUTTON_NEXT )
|
|
|
|
|
return g_szCommonGameButtonNames[gb];
|
|
|
|
|
else
|
|
|
|
|
return m_szGameButtonNames[gb-GAME_BUTTON_NEXT];
|
|
|
|
|
}
|
|
|
|
|
|
2004-06-08 01:24:17 +00:00
|
|
|
/*
|
|
|
|
|
* (c) 2001-2003 Chris Danford
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|