smarter lights

This commit is contained in:
Chris Danford
2004-03-30 07:44:29 +00:00
parent 679afbbbb2
commit 95e11e9220
6 changed files with 120 additions and 83 deletions
+72 -56
View File
@@ -52,6 +52,9 @@ LightsManager::LightsManager(CString sDriver)
m_LightsMode = LIGHTSMODE_JOINING; m_LightsMode = LIGHTSMODE_JOINING;
m_pDriver = MakeLightsDriver(sDriver); m_pDriver = MakeLightsDriver(sDriver);
m_fSecsLeftInMarqueeBlink = 0;
m_fSecsLeftInBassBlink = 0;
} }
LightsManager::~LightsManager() LightsManager::~LightsManager()
@@ -61,29 +64,34 @@ LightsManager::~LightsManager()
void LightsManager::Update( float fDeltaTime ) void LightsManager::Update( float fDeltaTime )
{ {
m_fSecsLeftInMarqueeBlink = max( 0, m_fSecsLeftInMarqueeBlink - fDeltaTime );
m_fSecsLeftInBassBlink = max( 0, m_fSecsLeftInBassBlink - fDeltaTime );
// //
// Update cabinet lights // Update cabinet lights
// //
FOREACH_CabinetLight( cl )
m_LightsState.m_bCabinetLights[cl] = false;
switch( m_LightsMode ) switch( m_LightsMode )
{ {
case LIGHTSMODE_JOINING: 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); m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT+pn] = true;
// float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT+pn] = true;
bool bOn = (iSec%2)==0; m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = true;
for( int i=0; i<8; i++ ) m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT+pn] = true;
m_LightsState.m_bCabinetLights[i] = bOn;
} }
break; else
default:
for( int i=0; i<8; i++ )
{ {
bool bOn = GAMESTATE->m_bSideIsJoined[i%2]; m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn;
m_LightsState.m_bCabinetLights[i] = bOn;
} }
} }
} }
@@ -91,69 +99,67 @@ void LightsManager::Update( float fDeltaTime )
case LIGHTSMODE_ATTRACT: case LIGHTSMODE_ATTRACT:
{ {
int iSec = (int)RageTimer::GetTimeSinceStart(); int iSec = (int)RageTimer::GetTimeSinceStart();
int i; int iTopIndex = iSec % 4;
for( i=0; i<4; i++ ) switch( iTopIndex )
{ {
bool bOn = (iSec%4)==i; case 0: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = true; break;
m_LightsState.m_bCabinetLights[i] = bOn; case 1: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT] = true; break;
} case 2: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT] = true; break;
for( i=4; i<6; i++ ) case 3: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT] = true; break;
{ default: ASSERT(0);
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;
} }
bool bOn = (iSec%4)==0;
m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn;
m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn;
} }
break; break;
case LIGHTSMODE_MENU: case LIGHTSMODE_MENU:
{ {
int iSec = (int)RageTimer::GetTimeSinceStart(); FOREACH_CabinetLight( cl )
int i; m_LightsState.m_bCabinetLights[cl] = false;
for( i=0; i<2; i++ )
int iBeat = (int)(GAMESTATE->m_fSongBeat);
int iTopIndex = iBeat % 4;
switch( iTopIndex )
{ {
bool bOn = (iSec%2)==0; case 0: m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = true; break;
m_LightsState.m_bCabinetLights[i] = bOn; 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; if( GAMESTATE->m_bSideIsJoined[pn] )
m_LightsState.m_bCabinetLights[i] = bOn; {
} m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn;
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;
} }
} }
break; break;
case LIGHTSMODE_DEMONSTRATION: case LIGHTSMODE_DEMONSTRATION:
case LIGHTSMODE_GAMEPLAY: 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++ ) bool bOn;
m_LightsState.m_bCabinetLights[i] = bMarqueeLightsOn;
// menu lights are always off bOn = bAllMarqueeLightsOn || (m_fSecsLeftInMarqueeBlink > 0);
for( i=4; i<6; i++ ) m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = bOn;
m_LightsState.m_bCabinetLights[i] = false; 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;
// bass lights bOn = m_fSecsLeftInBassBlink > 0;
float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn;
bool bOn = fBeatPercentage < 0.1 || fBeatPercentage > 0.9; m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn;
for( i=6; i<8; i++ )
m_LightsState.m_bCabinetLights[i] = bOn;
} }
break; break;
case LIGHTSMODE_STAGE: case LIGHTSMODE_STAGE:
@@ -238,6 +244,16 @@ void LightsManager::Update( float fDeltaTime )
m_pDriver->Set( &m_LightsState ); m_pDriver->Set( &m_LightsState );
} }
void LightsManager::GameplayBlinkMarqueeLights()
{
m_fSecsLeftInMarqueeBlink = 0.1f;
}
void LightsManager::GameplayBlinkBassLights()
{
m_fSecsLeftInBassBlink = 0.1f;
}
void LightsManager::SetLightsMode( LightsMode lm ) void LightsManager::SetLightsMode( LightsMode lm )
{ {
m_LightsMode = lm; m_LightsMode = lm;
+5
View File
@@ -60,10 +60,15 @@ public:
void Update( float fDeltaTime ); void Update( float fDeltaTime );
void GameplayBlinkMarqueeLights();
void GameplayBlinkBassLights();
void SetLightsMode( LightsMode lm ); void SetLightsMode( LightsMode lm );
LightsMode GetLightsMode(); LightsMode GetLightsMode();
private: private:
float m_fSecsLeftInMarqueeBlink;
float m_fSecsLeftInBassBlink;
LightsDriver* m_pDriver; LightsDriver* m_pDriver;
LightsMode m_LightsMode; LightsMode m_LightsMode;
-3
View File
@@ -17,7 +17,6 @@
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "RageSounds.h" #include "RageSounds.h"
#include "ThemeManager.h" #include "ThemeManager.h"
#include "LightsManager.h"
#define NEXT_SCREEN THEME->GetMetric("ScreenCaution","NextScreen") #define NEXT_SCREEN THEME->GetMetric("ScreenCaution","NextScreen")
@@ -79,10 +78,8 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM )
break; break;
case SM_GoToPrevScreen: case SM_GoToPrevScreen:
SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); SCREENMAN->SetNewScreen( "ScreenTitleMenu" );
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
break; break;
case SM_GoToNextScreen: case SM_GoToNextScreen:
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
SCREENMAN->SetNewScreen( NEXT_SCREEN ); SCREENMAN->SetNewScreen( NEXT_SCREEN );
break; break;
} }
+34 -23
View File
@@ -1021,6 +1021,24 @@ void ScreenGameplay::LoadNextSong()
* so cap fDelta at 0 so m_NextSongIn will show up on screen. * so cap fDelta at 0 so m_NextSongIn will show up on screen.
* -Chris */ * -Chris */
m_bZeroDeltaOnNextUpdate = true; 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) float ScreenGameplay::StartPlayingSong(float MinTimeToNotes, float MinTimeToMusic)
@@ -1353,9 +1371,11 @@ void ScreenGameplay::Update( float fDeltaTime )
// //
// update lights // 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; fPositionSeconds += (SOUND->GetPlayLatency()) * GAMESTATE->m_SongOptions.m_fMusicRate;
float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds );
@@ -1363,35 +1383,26 @@ void ScreenGameplay::Update( float fDeltaTime )
iRowNow = max( 0, iRowNow ); iRowNow = max( 0, iRowNow );
static int iRowLastCrossed = 0; 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 r=iRowLastCrossed+1; r<=iRowNow; r++ ) // for each index we crossed since the last update
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) bBlinkMarqueeLights |= m_MarqueeLightsNoteData.IsThereATapOrHoldHeadAtRow( r );
{ bBlinkBassLights |= m_BassLightsNoteData.IsThereATapOrHoldHeadAtRow( r );
if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip
bAnyoneHasANote |= m_Player[p].IsThereATapOrHoldHeadAtRow( r );
break; // this will only play the tick for the first player that is joined
}
} }
iRowLastCrossed = iRowNow; iRowLastCrossed = iRowNow;
} }
static float s_fSecsLeftOnUpperLights = 0; bool bOverrideBlink = (GAMESTATE->m_fSongBeat < GAMESTATE->m_pCurSong->m_fFirstBeat) && bCrossedABeat;
if( bAnyoneHasANote )
{ if( bOverrideBlink || bBlinkMarqueeLights )
float fSecsPerBeat = 1.f/GAMESTATE->m_fCurBPS; LIGHTSMAN->GameplayBlinkMarqueeLights();
float fSecsToLight = fSecsPerBeat*.2f; if( bOverrideBlink || bBlinkBassLights )
s_fSecsLeftOnUpperLights = fSecsToLight; LIGHTSMAN->GameplayBlinkBassLights();
}
else
{
s_fSecsLeftOnUpperLights -= fDeltaTime;
if( s_fSecsLeftOnUpperLights < 0 )
s_fSecsLeftOnUpperLights = 0;
}
// //
// update song position meter // update song position meter
+3
View File
@@ -179,6 +179,9 @@ protected:
RageSound *m_soundMusic; RageSound *m_soundMusic;
BeginnerHelper m_BeginnerHelper; BeginnerHelper m_BeginnerHelper;
NoteData m_MarqueeLightsNoteData;
NoteData m_BassLightsNoteData;
}; };
+5
View File
@@ -28,6 +28,7 @@
#include "RageDisplay.h" #include "RageDisplay.h"
#include "UnlockSystem.h" #include "UnlockSystem.h"
#include "arch/ArchHooks/ArchHooks.h" #include "arch/ArchHooks/ArchHooks.h"
#include "LightsManager.h"
#define CHOICE_NAMES THEME->GetMetric (m_sName,"ChoiceNames") #define CHOICE_NAMES THEME->GetMetric (m_sName,"ChoiceNames")
@@ -93,6 +94,10 @@ ScreenSelect::ScreenSelect( CString sClassName ) : Screen(sClassName)
m_aCodeChoices.push_back( mc ); m_aCodeChoices.push_back( mc );
} }
} }
// devived classes can override if they want
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
} }