diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index 352b8967fc..d19634d407 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -19,6 +19,7 @@ #include "GameInput.h" // for GameController #include "InputMapper.h" #include "GameDef.h" +#include "PrefsManager.h" static const CString CabinetLightNames[NUM_CABINET_LIGHTS] = { @@ -54,7 +55,8 @@ LightsManager::LightsManager(CString sDriver) m_pDriver = MakeLightsDriver(sDriver); - ZERO( m_fSecsLeftInBlink ); + ZERO( m_fSecsLeftInCabinetLightBlink ); + ZERO( m_fSecsLeftInGameButtonBlink ); } LightsManager::~LightsManager() @@ -67,15 +69,18 @@ void LightsManager::Update( float fDeltaTime ) // update lights falloff { FOREACH_CabinetLight( cl ) - m_fSecsLeftInBlink[cl] = max( 0, m_fSecsLeftInBlink[cl] - fDeltaTime ); + fapproach( m_fSecsLeftInCabinetLightBlink[cl], 0, fDeltaTime ); + FOREACH_GameController( gc ) + FOREACH_GameButton( gb ) + fapproach( m_fSecsLeftInGameButtonBlink[gc][gb], 0, fDeltaTime ); } // // Set new lights state cabinet lights // { - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = false; + ZERO( m_LightsState.m_bCabinetLights ); + ZERO( m_LightsState.m_bGameButtonLights ); } switch( m_LightsMode ) @@ -147,12 +152,7 @@ void LightsManager::Update( float fDeltaTime ) case LIGHTSMODE_GAMEPLAY: { FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = false; - - { - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInBlink[cl] > 0 ; - } + m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInCabinetLightBlink[cl] > 0 ; } break; case LIGHTSMODE_STAGE: @@ -221,16 +221,29 @@ void LightsManager::Update( float fDeltaTime ) break; case LIGHTSMODE_GAMEPLAY: { - FOREACH_GameController( gc ) + if( PREFSMAN->m_bBlinkGameplayButtonLightsOnNote ) { - // don't blink unjoined sides - if( !GAMESTATE->m_bSideIsJoined[gc] ) - continue; - - FOREACH_GameButton( gb ) + FOREACH_GameController( gc ) { - bool bOn = INPUTMAPPER->IsButtonDown( GameInput(gc,gb) ); - m_LightsState.m_bGameButtonLights[gc][gb] = bOn; + FOREACH_GameButton( gb ) + { + m_LightsState.m_bGameButtonLights[gc][gb] = m_fSecsLeftInGameButtonBlink[gc][gb] > 0 ; + } + } + } + else + { + FOREACH_GameController( gc ) + { + // don't blink unjoined sides + if( !GAMESTATE->m_bSideIsJoined[gc] ) + continue; + + FOREACH_GameButton( gb ) + { + bool bOn = INPUTMAPPER->IsButtonDown( GameInput(gc,gb) ); + m_LightsState.m_bGameButtonLights[gc][gb] = bOn; + } } } } @@ -259,9 +272,14 @@ void LightsManager::Update( float fDeltaTime ) m_pDriver->Set( &m_LightsState ); } -void LightsManager::GameplayBlinkLight( CabinetLight cl ) +void LightsManager::BlinkCabinetLight( CabinetLight cl ) { - m_fSecsLeftInBlink[cl] = LIGHTS_FALLOFF_SECONDS; + m_fSecsLeftInCabinetLightBlink[cl] = LIGHTS_FALLOFF_SECONDS; +} + +void LightsManager::BlinkGameButton( GameInput gi ) +{ + m_fSecsLeftInGameButtonBlink[gi.controller][gi.button] = LIGHTS_FALLOFF_SECONDS; } void LightsManager::SetLightsMode( LightsMode lm ) diff --git a/stepmania/src/LightsManager.h b/stepmania/src/LightsManager.h index 290ac3be3b..55f4cb2269 100644 --- a/stepmania/src/LightsManager.h +++ b/stepmania/src/LightsManager.h @@ -62,13 +62,15 @@ public: void Update( float fDeltaTime ); - void GameplayBlinkLight( CabinetLight cl ); + void BlinkCabinetLight( CabinetLight cl ); + void BlinkGameButton( GameInput gi ); void SetLightsMode( LightsMode lm ); LightsMode GetLightsMode(); private: - float m_fSecsLeftInBlink[NUM_CABINET_LIGHTS]; + float m_fSecsLeftInCabinetLightBlink[NUM_CABINET_LIGHTS]; + float m_fSecsLeftInGameButtonBlink[MAX_GAME_CONTROLLERS][MAX_GAME_BUTTONS]; LightsDriver* m_pDriver; LightsMode m_LightsMode; diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index d7dcef5a18..d679223563 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -254,6 +254,7 @@ PrefsManager::PrefsManager() m_sLightsDriver = DEFAULT_LIGHTS_DRIVER; + m_bBlinkGameplayButtonLightsOnNote = false; m_bAllowUnacceleratedRenderer = false; m_bThreadedInput = true; m_bThreadedMovieDecode = true; @@ -435,6 +436,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk() ini.GetValue( "Options", "LongVerSeconds", m_fLongVerSongSeconds ); ini.GetValue( "Options", "MarathonVerSeconds", m_fMarathonVerSongSeconds ); ini.GetValue( "Options", "ShowSongOptions", (int&)m_ShowSongOptions ); + ini.GetValue( "Options", "BlinkGameplayButtonLightsOnNote", m_bBlinkGameplayButtonLightsOnNote ); ini.GetValue( "Options", "AllowUnacceleratedRenderer", m_bAllowUnacceleratedRenderer ); ini.GetValue( "Options", "ThreadedInput", m_bThreadedInput ); ini.GetValue( "Options", "ThreadedMovieDecode", m_bThreadedMovieDecode ); @@ -656,6 +658,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const ini.SetValue( "Options", "LongVerSeconds", m_fLongVerSongSeconds ); ini.SetValue( "Options", "MarathonVerSeconds", m_fMarathonVerSongSeconds ); ini.SetValue( "Options", "ShowSongOptions", m_ShowSongOptions ); + ini.SetValue( "Options", "BlinkGameplayButtonLightsOnNote", m_bBlinkGameplayButtonLightsOnNote ); ini.SetValue( "Options", "AllowUnacceleratedRenderer", m_bAllowUnacceleratedRenderer ); ini.SetValue( "Options", "ThreadedInput", m_bThreadedInput ); ini.SetValue( "Options", "ThreadedMovieDecode", m_bThreadedMovieDecode ); diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index df7cf2aba0..966f635673 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -234,6 +234,7 @@ public: int m_iSoundResampleQuality; CString m_sMovieDrivers; CString m_sLightsDriver; + bool m_bBlinkGameplayButtonLightsOnNote; bool m_bAllowUnacceleratedRenderer; bool m_bThreadedInput; bool m_bThreadedMovieDecode; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 5c27ee27ff..986b573add 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1051,7 +1051,7 @@ void ScreenGameplay::LoadNextSong() // - // Load lights data + // Load cabinet lights data // { m_CabinetLightsNoteData.Init(); @@ -1400,12 +1400,14 @@ void ScreenGameplay::Update( float fDeltaTime ) // // update lights // - bool bBlink[NUM_CABINET_LIGHTS]; - ZERO( bBlink ); + const StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef(); + bool bBlinkCabinetLight[NUM_CABINET_LIGHTS]; + bool bBlinkGameButton[MAX_GAME_CONTROLLERS][MAX_GAME_BUTTONS]; + ZERO( bBlinkCabinetLight ); + ZERO( bBlinkGameButton ); bool bCrossedABeat = false; { float fPositionSeconds = GAMESTATE->m_fMusicSeconds - LIGHTS_FALLOFF_SECONDS/2; // trigger the light a tiny bit early - fPositionSeconds += (SOUND->GetPlayLatency()) * GAMESTATE->m_SongOptions.m_fMusicRate; float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); @@ -1417,21 +1419,72 @@ void ScreenGameplay::Update( float fDeltaTime ) bCrossedABeat = fBeatLast != fBeatNow; + const int iSongRow = BeatToNoteRow( fSongBeat ); + for( int r=iRowLastCrossed+1; r<=iRowNow; r++ ) // for each index we crossed since the last update { FOREACH_CabinetLight( cl ) - bBlink[cl] |= (m_CabinetLightsNoteData.GetTapNote( cl, r ) != TAP_EMPTY); + { + bool bBlink = (m_CabinetLightsNoteData.GetTapNote( cl, r ) != TAP_EMPTY); + bBlinkCabinetLight[cl] |= bBlink; + } + FOREACH_EnabledPlayer( pn ) + { + for( int t=0; tStyleInputToGameInput( si ); + bBlinkGameButton[gi.controller][gi.button] |= bBlink; + } + } + } } iRowLastCrossed = iRowNow; } - bool bOverrideBlink = (GAMESTATE->m_fSongBeat < GAMESTATE->m_pCurSong->m_fFirstBeat) && bCrossedABeat; + { + // check for active HoldNotes + float fPositionSeconds = GAMESTATE->m_fMusicSeconds - LIGHTS_FALLOFF_SECONDS/2; // trigger the light a tiny bit early + float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); + const int iSongRow = BeatToNoteRow( fSongBeat ); + + FOREACH_EnabledPlayer( pn ) + { + // check if a hold should be active + for( int i=0; i < m_Player[pn].GetNumHoldNotes(); i++ ) // for each HoldNote + { + const HoldNote &hn = m_Player[pn].GetHoldNote(i); + if( hn.iStartRow <= iSongRow && iSongRow <= hn.iEndRow ) + { + StyleInput si( pn, hn.iTrack ); + GameInput gi = pStyleDef->StyleInputToGameInput( si ); + bBlinkGameButton[gi.controller][gi.button] |= true; + } + } + } + } + + + // send blink data + bool bOverrideCabinetBlink = (GAMESTATE->m_fSongBeat < GAMESTATE->m_pCurSong->m_fFirstBeat) && bCrossedABeat; FOREACH_CabinetLight( cl ) { - if( bOverrideBlink || bBlink[cl] ) - LIGHTSMAN->GameplayBlinkLight( cl ); + if( bOverrideCabinetBlink || bBlinkCabinetLight[cl] ) + LIGHTSMAN->BlinkCabinetLight( cl ); + } + + FOREACH_GameController( gc ) + { + FOREACH_GameButton( gb ) + { + if( bBlinkGameButton[gc][gb] ) + LIGHTSMAN->BlinkGameButton( GameInput(gc,gb) ); + } } //