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
+73 -57
View File
@@ -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;
+5
View File
@@ -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;
-3
View File
@@ -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;
}
+34 -23
View File
@@ -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; p<NUM_PLAYERS; p++ )
{
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
}
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
+3
View File
@@ -179,6 +179,9 @@ protected:
RageSound *m_soundMusic;
BeginnerHelper m_BeginnerHelper;
NoteData m_MarqueeLightsNoteData;
NoteData m_BassLightsNoteData;
};
+5
View File
@@ -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 );
}