From 0279fd908f1da898f889df8e642ae4f44e884cde Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Mon, 26 Jun 2006 10:57:10 +0000 Subject: [PATCH] CombineCompositeNoteData(). This will not let you place a note inside a hold note that already exists. Use this when loading from a string as well. --- stepmania/src/NoteDataUtil.cpp | 35 ++++++++++++++++++++++++++++++---- stepmania/src/NoteDataUtil.h | 7 +++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 604a8deeea..00813e874f 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -1,5 +1,6 @@ #include "global.h" #include "NoteDataUtil.h" +#include "NoteData.h" #include "RageUtil.h" #include "RageLog.h" #include "PlayerOptions.h" @@ -90,7 +91,6 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS for( unsigned l=0; l vParts; FOREACH_PlayerNumber( pn ) { // Split in place. split( sSMNoteData, "&", start, size, false ); if( unsigned(start) == sSMNoteData.size() ) break; - LoadFromSMNoteDataStringWithPlayer( out, sSMNoteData, start, size, pn, iNumTracks ); + vParts.push_back( NoteData() ); + NoteData &nd = vParts.back(); + + nd.SetNumTracks( iNumTracks ); + LoadFromSMNoteDataStringWithPlayer( nd, sSMNoteData, start, size, pn, iNumTracks ); } + CombineCompositeNoteData( out, vParts ); } void NoteDataUtil::InsertHoldTails( NoteData &inout ) @@ -418,6 +423,28 @@ void NoteDataUtil::SplitCompositeNoteData( const NoteData &in, vector } } +void NoteDataUtil::CombineCompositeNoteData( NoteData &out, const vector &in ) +{ + FOREACH_CONST( NoteData, in, nd ) + { + const int iMaxTracks = min( out.GetNumTracks(), nd->GetNumTracks() ); + + for( int track = 0; track < iMaxTracks; ++track ) + { + for( NoteData::const_iterator i = nd->begin(track); i != nd->end(track); ++i ) + { + int row = i->first; + if( out.IsHoldNoteAtRow(track, i->first) ) + continue; + if( i->second.type == TapNote::hold_head ) + out.AddHoldNote( track, row, row + i->second.iDuration, i->second ); + else + out.SetTapNote( track, row, i->second ); + } + } + } +} + void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &out, int iNewNumTracks ) { diff --git a/stepmania/src/NoteDataUtil.h b/stepmania/src/NoteDataUtil.h index 48c134d7b4..5964dbde2b 100644 --- a/stepmania/src/NoteDataUtil.h +++ b/stepmania/src/NoteDataUtil.h @@ -3,12 +3,14 @@ #ifndef NOTEDATAUTIL_H #define NOTEDATAUTIL_H -#include "GameConstantsAndTypes.h" // for RadarCategory +#include "GameConstantsAndTypes.h" #include "NoteTypes.h" -#include "NoteData.h" class PlayerOptions; struct RadarValues; +class NoteData; +class Song; +struct AttackArray; /* Utils for NoteData. Things should go in here if they can be (cleanly and * efficiently) implemented using only NoteData's primitives; this improves @@ -20,6 +22,7 @@ namespace NoteDataUtil void LoadFromSMNoteDataString( NoteData &out, const RString &sSMNoteData, bool bComposite ); void GetSMNoteDataString( const NoteData &in, RString ¬es_out ); void SplitCompositeNoteData( const NoteData &in, vector &out ); + void CombineCompositeNoteData( NoteData &out, const vector &in ); 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 );