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