void InputMapper::UpdateTempDItoGI() { // clear out m_tempDItoGI for( int d=0; d<NUM_INPUT_DEVICES; d++ ) { for( int b=0; b<NUM_DEVICE_BUTTONS[d]; b++ ) { m_tempDItoGI[d][b].MakeInvalid(); } } // repopulate m_tempDItoGI for( int n=0; n<MAX_GAME_CONTROLLERS; n++ ) { for( int b=0; b<MAX_GAME_BUTTONS; b++ ) { for( int s=0; s<NUM_GAME_TO_DEVICE_SLOTS; s++ ) { GameInput GameI( (GameController)n, (GameButton)b ); DeviceInput DeviceI = m_GItoDI[n][b][s]; if( DeviceI.IsValid() ) m_tempDItoGI[DeviceI.device][DeviceI.button] = GameI; } } } }
// connect two devices virtual void connect(BaseDevice *dev) { if (nullptr != dev && this != dev) { // try to dowcast to DeviceOutput pointer DeviceOutput<A> *out = dynamic_cast<DeviceOutput<A> *>(dev); // try to dowcast to DeviceInput pointer DeviceInput<B> *in = dynamic_cast<DeviceInput<B> *>(dev); if (nullptr != in) { // connect the current device's output to the external device's input in->add_signal_source(this); } else if (nullptr != out) { // connec the external device's output to this current device's input // reverse case add_signal_source(dev); } } }
void ScreenTestInput::Update( float fDeltaTime ) { Screen::Update( fDeltaTime ); CStringArray asInputs; DeviceInput di; // XXX: is this needed? MESSAGEMAN->Broadcast( "ResetButtons" ); FOREACH_InputDevice( d ) { for( int b=0; b<GetNumDeviceButtons(d); b++ ) { di.device = d; di.button = b; if( !INPUTFILTER->IsBeingPressed(di) ) continue; CString sTemp; sTemp += di.toString(); GameInput gi; if( INPUTMAPPER->DeviceToGame(di,gi) ) { CString sName = GAMESTATE->GetCurrentGame()->m_szButtonNames[gi.button]; sTemp += ssprintf(" - Controller %d %s", gi.controller+1, sName.c_str() ); // broadcast a theme notice - "P1Left", etc. MESSAGEMAN->Broadcast( ssprintf("P%d%s", gi.controller+1, sName.c_str()) ); if( !PREFSMAN->m_bOnlyDedicatedMenuButtons ) { CString sSecondary = GAMEMAN->GetMenuButtonSecondaryFunction( GAMESTATE->GetCurrentGame(), gi.button ); if( !sSecondary.empty() ) sTemp += ssprintf(" - (%s secondary)", sSecondary.c_str() ); } } else { sTemp += " - not mapped"; } CString sComment = INPUTFILTER->GetButtonComment( di ); if( sComment != "" ) sTemp += " - " + sComment; asInputs.push_back( sTemp ); } } m_textInputs.SetText( join( "\n", asInputs ) ); }
void Clear() { holdForDebug1.MakeInvalid(); holdForDebug2.MakeInvalid(); holdForSlow.MakeInvalid(); holdForFast.MakeInvalid(); for( int i=0; i<MAX_DEBUG_LINES; i++ ) { debugButton[i].MakeInvalid(); gameplayButton[i].MakeInvalid(); } }
void ScreenMapControllers::Refresh() { for( int p=0; p<MAX_GAME_CONTROLLERS; p++ ) { for( int b=0; b<GAMESTATE->GetCurrentGame()->m_iButtonsPerController; b++ ) { for( int s=0; s<NUM_SHOWN_GAME_TO_DEVICE_SLOTS; s++ ) { bool bSelected = p == m_iCurController && b == m_iCurButton && s == m_iCurSlot; GameInput cur_gi( (GameController)p, (GameButton)b ); DeviceInput di; if( INPUTMAPPER->GameToDevice( cur_gi, s, di ) ) m_textMappedTo[p][b][s].SetText( di.toString() ); else m_textMappedTo[p][b][s].SetText( "-----------" ); // highlight the currently selected pad button RageColor color; bool bPulse; if( bSelected ) { if( m_iWaitingForPress ) { color = RageColor(1,0.5,0.5,1); // red bPulse = true; } else { color = RageColor(1,1,1,1); // white bPulse = false; } } else { color = RageColor(0.5,0.5,0.5,1); // gray bPulse = false; } m_textMappedTo[p][b][s].SetDiffuse( color ); if( bPulse ) m_textMappedTo[p][b][s].SetEffectPulse( .5f, .5f, .6f ); else m_textMappedTo[p][b][s].SetEffectNone(); } } } }
// disconnect two devices virtual void disconnect(BaseDevice *dev) { if (nullptr != dev && this != dev) { // try to disconnect the external device from this current input remove_signal_source(dev); // try to dowcast to DeviceInput pointer DeviceInput<B> *in = dynamic_cast<DeviceInput<B> *>(dev); if (nullptr != in) { // try to disconnect this output device from the external device's input(s) in->remove_signal_source(this); } } }
void ScreenTestInput::Update( float fDeltaTime ) { Screen::Update( fDeltaTime ); CStringArray asInputs; DeviceInput di; for( int d=0; d<NUM_INPUT_DEVICES; d++ ) { for( int b=0; b<NUM_DEVICE_BUTTONS[d]; b++ ) { di.device = (InputDevice)d; di.button = b; if( INPUTFILTER->IsBeingPressed(di) ) { CString sTemp; sTemp += di.GetDescription(); GameInput gi; if( INPUTMAPPER->DeviceToGame(di,gi) ) { CString sName = GAMESTATE->GetCurrentGame()->m_szButtonNames[gi.button]; CString sSecondary = GAMESTATE->GetCurrentGame()->m_szSecondaryFunction[gi.button]; sTemp += ssprintf(" (Controller %d %s) %s", gi.controller+1, sName.c_str(), sSecondary.c_str() ); } else { sTemp += " (not mapped)"; } asInputs.push_back( sTemp ); } } } m_textInputs.SetText( join( "\n ", asInputs ) ); }
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::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(); }
/* Note that this isn't necessarily correct. For example, JOY_LEFT might actually be * a D-pad and not an axis. All this is actually doing is giving priority to some * inputs over others; this function is unsuitable for other use. */ static bool IsAxis( const DeviceInput& DeviceI ) { if( !DeviceI.IsJoystick() ) return false; static int axes[] = { JOY_LEFT, JOY_RIGHT, JOY_UP, JOY_DOWN, JOY_LEFT_2, JOY_RIGHT_2, JOY_UP_2, JOY_DOWN_2, JOY_Z_UP, JOY_Z_DOWN, JOY_ROT_UP, JOY_ROT_DOWN, JOY_ROT_LEFT, JOY_ROT_RIGHT, JOY_ROT_Z_UP, JOY_ROT_Z_DOWN, JOY_HAT_LEFT, JOY_HAT_RIGHT, JOY_HAT_UP, JOY_HAT_DOWN, JOY_AUX_1, JOY_AUX_2, JOY_AUX_3, JOY_AUX_4, -1 }; for( int ax = 0; axes[ax] != -1; ++ax ) if( DeviceI.button == axes[ax] ) return true; return false; }