From e986f1579260ab3a39ec636309dc7e797d90669b Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Fri, 7 Nov 2003 09:27:28 +0000 Subject: [PATCH] fix echo adds taps under hold notes --- stepmania/src/NoteData.cpp | 16 +++++++++++----- stepmania/src/NoteData.h | 30 ++++++++++++++++++++++++++---- stepmania/src/NoteDataUtil.cpp | 25 +++++++++++++++++-------- stepmania/src/NoteTypes.h | 2 +- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 9a42ff24aa..1b8949030d 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -598,17 +598,23 @@ void NoteData::EliminateAllButOneTap(int row) } } -int NoteData::GetNumTracksHeldAtRow( int row ) +void NoteData::GetTracksHeldAtRow( int row, vector& viTracksOut ) { - // Optimization opportunity: - // Search more efficiently knowing that m_HoldNotes is sorted. int iNumTracksHeld = 0; float fBeat = NoteRowToBeat(row); for( unsigned i=0; i= hn.fStartBeat && fBeat <= hn.fEndBeat ) - iNumTracksHeld++; + viTracksOut.push_back( hn.iTrack ); } - return iNumTracksHeld; +} + +int NoteData::GetNumTracksHeldAtRow( int row ) +{ + static vector viTracks; + viTracks.clear(); + GetTracksHeldAtRow( row, viTracks ); + return viTracks.size(); } \ No newline at end of file diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index e9f264d347..1dde200226 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -16,10 +16,6 @@ #include "NoteTypes.h" -// '1' = tap note -// '2' = hold note begin -// '3' = hold note end ('1' can also end a HoldNote) ('3' without a matching '2' is ignored -// ... for future expansion class NoteData { @@ -84,6 +80,17 @@ public: return -1; } inline int GetNumTracksWithTap( int index ) const + { + int iNum = 0; + for( int t=0; t& viTracksOut ); int GetNumTracksHeldAtRow( int row ); // used in edit/record diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 009405f72a..08a41050a5 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -726,24 +726,33 @@ void NoteDataUtil::Echo( NoteData &in, float fStartBeat, float fEndBeat ) { iEchoTrack = iFirstTapInRow; } + if( iEchoTrack==-1 ) + continue; // don't lay // don't insert a new note if there's already a tap within this interval bool bTapInMiddle = false; for( int r2=iRowWindowBegin+1; r2<=iRowWindowEnd-1; r2++ ) - if( in.IsThereATapAtRow(r2) ) + if( in.IsThereATapOrHoldHeadAtRow(r2) ) { bTapInMiddle = true; break; } if( bTapInMiddle ) - continue; + continue; // don't lay - if( iEchoTrack==-1 ) - continue; - int iNumTracksHeld = in.GetNumTracksHeldAtRow(iRowEcho); - if( iNumTracksHeld >= 2 ) - continue; + { + vector viTracks; + in.GetTracksHeldAtRow( iRowEcho, viTracks ); + + // don't lay if holding 2 already + if( viTracks.size() >= 2 ) + continue; // don't lay + + // don't lay echos on top of a HoldNote + if( find(viTracks.begin(),viTracks.end(),iEchoTrack) != viTracks.end() ) + continue; // don't lay + } in.SetTapNote( iEchoTrack, iRowEcho, TAP_ADDITION ); } @@ -776,7 +785,7 @@ void NoteDataUtil::ConvertTapsToHolds( NoteData &in, int iSimultaneousHolds, flo { // If there are two taps in a row on the same track, // don't convert the earlier one to a hold. - if( in.GetFirstTrackWithTap(r2) == t ) + if( in.GetFirstTrackWithTapOrHoldHead(r2) == t ) goto dont_add_hold; iTapsLeft--; if( iTapsLeft == 0 ) diff --git a/stepmania/src/NoteTypes.h b/stepmania/src/NoteTypes.h index 2fec64e94b..285af41e55 100644 --- a/stepmania/src/NoteTypes.h +++ b/stepmania/src/NoteTypes.h @@ -23,7 +23,7 @@ typedef unsigned char TapNote; static const TapNote TAP_EMPTY = '0'; static const TapNote TAP_TAP = '1'; /* impatient? */ -static const TapNote TAP_HOLD_HEAD = '2'; +static const TapNote TAP_HOLD_HEAD = '2'; // graded liuke a TA_TAP /* In 2sand3s mode, holds are deleted and TAP_HOLD_END is added: */ static const TapNote TAP_HOLD_TAIL = '3';