smarter lights
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -179,6 +179,9 @@ protected:
|
||||
RageSound *m_soundMusic;
|
||||
|
||||
BeginnerHelper m_BeginnerHelper;
|
||||
|
||||
NoteData m_MarqueeLightsNoteData;
|
||||
NoteData m_BassLightsNoteData;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user