From cd0e37dbeb3847a447bd162a60fbeb19e1ebbc7f Mon Sep 17 00:00:00 2001 From: Mark Cannon Date: Tue, 18 Oct 2011 17:09:11 -0400 Subject: [PATCH] changed several aspects of LightsManager: - states are zeroed at the beginning of Update(); anything not set true must be false, so don't re-zero or set false states unnecessarily - minor readability improvements, e.g. setting a CabinetLight in switch and assignint it outside of it - LightsMode_Menu variants now use song beat for lighting instead of GetTimeSinceStart - reformatted switch statements to be generally more readable - LightsMode_Demonstration now lights the pad arrows if enabled, similar to gameplay - Pressing custom gamebuttons during attract mode will light them --- Docs/Changelog_sm5.txt | 6 + src/LightsManager.cpp | 272 ++++++++++++++++++++++------------------- 2 files changed, 151 insertions(+), 127 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index ea33248842..08a4bcfece 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,12 @@ ________________________________________________________________________________ StepMania 5.0 $next | 2011xxxx -------------------------------------------------------------------------------- +2011/10/18 +---------- +* [LightsManager] Use song beat for menu button lights, allow demonstration to + flash pad lights when BlinkGameplayButtonLightsOnNote is true, light custom + game buttons when pressed during attract mode, general optimizations. [vyhd] + 2011/10/17 ---------- * [ScreenEdit/NoteField] Fix an editor crash when you exit without saving diff --git a/src/LightsManager.cpp b/src/LightsManager.cpp index 54e220bf07..0c1582571e 100644 --- a/src/LightsManager.cpp +++ b/src/LightsManager.cpp @@ -202,150 +202,162 @@ void LightsManager::Update( float fDeltaTime ) switch( m_LightsMode ) { - case LIGHTSMODE_ATTRACT: + DEFAULT_FAIL( m_LightsMode ); + + case LIGHTSMODE_ATTRACT: { int iSec = (int)RageTimer::GetTimeSinceStartFast(); int iTopIndex = iSec % 4; + + CabinetLight cl = CabinetLight_Invalid; + 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); + DEFAULT_FAIL( 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; } - 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_START_ONLY: - case LIGHTSMODE_MENU_START_AND_DIRECTIONS: - case LIGHTSMODE_JOINING: - { - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = false; + if( iTopIndex == 0 ) + { + m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = true; + m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = true; + } - static float fLastBeat; + break; + } + case LIGHTSMODE_MENU_START_ONLY: + case LIGHTSMODE_MENU_START_AND_DIRECTIONS: + case LIGHTSMODE_JOINING: + { static int iLight; - if( fracf(GAMESTATE->m_Position.m_fLightSongBeat) < fracf(fLastBeat) ) + // if we've crossed a beat boundary, advance the light index { - ++iLight; - wrap( iLight, 4 ); - } - fLastBeat = GAMESTATE->m_Position.m_fLightSongBeat; - switch( iLight ) - { - 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); + static float fLastBeat; + float fLightSongBeat = GAMESTATE->m_Position.m_fLightSongBeat; + + if( fracf(fLightSongBeat) < fracf(fLastBeat) ) + { + ++iLight; + wrap( iLight, 4 ); + } + + fLastBeat = fLightSongBeat; } - // Light the menu buttons. - switch( m_LightsMode ) + CabinetLight cl = CabinetLight_Invalid; + + switch( iLight ) { - DEFAULT_FAIL(m_LightsMode); - case LIGHTSMODE_MENU_START_ONLY: - case LIGHTSMODE_MENU_START_AND_DIRECTIONS: - { - float fSec = RageTimer::GetTimeSinceStartFast(); - float fFractionSec = fSec - truncf(fSec); - bool bOn = fFractionSec < 0.5f; - FOREACH_PlayerNumber( pn ) - { - if( GAMESTATE->m_bSideIsJoined[pn] ) - { - m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_START] = bOn; - switch( m_LightsMode ) - { - DEFAULT_FAIL(m_LightsMode); - case LIGHTSMODE_MENU_START_ONLY: - break; - case LIGHTSMODE_MENU_START_AND_DIRECTIONS: - m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_MENULEFT] = bOn; - m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_MENURIGHT] = bOn; - break; - } - } - } - } - break; - case LIGHTSMODE_JOINING: - FOREACH_PlayerNumber( pn ) - { - if( GAMESTATE->m_bSideIsJoined[pn] ) - m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_START] = true; - } - break; + DEFAULT_FAIL( iLight ); + case 0: cl = LIGHT_MARQUEE_UP_LEFT; break; + case 1: cl = LIGHT_MARQUEE_LR_RIGHT; break; + case 2: cl = LIGHT_MARQUEE_UP_RIGHT; break; + case 3: cl = LIGHT_MARQUEE_LR_LEFT; break; } + + m_LightsState.m_bCabinetLights[cl] = true; + + break; } - break; - case LIGHTSMODE_DEMONSTRATION: - case LIGHTSMODE_GAMEPLAY: - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInCabinetLightBlink[cl] > 0; - break; - case LIGHTSMODE_STAGE: - case LIGHTSMODE_ALL_CLEARED: + + case LIGHTSMODE_DEMONSTRATION: + case LIGHTSMODE_GAMEPLAY: + { + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInCabinetLightBlink[cl] > 0; + + break; + } + + case LIGHTSMODE_STAGE: + case LIGHTSMODE_ALL_CLEARED: { FOREACH_CabinetLight( cl ) m_LightsState.m_bCabinetLights[cl] = true; + + break; } - break; - case LIGHTSMODE_TEST_AUTO_CYCLE: + + case LIGHTSMODE_TEST_AUTO_CYCLE: { int iSec = GetTestAutoCycleCurrentIndex(); - FOREACH_CabinetLight( cl ) - { - bool bOn = (iSec%NUM_CabinetLight) == cl; - m_LightsState.m_bCabinetLights[cl] = bOn; - } + + CabinetLight cl = CabinetLight(iSec % NUM_CabinetLight); + m_LightsState.m_bCabinetLights[cl] = true; + + break; } - break; - case LIGHTSMODE_TEST_MANUAL_CYCLE: + + case LIGHTSMODE_TEST_MANUAL_CYCLE: { - FOREACH_CabinetLight( cl ) - { - bool bOn = cl == m_clTestManualCycleCurrent; - m_LightsState.m_bCabinetLights[cl] = bOn; - } + CabinetLight cl = m_clTestManualCycleCurrent; + m_LightsState.m_bCabinetLights[cl] = true; + + break; } - break; - default: - ASSERT(0); } // Update game controller lights switch( m_LightsMode ) { - case LIGHTSMODE_ATTRACT: - case LIGHTSMODE_DEMONSTRATION: - break; - case LIGHTSMODE_ALL_CLEARED: - case LIGHTSMODE_STAGE: - case LIGHTSMODE_JOINING: - { - FOREACH_ENUM( GameController, gc ) - { - bool bOn = GAMESTATE->m_bSideIsJoined[gc]; + DEFAULT_FAIL( m_LightsMode ); - FOREACH_ENUM( GameButton, gb ) - m_LightsState.m_bGameButtonLights[gc][gb] = bOn; - } - } - break; - case LIGHTSMODE_MENU_START_ONLY: - case LIGHTSMODE_MENU_START_AND_DIRECTIONS: - case LIGHTSMODE_GAMEPLAY: + case LIGHTSMODE_ALL_CLEARED: + case LIGHTSMODE_STAGE: + case LIGHTSMODE_JOINING: { - if( m_LightsMode == LIGHTSMODE_GAMEPLAY && g_bBlinkGameplayButtonLightsOnNote ) + FOREACH_ENUM( GameController, gc ) + { + if( GAMESTATE->m_bSideIsJoined[gc] ) + { + FOREACH_ENUM( GameButton, gb ) + m_LightsState.m_bGameButtonLights[gc][gb] = true; + } + } + + break; + } + + case LIGHTSMODE_MENU_START_ONLY: + case LIGHTSMODE_MENU_START_AND_DIRECTIONS: + { + float fLightSongBeat = GAMESTATE->m_Position.m_fLightSongBeat; + + /* Blink menu lights on the first half of the beat */ + if( fracf(fLightSongBeat) <= 0.5f ) + { + FOREACH_PlayerNumber( pn ) + { + if( !GAMESTATE->m_bSideIsJoined[pn] ) + continue; + + m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_START] = true; + + if( m_LightsMode == LIGHTSMODE_MENU_START_AND_DIRECTIONS ) + { + m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_MENULEFT] = true; + m_LightsState.m_bGameButtonLights[pn][GAME_BUTTON_MENURIGHT] = true; + break; + } + } + } + + // fall through to blink on button presses + } + + case LIGHTSMODE_DEMONSTRATION: + case LIGHTSMODE_GAMEPLAY: + { + bool bGameplay = (m_LightsMode == LIGHTSMODE_DEMONSTRATION) || (m_LightsMode == LIGHTSMODE_GAMEPLAY); + + // Blink on notes during gameplay. + if( bGameplay && g_bBlinkGameplayButtonLightsOnNote ) { - // Blink on notes. FOREACH_ENUM( GameController, gc ) { FOREACH_ENUM( GameButton, gb ) @@ -354,27 +366,31 @@ void LightsManager::Update( float fDeltaTime ) } } } - else + + // fall through to blink on button presses + } + + case LIGHTSMODE_ATTRACT: + { + // Blink on button presses. + FOREACH_ENUM( GameController, gc ) { - // Blink on button presses. - FOREACH_ENUM( GameController, gc ) + FOREACH_GameButton_Custom( gb ) { - FOREACH_GameButton_Custom( gb ) - { - bool bOn = INPUTMAPPER->IsBeingPressed( GameInput(gc,gb) ); - m_LightsState.m_bGameButtonLights[gc][gb] = bOn; - } + bool bOn = INPUTMAPPER->IsBeingPressed( GameInput(gc,gb) ); + m_LightsState.m_bGameButtonLights[gc][gb] = bOn; } } + + break; } - break; - case LIGHTSMODE_TEST_AUTO_CYCLE: + + case LIGHTSMODE_TEST_AUTO_CYCLE: { int index = GetTestAutoCycleCurrentIndex(); vector vGI; GetUsedGameInputs( vGI ); - wrap( index, vGI.size() ); ZERO( m_LightsState.m_bGameButtonLights ); @@ -382,27 +398,29 @@ void LightsManager::Update( float fDeltaTime ) GameController gc = vGI[index].controller; GameButton gb = vGI[index].button; m_LightsState.m_bGameButtonLights[gc][gb] = true; + + break; } - break; - case LIGHTSMODE_TEST_MANUAL_CYCLE: + + case LIGHTSMODE_TEST_MANUAL_CYCLE: { ZERO( m_LightsState.m_bGameButtonLights ); vector vGI; GetUsedGameInputs( vGI ); + if( m_iControllerTestManualCycleCurrent != -1 ) { GameController gc = vGI[m_iControllerTestManualCycleCurrent].controller; GameButton gb = vGI[m_iControllerTestManualCycleCurrent].button; m_LightsState.m_bGameButtonLights[gc][gb] = true; } + + break; } - break; - default: - ASSERT(0); } - // If not joined, has enough credits, and not too late to join, then + // 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_Position.m_fLightSongBeat*4);