Files
itgmania212121/stepmania/src/LightsManager.cpp
T
2004-04-07 02:27:11 +00:00

282 lines
6.6 KiB
C++

#include "global.h"
/*
-----------------------------------------------------------------------------
Class: LightsManager
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "LightsManager.h"
#include "GameState.h"
#include "RageTimer.h"
#include "arch/Lights/LightsDriver.h"
#include "arch/arch.h"
#include "RageUtil.h"
#include "GameInput.h" // for GameController
#include "InputMapper.h"
#include "GameDef.h"
static const CString CabinetLightNames[NUM_CABINET_LIGHTS] = {
"MarqueeUpLeft",
"MarqueeUpRight",
"MarqueeLrLeft",
"MarqueeLrRight",
"ButtonsLeft",
"ButtonsRight",
"BassLeft",
"BassRight",
};
XToString( CabinetLight );
static const CString LightsModeNames[NUM_LIGHTS_MODES] = {
"Attract",
"Joining",
"Menu",
"Demonstration",
"Gameplay",
"Stage",
"Cleared",
"Test",
};
XToString( LightsMode );
LightsManager* LIGHTSMAN = NULL; // global and accessable from anywhere in our program
LightsManager::LightsManager(CString sDriver)
{
m_LightsMode = LIGHTSMODE_JOINING;
m_pDriver = MakeLightsDriver(sDriver);
m_fSecsLeftInMarqueeBlink = 0;
m_fSecsLeftInBassBlink = 0;
}
LightsManager::~LightsManager()
{
SAFE_DELETE( m_pDriver );
}
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:
{
// int iBeat = (int)(GAMESTATE->m_fSongBeat);
// bool bBlinkOn = (iBeat%2)==0;
FOREACH_PlayerNumber( pn )
{
if( GAMESTATE->m_bSideIsJoined[pn] )
{
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;
case LIGHTSMODE_ATTRACT:
{
int iSec = (int)RageTimer::GetTimeSinceStart();
int iTopIndex = iSec % 4;
switch( iTopIndex )
{
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:
{
FOREACH_CabinetLight( cl )
m_LightsState.m_bCabinetLights[cl] = false;
int iBeat = (int)(GAMESTATE->m_fSongBeat);
int iTopIndex = iBeat;
wrap( iTopIndex, 4 );
switch( iTopIndex )
{
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 bBlinkOn = (iBeat%2)==0;
FOREACH_PlayerNumber( pn )
{
if( GAMESTATE->m_bSideIsJoined[pn] )
{
m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn;
}
}
}
break;
case LIGHTSMODE_DEMONSTRATION:
case LIGHTSMODE_GAMEPLAY:
{
FOREACH_CabinetLight( cl )
m_LightsState.m_bCabinetLights[cl] = false;
bool bAllMarqueeLightsOn = !GAMESTATE->m_bPastHereWeGo;
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;
bOn = m_fSecsLeftInBassBlink > 0;
m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn;
m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn;
}
break;
case LIGHTSMODE_STAGE:
case LIGHTSMODE_ALL_CLEARED:
{
FOREACH_CabinetLight( cl )
m_LightsState.m_bCabinetLights[cl] = true;
}
break;
case LIGHTSMODE_TEST:
{
int iSec = (int)RageTimer::GetTimeSinceStart();
FOREACH_CabinetLight( cl )
{
bool bOn = (iSec%NUM_CABINET_LIGHTS) == cl;
m_LightsState.m_bCabinetLights[cl] = bOn;
}
}
break;
default:
ASSERT(0);
}
// If not joined, has enough credits, and not too late to join, then
// blink the menu buttons rapidly so they'll press Start
{
int iBeat = (int)(GAMESTATE->m_fSongBeat*4);
bool bBlinkOn = (iBeat%2)==0;
FOREACH_PlayerNumber( pn )
{
if( !GAMESTATE->m_bSideIsJoined[pn] && GAMESTATE->PlayersCanJoin() && GAMESTATE->EnoughCreditsToJoin() )
{
m_LightsState.m_bCabinetLights[LIGHT_BUTTONS_LEFT+pn] = bBlinkOn;
}
}
}
//
// Update game controller lights
//
// FIXME: Works only with Game==dance
// FIXME: lights pads for players who aren't playing
switch( m_LightsMode )
{
case LIGHTSMODE_ATTRACT:
case LIGHTSMODE_MENU:
case LIGHTSMODE_DEMONSTRATION:
{
ZERO( m_LightsState.m_bGameButtonLights );
}
break;
case LIGHTSMODE_ALL_CLEARED:
case LIGHTSMODE_STAGE:
case LIGHTSMODE_JOINING:
{
FOREACH_GameController( gc )
{
bool bOn = GAMESTATE->m_bSideIsJoined[gc];
FOREACH_GameButton( gb )
m_LightsState.m_bGameButtonLights[gc][gb] = bOn;
}
}
break;
case LIGHTSMODE_GAMEPLAY:
{
FOREACH_GameController( gc )
{
FOREACH_GameButton( gb )
{
bool bOn = INPUTMAPPER->IsButtonDown( GameInput(gc,gb) );
m_LightsState.m_bGameButtonLights[gc][gb] = bOn;
}
}
}
break;
case LIGHTSMODE_TEST:
{
int iSec = (int)RageTimer::GetTimeSinceStart();
int iNumGameButtonsToShow = GAMESTATE->GetCurrentGameDef()->GetNumGameplayButtons();
FOREACH_GameController( gc )
{
FOREACH_GameButton( gb )
{
bool bOn = gb==(iSec%iNumGameButtonsToShow);
m_LightsState.m_bGameButtonLights[gc][gb] = bOn;
}
}
}
break;
default:
ASSERT(0);
}
// apply new light values we set above
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;
}
LightsMode LightsManager::GetLightsMode()
{
return m_LightsMode;
}