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 ); } }
GameInput Style::StyleInputToGameInput( int iCol, PlayerNumber pn ) const { ASSERT_M( pn < NUM_PLAYERS && iCol < MAX_COLS_PER_PLAYER, ssprintf("P%i C%i", pn, iCol) ); bool bUsingOneSide = m_StyleType != StyleType_OnePlayerTwoSides && m_StyleType != StyleType_TwoPlayersSharedSides; FOREACH_ENUM( GameController, gc) { if( bUsingOneSide && gc != (int) pn ) continue; int iButtonsPerController = INPUTMAPPER->GetInputScheme()->m_iButtonsPerController; for( GameButton gb=GAME_BUTTON_NEXT; gb < iButtonsPerController; gb=(GameButton)(gb+1) ) { int iThisInputCol = m_iInputColumn[gc][gb-GAME_BUTTON_NEXT]; if( iThisInputCol == END_MAPPING ) break; if( iThisInputCol == iCol ) return GameInput( gc, gb ); } } FAIL_M( ssprintf("Invalid column number %i for player %i in the style %s", iCol, pn, GAMESTATE->GetCurrentStyle()->m_szName) ); };
GameInput Style::StyleInputToGameInput( const StyleInput& StyleI ) const { ASSERT_M( StyleI.player < NUM_PLAYERS, ssprintf("P%i", StyleI.player) ); ASSERT_M( StyleI.col < MAX_COLS_PER_PLAYER, ssprintf("C%i", StyleI.col) ); bool bUsingOneSide = this->m_StyleType != ONE_PLAYER_TWO_SIDES; FOREACH_GameController(gc) { if( bUsingOneSide && gc != (int) StyleI.player ) continue; for( GameButton gb = GAME_BUTTON_NEXT; gb < m_pGame->m_iButtonsPerController && m_iInputColumn[gc][gb-GAME_BUTTON_NEXT] != END_MAPPING; gb=(GameButton)(gb+1) ) if( m_iInputColumn[gc][gb-GAME_BUTTON_NEXT] == StyleI.col ) return GameInput( gc, gb ); } FAIL_M( ssprintf("Unknown StyleInput %i,%i", StyleI.player, StyleI.col) ); };
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 ); } } }