From 95e11e9220d273a2a1b031aaa60a8857d0cb71db Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 30 Mar 2004 07:44:29 +0000 Subject: [PATCH] smarter lights --- stepmania/src/LightsManager.cpp | 130 +++++++++++++++++-------------- stepmania/src/LightsManager.h | 5 ++ stepmania/src/ScreenCaution.cpp | 3 - stepmania/src/ScreenGameplay.cpp | 57 ++++++++------ stepmania/src/ScreenGameplay.h | 3 + stepmania/src/ScreenSelect.cpp | 5 ++ 6 files changed, 120 insertions(+), 83 deletions(-) diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index 7386743071..c748a24e07 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -52,6 +52,9 @@ LightsManager::LightsManager(CString sDriver) m_LightsMode = LIGHTSMODE_JOINING; m_pDriver = MakeLightsDriver(sDriver); + + m_fSecsLeftInMarqueeBlink = 0; + m_fSecsLeftInBassBlink = 0; } LightsManager::~LightsManager() @@ -61,29 +64,34 @@ LightsManager::~LightsManager() void LightsManager::Update( float fDeltaTime ) { + m_fSecsLeftInMarqueeBlink = max( 0, m_fSecsLeftInMarqueeBlink - fDeltaTime ); + m_fSecsLeftInBassBlink = max( 0, m_fSecsLeftInBassBlink - fDeltaTime ); + // // Update cabinet lights // + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = false; + switch( m_LightsMode ) { case LIGHTSMODE_JOINING: { - switch( GAMESTATE->GetNumSidesJoined() ) + int iSec = (int)(RageTimer::GetTimeSinceStart()*4); + bool bBlinkOn = (iSec%2)==0; + + FOREACH_PlayerNumber( pn ) { - case 0: + if( GAMESTATE->m_bSideIsJoined[pn] ) { - int iSec = (int)(RageTimer::GetTimeSinceStart()*2); -// float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; - bool bOn = (iSec%2)==0; - for( int i=0; i<8; i++ ) - m_LightsState.m_bCabinetLights[i] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT+pn] = true; + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT+pn] = true; + m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = true; + m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT+pn] = true; } - break; - default: - for( int i=0; i<8; i++ ) + else { - bool bOn = GAMESTATE->m_bSideIsJoined[i%2]; - m_LightsState.m_bCabinetLights[i] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn; } } } @@ -91,69 +99,67 @@ void LightsManager::Update( float fDeltaTime ) case LIGHTSMODE_ATTRACT: { int iSec = (int)RageTimer::GetTimeSinceStart(); - int i; - for( i=0; i<4; i++ ) + int iTopIndex = iSec % 4; + switch( iTopIndex ) { - bool bOn = (iSec%4)==i; - m_LightsState.m_bCabinetLights[i] = bOn; - } - for( i=4; i<6; i++ ) - { - bool bOn = false; - m_LightsState.m_bCabinetLights[i] = bOn; - } - for( i=6; i<8; i++ ) - { - bool bOn = (iSec%3)==0; - m_LightsState.m_bCabinetLights[i] = bOn; + case 0: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = true; break; + case 1: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT] = true; break; + case 2: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT] = true; break; + case 3: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT] = true; break; + default: ASSERT(0); } + + bool bOn = (iSec%4)==0; + m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn; } break; case LIGHTSMODE_MENU: { - int iSec = (int)RageTimer::GetTimeSinceStart(); - int i; - for( i=0; i<2; i++ ) + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = false; + + int iBeat = (int)(GAMESTATE->m_fSongBeat); + int iTopIndex = iBeat % 4; + switch( iTopIndex ) { - bool bOn = (iSec%2)==0; - m_LightsState.m_bCabinetLights[i] = bOn; + case 0: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = true; break; + case 1: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT] = true; break; + case 2: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT] = true; break; + case 3: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT] = true; break; + default: ASSERT(0); } - for( i=2; i<4; i++ ) + + bool bBlinkOn = (iBeat%2)==0; + + FOREACH_PlayerNumber( pn ) { - bool bOn = (iSec%2)==1; - m_LightsState.m_bCabinetLights[i] = bOn; - } - for( i=4; i<6; i++ ) - { - bool bOn = (iSec%2)==0; - m_LightsState.m_bCabinetLights[i] = bOn; - } - for( i=6; i<8; i++ ) - { - bool bOn = (iSec%2)==1; - m_LightsState.m_bCabinetLights[i] = bOn; + if( GAMESTATE->m_bSideIsJoined[pn] ) + { + m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn; + } } } break; case LIGHTSMODE_DEMONSTRATION: case LIGHTSMODE_GAMEPLAY: { - int i; + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = false; - bool bMarqueeLightsOn = GAMESTATE->m_bPastHereWeGo; + bool bAllMarqueeLightsOn = !GAMESTATE->m_bPastHereWeGo; - for( i=0; i<4; i++ ) - m_LightsState.m_bCabinetLights[i] = bMarqueeLightsOn; + bool bOn; + + bOn = bAllMarqueeLightsOn || (m_fSecsLeftInMarqueeBlink > 0); + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT] = bOn; - // menu lights are always off - for( i=4; i<6; i++ ) - m_LightsState.m_bCabinetLights[i] = false; - - // bass lights - float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; - bool bOn = fBeatPercentage < 0.1 || fBeatPercentage > 0.9; - for( i=6; i<8; i++ ) - m_LightsState.m_bCabinetLights[i] = bOn; + bOn = m_fSecsLeftInBassBlink > 0; + m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn; + m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn; } break; case LIGHTSMODE_STAGE: @@ -238,6 +244,16 @@ void LightsManager::Update( float fDeltaTime ) m_pDriver->Set( &m_LightsState ); } +void LightsManager::GameplayBlinkMarqueeLights() +{ + m_fSecsLeftInMarqueeBlink = 0.1f; +} + +void LightsManager::GameplayBlinkBassLights() +{ + m_fSecsLeftInBassBlink = 0.1f; +} + void LightsManager::SetLightsMode( LightsMode lm ) { m_LightsMode = lm; diff --git a/stepmania/src/LightsManager.h b/stepmania/src/LightsManager.h index 40452e7462..d07c4e0aac 100644 --- a/stepmania/src/LightsManager.h +++ b/stepmania/src/LightsManager.h @@ -60,10 +60,15 @@ public: void Update( float fDeltaTime ); + void GameplayBlinkMarqueeLights(); + void GameplayBlinkBassLights(); + void SetLightsMode( LightsMode lm ); LightsMode GetLightsMode(); private: + float m_fSecsLeftInMarqueeBlink; + float m_fSecsLeftInBassBlink; LightsDriver* m_pDriver; LightsMode m_LightsMode; diff --git a/stepmania/src/ScreenCaution.cpp b/stepmania/src/ScreenCaution.cpp index 9df7f0f733..8de20e6e01 100644 --- a/stepmania/src/ScreenCaution.cpp +++ b/stepmania/src/ScreenCaution.cpp @@ -17,7 +17,6 @@ #include "AnnouncerManager.h" #include "RageSounds.h" #include "ThemeManager.h" -#include "LightsManager.h" #define NEXT_SCREEN THEME->GetMetric("ScreenCaution","NextScreen") @@ -79,10 +78,8 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM ) break; case SM_GoToPrevScreen: SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); - LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); break; case SM_GoToNextScreen: - LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; } diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index d086a17ac3..a64b202b40 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1021,6 +1021,24 @@ void ScreenGameplay::LoadNextSong() * so cap fDelta at 0 so m_NextSongIn will show up on screen. * -Chris */ m_bZeroDeltaOnNextUpdate = true; + + + // + // Load lights data + // + m_MarqueeLightsNoteData.Init(); + m_BassLightsNoteData.Init(); + StepsType st = GAMESTATE->GetCurrentStyleDef()->m_StepsType; + Steps* pStepsEasy = GAMESTATE->m_pCurSong->GetStepsByDifficulty( st, DIFFICULTY_EASY, false ); + Steps* pStepsMedium = GAMESTATE->m_pCurSong->GetStepsByDifficulty( st, DIFFICULTY_MEDIUM, false ); + if( pStepsEasy ) pStepsEasy->GetNoteData( &m_BassLightsNoteData ); + if( pStepsMedium ) pStepsMedium->GetNoteData( &m_MarqueeLightsNoteData ); + + // optimization: collapse to one and free unused tracks + NoteDataUtil::CollapseToOne(m_BassLightsNoteData); + m_BassLightsNoteData.SetNumTracks(1); + NoteDataUtil::CollapseToOne(m_MarqueeLightsNoteData); + m_MarqueeLightsNoteData.SetNumTracks(1); } float ScreenGameplay::StartPlayingSong(float MinTimeToNotes, float MinTimeToMusic) @@ -1353,9 +1371,11 @@ void ScreenGameplay::Update( float fDeltaTime ) // // update lights // - bool bAnyoneHasANote = false; // set this to true if any player has a note at one of the indices we crossed + bool bBlinkMarqueeLights = false; + bool bBlinkBassLights = false; + bool bCrossedABeat = false; { - float fPositionSeconds = GAMESTATE->m_fMusicSeconds; + float fPositionSeconds = GAMESTATE->m_fMusicSeconds - 0.05f; // trigger the light a tiny bit early fPositionSeconds += (SOUND->GetPlayLatency()) * GAMESTATE->m_SongOptions.m_fMusicRate; float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); @@ -1363,35 +1383,26 @@ void ScreenGameplay::Update( float fDeltaTime ) iRowNow = max( 0, iRowNow ); static int iRowLastCrossed = 0; + float fBeatLast = roundf(NoteRowToBeat(iRowLastCrossed)); + float fBeatNow = roundf(NoteRowToBeat(iRowNow)); + + bCrossedABeat = fBeatLast != fBeatNow; for( int r=iRowLastCrossed+1; r<=iRowNow; r++ ) // for each index we crossed since the last update { - for( int p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) - continue; // skip - - bAnyoneHasANote |= m_Player[p].IsThereATapOrHoldHeadAtRow( r ); - break; // this will only play the tick for the first player that is joined - } + bBlinkMarqueeLights |= m_MarqueeLightsNoteData.IsThereATapOrHoldHeadAtRow( r ); + bBlinkBassLights |= m_BassLightsNoteData.IsThereATapOrHoldHeadAtRow( r ); } iRowLastCrossed = iRowNow; } - static float s_fSecsLeftOnUpperLights = 0; - if( bAnyoneHasANote ) - { - float fSecsPerBeat = 1.f/GAMESTATE->m_fCurBPS; - float fSecsToLight = fSecsPerBeat*.2f; - s_fSecsLeftOnUpperLights = fSecsToLight; - } - else - { - s_fSecsLeftOnUpperLights -= fDeltaTime; - if( s_fSecsLeftOnUpperLights < 0 ) - s_fSecsLeftOnUpperLights = 0; - } + bool bOverrideBlink = (GAMESTATE->m_fSongBeat < GAMESTATE->m_pCurSong->m_fFirstBeat) && bCrossedABeat; + + if( bOverrideBlink || bBlinkMarqueeLights ) + LIGHTSMAN->GameplayBlinkMarqueeLights(); + if( bOverrideBlink || bBlinkBassLights ) + LIGHTSMAN->GameplayBlinkBassLights(); // // update song position meter diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index f202830d36..632cea07a5 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -179,6 +179,9 @@ protected: RageSound *m_soundMusic; BeginnerHelper m_BeginnerHelper; + + NoteData m_MarqueeLightsNoteData; + NoteData m_BassLightsNoteData; }; diff --git a/stepmania/src/ScreenSelect.cpp b/stepmania/src/ScreenSelect.cpp index 95f8d64af5..4efbdb342a 100644 --- a/stepmania/src/ScreenSelect.cpp +++ b/stepmania/src/ScreenSelect.cpp @@ -28,6 +28,7 @@ #include "RageDisplay.h" #include "UnlockSystem.h" #include "arch/ArchHooks/ArchHooks.h" +#include "LightsManager.h" #define CHOICE_NAMES THEME->GetMetric (m_sName,"ChoiceNames") @@ -93,6 +94,10 @@ ScreenSelect::ScreenSelect( CString sClassName ) : Screen(sClassName) m_aCodeChoices.push_back( mc ); } } + + + // devived classes can override if they want + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); }