From 96e3f211b86a1733f15a1c865218872c2e7d4d61 Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Tue, 20 Jun 2006 14:32:09 +0000 Subject: [PATCH] Split the given composite NoteData into it's constituent parts. If the given NoteData is not composite, just copy it. --- stepmania/src/NoteDataUtil.cpp | 46 +++++++++++++++++++++++++++++++++- stepmania/src/NoteDataUtil.h | 1 + 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 6bc9b11dca..9f5f25aa2f 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -263,10 +263,28 @@ void NoteDataUtil::LoadFromSMNoteDataString( NoteData &out, const RString &sSMNo /* Clear notes, but keep the same number of tracks. */ int iNumTracks = out.GetNumTracks(); + bool bComposite = out.IsComposite(); out.Init(); out.SetNumTracks( iNumTracks ); + out.SetComposite( bComposite ); - LoadFromSMNoteDataStringWithPlayer( out, sSMNoteData, 0, sSMNoteData.size(), PLAYER_INVALID, iNumTracks ); + if( !bComposite ) + { + LoadFromSMNoteDataStringWithPlayer( out, sSMNoteData, 0, sSMNoteData.size(), + PLAYER_INVALID, iNumTracks ); + return; + } + + int start = 0, size = -1; + + FOREACH_PlayerNumber( pn ) + { + // Split in place. + split( sSMNoteData, "&", start, size, false ); + if( unsigned(start) == sSMNoteData.size() ) + break; + LoadFromSMNoteDataStringWithPlayer( out, sSMNoteData, start, size, pn, iNumTracks ); + } } void NoteDataUtil::InsertHoldTails( NoteData &inout ) @@ -369,6 +387,32 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in_, RString ¬es_out } } +void NoteDataUtil::SplitCompositeNoteData( const NoteData &in, vector &out ) +{ + if( !in.IsComposite() ) + { + out.push_back( in ); + return; + } + + for( int t = 0; t < in.GetNumTracks(); ++t ) + { + for( NoteData::const_iterator iter = in.begin(t); iter != in.end(t); ++iter ) + { + int row = iter->first; + TapNote tn = iter->second; + unsigned index = int( tn.pn ); + + DEBUG_ASSERT( index < NUM_PlayerNumber ); + if( out.size() <= index ) + out.resize( index + 1 ); + tn.pn = PLAYER_INVALID; + out[index].SetTapNote( t, row, tn ); + } + } +} + + void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &out, int iNewNumTracks ) { // reset all notes diff --git a/stepmania/src/NoteDataUtil.h b/stepmania/src/NoteDataUtil.h index c75eb9ada0..1e43bba7fe 100644 --- a/stepmania/src/NoteDataUtil.h +++ b/stepmania/src/NoteDataUtil.h @@ -19,6 +19,7 @@ namespace NoteDataUtil NoteType GetSmallestNoteTypeForMeasure( const NoteData &n, int iMeasureIndex ); void LoadFromSMNoteDataString( NoteData &out, const RString &sSMNoteData ); void GetSMNoteDataString( const NoteData &in, RString ¬es_out ); + void SplitCompositeNoteData( const NoteData &in, vector &out ); void LoadTransformedSlidingWindow( const NoteData &in, NoteData &out, int iNewNumTracks ); void LoadOverlapped( const NoteData &in, NoteData &out, int iNewNumTracks ); void LoadTransformedLights( const NoteData &in, NoteData &out, int iNewNumTracks );