void InputMapper::AddDefaultMappingsForCurrentGameIfUnmapped() { // Clear default mappings. Default mappings are in the third slot. FOREACH_ENUM( GameController, i ) FOREACH_ENUM( GameButton, j) ClearFromInputMap( GameInput(i, j), 2 ); vector<AutoMappingEntry> aMaps; aMaps.reserve( 32 ); 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( AutoMappingEntry, aMaps, m ) { DeviceButton key = m->m_deviceButton; DeviceInput DeviceI( DEVICE_KEYBOARD, key ); GameInput GameI( m->m_bSecondController ? GameController_2 : GameController_1, m->m_gb ); if( !IsMapped(DeviceI) ) // if this key isn't already being used by another user-made mapping { if( !GameI.IsValid() ) ClearFromInputMap( DeviceI ); else SetInputMap( DeviceI, GameI, 2 ); } }
void InputMapper::ApplyMapping( const Mapping *maps, GameController gc, InputDevice device ) { 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.) */ if( map_gc >= GAME_CONTROLLER_INVALID ) continue; } DeviceInput di( device, maps[k].deviceButton ); GameInput gi( map_gc, maps[k].gb ); SetInputMap( di, gi, maps[k].iSlotIndex ); } }
void InputMapper::ReadMappingsFromDisk() { ASSERT( GAMEMAN != NULL ); ClearAllMappings(); IniFile ini; if( !ini.ReadFile( KEYMAPS_PATH ) ) LOG->Trace( "Couldn't open mapping file \"%s\": %s.", KEYMAPS_PATH, ini.GetError().c_str() ); const Game *pGame = GAMESTATE->GetCurrentGame(); const XNode *Key = ini.GetChild( pGame->m_szName ); if( Key ) { FOREACH_CONST_Attr( Key, i ) { const CString &name = i->m_sName; const CString &value = i->m_sValue; GameInput GameI; GameI.fromString( pGame, name ); CStringArray sDeviceInputStrings; split( value, ",", sDeviceInputStrings, false ); for( unsigned i=0; i<sDeviceInputStrings.size() && i<unsigned(NUM_GAME_TO_DEVICE_SLOTS); i++ ) { DeviceInput DeviceI; DeviceI.fromString( sDeviceInputStrings[i] ); if( DeviceI.IsValid() ) SetInputMap( DeviceI, GameI, i ); } } } AddDefaultMappingsForCurrentGameIfUnmapped(); }
void InputMapper::AddDefaultMappingsForCurrentGameIfUnmapped() { // Clear default mappings. Default mappings are in the third slot. for( int i=0; i<MAX_GAME_CONTROLLERS; i++ ) for( int j=0; j<MAX_GAME_BUTTONS; j++ ) ClearFromInputMap( GameInput((GameController)i,(GameButton)j), 2 ); const Game* pGame = GAMESTATE->GetCurrentGame(); for( int c=0; c<MAX_GAME_CONTROLLERS; c++ ) { for( int b=0; b<pGame->m_iButtonsPerController; b++ ) { int key = pGame->m_iDefaultKeyboardKey[c][b]; if( key == NO_DEFAULT_KEY ) continue; DeviceInput DeviceI( DEVICE_KEYBOARD, key ); GameInput GameI( (GameController)c, (GameButton)b ); if( !IsMapped(DeviceI) ) // if this key isn't already being used by another user-made mapping SetInputMap( DeviceI, GameI, 2 ); } } }
void InputMapper::ReadMappingsFromDisk() { ASSERT( GAMEMAN != NULL ); ClearAllMappings(); IniFile ini; if( !ini.ReadFile( KEYMAPS_PATH ) ) LOG->Trace( "Couldn't open mapping file \"%s\": %s.", KEYMAPS_PATH, ini.GetError().c_str() ); const IniFile::key *Key = ini.GetKey( GAMESTATE->GetCurrentGame()->m_szName ); if( Key ) { for( IniFile::key::const_iterator i = Key->begin(); i != Key->end(); ++i ) { const CString &name = i->first; const CString &value = i->second; GameInput GameI; GameI.fromString( name ); CStringArray sDeviceInputStrings; split( value, ",", sDeviceInputStrings, false ); for( unsigned i=0; i<sDeviceInputStrings.size() && i<unsigned(NUM_GAME_TO_DEVICE_SLOTS); i++ ) { DeviceInput DeviceI; DeviceI.fromString( sDeviceInputStrings[i] ); if( DeviceI.IsValid() ) SetInputMap( DeviceI, GameI, i ); } } } AddDefaultMappingsForCurrentGameIfUnmapped(); }