diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 0f0a4f8805..d22f7052f7 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -464,11 +464,49 @@ void NoteData::LoadTransformed( const NoteData* pOriginal, int iNewNumTracks, co Convert4sToHoldNotes(); } +void NoteData::LoadOverlapped( const NoteData* pOriginal, int iNewNumTracks ) +{ + SetNumTracks( pOriginal->GetNumTracks() ); + CopyRange( pOriginal, 0, pOriginal->GetLastRow(), 0 ); + + const int iOriginalTracks = pOriginal->GetNumTracks(); + const bool iUnevenTracks = (iOriginalTracks % iNewNumTracks) != 0; + const int iTracksToOverlap = iOriginalTracks / iNewNumTracks; + if( iTracksToOverlap ) + { + // if we have at least as many tracks in the old mode + // as we do in the mode we're going to + for (int ix = 0; ix < iNewNumTracks; ix++) + { + for (int iy = 0; iy < iTracksToOverlap; iy++) + { + CombineTracks(ix, (ix + iy * iNewNumTracks)); + } + } + if( iUnevenTracks ) + { + for (int ix = iOriginalTracks - iUnevenTracks; ix < iOriginalTracks; ix++) + { + // spread out the remaining tracks evenly + CombineTracks((ix * iOriginalTracks) % iNewNumTracks, ix); + } + } + } + SetNumTracks( iNewNumTracks ); +} + void NoteData::LoadTransformedSlidingWindow( const NoteData* pOriginal, int iNewNumTracks ) { // reset all notes Init(); + if( pOriginal->GetNumTracks() > iNewNumTracks ) + { + /* Use a ifferent algorithm for reducing tracks. */ + LoadOverlapped( pOriginal, iNewNumTracks ); + return; + } + NoteData Original; Original.To4s( *pOriginal ); diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 37faf76ccc..d86c8705aa 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -33,6 +33,8 @@ class NoteData /* Pad m_TapNotes so it includes the row "rows". */ void PadTapNotes(int rows); + void LoadOverlapped( const NoteData* pOriginal, int iNewNumTracks ); + public: /* Set up to hold the data in From; same number of tracks, same * divisor. Doesn't allocate or copy anything. */ diff --git a/stepmania/src/Steps.cpp b/stepmania/src/Steps.cpp index d4cfad4dc7..b28a070ee9 100644 --- a/stepmania/src/Steps.cpp +++ b/stepmania/src/Steps.cpp @@ -162,37 +162,7 @@ void Steps::Decompress() const int iNewTracks = GameManager::NotesTypeToNumTracks(m_StepsType); - if( pdata.GetNumTracks() > iNewTracks) - { - notes->SetNumTracks( pdata.GetNumTracks() ); - notes->CopyRange( &pdata, 0, pdata.GetLastRow(), 0 ); - - const int iOriginalTracks = pdata.GetNumTracks(); - const bool iUnevenTracks = (iOriginalTracks % iNewTracks) != 0; - const int iTracksToOverlap = iOriginalTracks / iNewTracks; - if( iTracksToOverlap ) - { - // if we have at least as many tracks in the old mode - // as we do in the mode we're going to - for (int ix = 0; ix < iNewTracks; ix++) - { - for (int iy = 0; iy < iTracksToOverlap; iy++) - { - notes->CombineTracks(ix, (ix + iy * iNewTracks)); - } - } - if( iUnevenTracks ) - { - for (int ix = iOriginalTracks - iUnevenTracks; ix < iOriginalTracks; ix++) - { - // spread out the remaining tracks evenly - notes->CombineTracks((ix * iOriginalTracks) % iNewTracks, ix); - } - } - } - notes->SetNumTracks( iNewTracks ); - } else - notes->LoadTransformedSlidingWindow( &pdata, iNewTracks ); + notes->LoadTransformedSlidingWindow( &pdata, iNewTracks ); NoteDataUtil::FixImpossibleRows( *notes, m_StepsType ); }