diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index 6db227ab7b..3502757be1 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -150,20 +150,8 @@ void LightsManager::Update( float fDeltaTime ) break; case LIGHTSMODE_DEMONSTRATION: case LIGHTSMODE_GAMEPLAY: - { - - if (PREFSMAN->m_bLightsOrOutput) - { - bool bOn=false; - FOREACH_CabinetLight( cl ) - bOn = (m_fSecsLeftInCabinetLightBlink[cl] > 0) || bOn; - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = bOn; - } - else - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInCabinetLightBlink[cl] > 0 ; - } + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInCabinetLightBlink[cl] > 0; break; case LIGHTSMODE_STAGE: case LIGHTSMODE_ALL_CLEARED: diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 6751862928..5b01578baa 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -263,6 +263,41 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in_, CString ¬es_out, } } +void NoteDataUtil::LoadTransformedLights( const NoteData &in, NoteData &out, int iNewNumTracks ) +{ + // reset all notes + out.Init(); + + NoteData Original; + Original.To4s( in ); + + out.Config(in); + out.SetNumTracks( iNewNumTracks ); + + for( int r=0; r < Original.GetMaxRow(); ++r ) + { + if( Original.IsRowEmpty( r ) ) + continue; + + /* Enable every track in the output. If there are any hold notes in the source + * on this row, output hold notes; otherwise tap notes. This is to 1: prevent + * converting everything to hold notes, and 2: so if it's written to an SM, we + * don't write huge streams of tap notes. */ + bool bHoldNoteOnThisRow = false; + for( int t=0; tm_pCurSong ); - vector vSteps; - StepsType lightsSteps = STEPS_TYPE_LIGHTS_CABINET; - - lightsSteps = GAMEMAN->StringToNotesType(PREFSMAN->m_sLightsStepsType); - - GAMESTATE->m_pCurSong->GetSteps( vSteps, lightsSteps ); + Steps *pSteps = GAMESTATE->m_pCurSong->GetClosestNotes( STEPS_TYPE_LIGHTS_CABINET, StringToDifficulty(PREFSMAN->m_sLightsStepsDifficulty) ); + if( pSteps != NULL ) + pSteps->GetNoteData( &m_CabinetLightsNoteData ); - if( !vSteps.empty() ) - vSteps[0]->GetNoteData( &m_CabinetLightsNoteData ); - - for (i=0;im_sLightsStepsDifficulty); - Difficulty DC2 = vSteps[i]->GetDifficulty(); - if (DC == DC2) - vSteps[i]->GetNoteData( &m_CabinetLightsNoteData ); - } - // Convert to 4s so that we can check if we're inside a hold with just // GetTapNote(). m_CabinetLightsNoteData.ConvertHoldNotesTo4s(); diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 4e696ad4c9..4b9b7f48e7 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -873,7 +873,8 @@ void Song::ReCalculateRadarValuesAndLastBeat() void Song::GetSteps( vector& arrayAddTo, StepsType nt, Difficulty dc, int iMeterLow, int iMeterHigh, const CString &sDescription, bool bIncludeAutoGen, int Max ) const { - if( !PREFSMAN->m_bAutogenSteps ) + /* Ignore m_bAutogenSteps for STEPS_TYPE_LIGHTS_CABINET. */ + if( nt != STEPS_TYPE_LIGHTS_CABINET && !PREFSMAN->m_bAutogenSteps ) bIncludeAutoGen = false; for( unsigned i=0; iLoadTransformedSlidingWindow( &pdata, iNewTracks ); + if( this->m_StepsType == STEPS_TYPE_LIGHTS_CABINET ) + { + NoteDataUtil::LoadTransformedLights( pdata, *notes, iNewTracks ); + } else { + notes->LoadTransformedSlidingWindow( &pdata, iNewTracks ); - NoteDataUtil::FixImpossibleRows( *notes, m_StepsType ); + NoteDataUtil::FixImpossibleRows( *notes, m_StepsType ); + } } else if(!notes_comp) {