From 575a9abf96e83e853853c5aec0d792dd5036180e Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 15 May 2004 03:00:43 +0000 Subject: [PATCH] improve planted, twister --- stepmania/src/NoteData.cpp | 14 ++++++++--- stepmania/src/NoteData.h | 4 ++- stepmania/src/NoteDataUtil.cpp | 46 +++++++++++++++++++++++----------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 3303d94827..9e8c7f8acd 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -163,6 +163,13 @@ int NoteData::GetNumTapNonEmptyTracks( int index ) const return iNum; } +void NoteData::GetTapNonEmptyTracks( int index, set& addTo ) const +{ + for( int t=0; t& viTracksOut ) +void NoteData::GetTracksHeldAtRow( int row, set& addTo ) { for( unsigned i=0; i viTracks; + static set viTracks; viTracks.clear(); GetTracksHeldAtRow( row, viTracks ); return viTracks.size(); diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 3a6318c1d7..6ac7042eb1 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -16,6 +16,7 @@ #include "NoteTypes.h" #include +#include #include "Attack.h" @@ -77,6 +78,7 @@ public: bool IsRowEmpty( int index ) const; bool IsRangeEmpty( int track, int iIndexBegin, int iIndexEnd ) const; int GetNumTapNonEmptyTracks( int index ) const; + void GetTapNonEmptyTracks( int index, set& addTo ) const; int GetFirstNonEmptyTrack( int index ) const; int GetNumTracksWithTap( int index ) const; int GetNumTracksWithTapOrHoldHead( int index ) const; @@ -91,7 +93,7 @@ public: { return GetFirstTrackWithTapOrHoldHead( index ) != -1; } - void GetTracksHeldAtRow( int row, vector& viTracksOut ); + void GetTracksHeldAtRow( int row, set& addTo ); int GetNumTracksHeldAtRow( int row ); // diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index d2686d7668..6751862928 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -381,7 +381,7 @@ void NoteDataUtil::RemoveSimultaneousNotes(NoteData &in, int iMaxSimultaneous, f if( in.IsRowEmpty(r) ) continue; // skip - vector viTracksHeld; + set viTracksHeld; in.GetTracksHeldAtRow( r, viTracksHeld ); // remove the first tap note or the first hold note that starts on this row @@ -993,7 +993,7 @@ void NoteDataUtil::Echo( NoteData &in, float fStartBeat, float fEndBeat ) const int iRowEcho = r + rows_per_interval; { - vector viTracks; + set viTracks; in.GetTracksHeldAtRow( iRowEcho, viTracks ); // don't lay if holding 2 already @@ -1024,38 +1024,54 @@ void NoteDataUtil::ConvertTapsToHolds( NoteData &in, int iSimultaneousHolds, flo const int last_row = min( BeatToNoteRow(fEndBeat), in.GetLastRow() ); for( int r=first_row; r<=last_row; r++ ) { + int iTrackAddedThisRow = 0; for( int t=0; t iSimultaneousHolds ) + break; + if( in.GetTapNote(t,r) == TAP_TAP ) { - // search for row of next TAP_TAP + // Find the ending row for this hold int iTapsLeft = iSimultaneousHolds; - int r2; - for( r2=r+1; r2<=last_row; r2++ ) + + int r2 = r+1; + for( ; r2<=last_row; r2++ ) { - if( !in.IsRowEmpty(r2) ) - { - // If there are two taps in a row on the same track, - // don't convert the earlier one to a hold. - if( in.GetFirstTrackWithTapOrHoldHead(r2) == t ) - goto dont_add_hold; - iTapsLeft--; - if( iTapsLeft == 0 ) - break; // stop searching - } + // quick test + if( in.IsRowEmpty(r2) ) + continue; + + // If there are two taps in a row on the same track, + // don't convert the earlier one to a hold. + if( in.GetTapNote(t,r2) != TAP_EMPTY ) + goto dont_add_hold; + + set tracksDown; + in.GetTracksHeldAtRow( r2, tracksDown ); + in.GetTapNonEmptyTracks( r2, tracksDown ); + iTapsLeft -= tracksDown.size(); + if( iTapsLeft == 0 ) + break; // we found the ending row for this hold + else if( iTapsLeft < 0 ) + goto dont_add_hold; } float fStartBeat = NoteRowToBeat(r); float fEndBeat = NoteRowToBeat(r2); + // If the steps end in a tap, convert that tap // to a hold that lasts for at least one beat. if( r2==r+1 ) fEndBeat = fStartBeat+1; + in.AddHoldNote( HoldNote(t,BeatToNoteRow(fStartBeat),BeatToNoteRow(fEndBeat)) ); + iTrackAddedThisRow++; } dont_add_hold: ; } } + } void NoteDataUtil::Stomp( NoteData &in, StepsType st, float fStartBeat, float fEndBeat )