diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index e1d4418f93..5a3f4523ae 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -1014,21 +1014,6 @@ NoteData::_all_tracks_iterator::_all_tracks_iterator( const _all_t { } -template -NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator=( const _all_tracks_iterator &other ) -{ -#define COPY_OTHER( x ) x = other.x - COPY_OTHER( m_pNoteData ); - COPY_OTHER( m_iTrack ); - COPY_OTHER( m_bReverse ); - COPY_OTHER( m_Cond ); - COPY_OTHER( m_vBeginIters ); - COPY_OTHER( m_vEndIters ); - COPY_OTHER( m_vCurrentIters ); -#undef COPY_OTHER - return *this; -} - template NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator++() // preincrement { diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 9b58b68e02..5524279cd6 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -64,7 +64,6 @@ public: public: _all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, IteratorCond cond, bool bInclusive ); _all_tracks_iterator( const _all_tracks_iterator &other ); - _all_tracks_iterator &operator=( const _all_tracks_iterator &other ); _all_tracks_iterator &operator++(); // preincrement _all_tracks_iterator operator++( int dummy ); // postincrement //_all_tracks_iterator &operator--(); // predecrement diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index be6ec60617..af478f3d06 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -157,8 +157,8 @@ Player::Player( NoteData &nd, bool bVisibleParts ) : m_NoteData(nd) m_pPrimaryScoreKeeper = NULL; m_pSecondaryScoreKeeper = NULL; m_pInventory = NULL; - m_pIterNotJudged = NULL; - m_pIterCurrentOrUpcoming = NULL; + m_pIterNeedsTapJudging = NULL; + m_pIterNeedsHoldJudging = NULL; m_pIterUncrossedRows = NULL; m_pIterUnjudgedRows = NULL; m_pIterUnjudgedMineRows = NULL; @@ -190,8 +190,8 @@ Player::~Player() for( unsigned i = 0; i < m_vpHoldJudgment.size(); ++i ) SAFE_DELETE( m_vpHoldJudgment[i] ); SAFE_DELETE( m_pJudgedRows ); - SAFE_DELETE( m_pIterNotJudged ); - SAFE_DELETE( m_pIterCurrentOrUpcoming ); + SAFE_DELETE( m_pIterNeedsTapJudging ); + SAFE_DELETE( m_pIterNeedsHoldJudging ); SAFE_DELETE( m_pIterUncrossedRows ); SAFE_DELETE( m_pIterUnjudgedRows ); SAFE_DELETE( m_pIterUnjudgedMineRows ); @@ -381,19 +381,42 @@ void Player::Init( *b = false; } -static bool NotJudged( const TapNote &tn ) +static bool NeedsTapJudging( const TapNote &tn ) { - if( tn.result.tns != TNS_None ) - return false; switch( tn.type ) { + DEFAULT_FAIL( tn.type ); case TapNote::tap: case TapNote::hold_head: case TapNote::mine: case TapNote::lift: - return true; + if( tn.result.tns == TNS_None ) + return true; + else + return false; + case TapNote::hold_tail: + case TapNote::attack: + return false; + } +} + +static bool NeedsHoldJudging( const TapNote &tn ) +{ + switch( tn.type ) + { + DEFAULT_FAIL( tn.type ); + case TapNote::hold_head: + if( tn.HoldResult.hns == HNS_None ) + return true; + else + return false; + case TapNote::tap: + case TapNote::hold_tail: + case TapNote::mine: + case TapNote::lift: + case TapNote::attack: + return false; } - return false; } void Player::Load() @@ -516,11 +539,11 @@ void Player::Load() if( m_pPlayerStageStats ) SendComboMessages( m_pPlayerStageStats->m_iCurCombo, m_pPlayerStageStats->m_iCurMissCombo ); - SAFE_DELETE( m_pIterNotJudged ); - m_pIterNotJudged = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW, NotJudged) ); + SAFE_DELETE( m_pIterNeedsTapJudging ); + m_pIterNeedsTapJudging = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW) ); - SAFE_DELETE( m_pIterCurrentOrUpcoming ); - m_pIterCurrentOrUpcoming = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) ); + SAFE_DELETE( m_pIterNeedsHoldJudging ); + m_pIterNeedsHoldJudging = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) ); SAFE_DELETE( m_pIterUncrossedRows ); m_pIterUncrossedRows = new NoteData::all_tracks_iterator( m_NoteData.GetTapNoteRangeAllTracks(iNoteRow, MAX_NOTE_ROW ) ); @@ -713,45 +736,27 @@ void Player::Update( float fDeltaTime ) // update HoldNotes logic // { - // Update CurrentOrUpcomingNote pointers to point to the note - // at or after iSongRow. - NoteData::all_tracks_iterator &iter = *m_pIterCurrentOrUpcoming; - while( !iter.IsAtEnd() && iter.Row() < iSongRow ) + + // Fast forward to the first that needs hold judging. { - ++iter; + NoteData::all_tracks_iterator &iter = *m_pIterNeedsHoldJudging; + while( !iter.IsAtEnd() && iter.Row() <= iSongRow && !NeedsHoldJudging(*iter) ) + ++iter; } - multimap mapRowToTap; - for( int t=0; t vHoldNotesToGradeTogether; + int iRowOfLastHoldNote = -1; + NoteData::all_tracks_iterator iter = *m_pIterNeedsHoldJudging; // copy + for( ; !iter.IsAtEnd() && iter.Row() <= iSongRow; ++iter ) { - // If there is a hold on this track that overlaps the current row - // (overlaps because head has passed the current row), - // it will be the the TapNote one before the TapNote pointed to - // by CurrentOrUpcoming. - NoteData::iterator iter = m_pIterCurrentOrUpcoming->GetIter(t); - if( iter == m_NoteData.begin(t) ) - continue; // no previous note available - --iter; - TapNote &tn = iter->second; - int iRow = iter->first; - ASSERT( iRow < iSongRow ); + TapNote &tn = *iter; if( tn.type != TapNote::hold_head ) continue; - bool bInRange = iSongRow < iRow + tn.iDuration; - if( !bInRange ) - continue; - TrackRowTapNote trtn = { t, iRow, &tn }; - mapRowToTap.insert( make_pair(iRow,trtn) ); - } - // mapRowToTap now contains all overlapping holds sored by row - int iRowOfLastHoldNote = -1; - vector vHoldNotesToGradeTogether; - FOREACHMM( int, TrackRowTapNote, mapRowToTap, iter ) - { - TrackRowTapNote &trtn = iter->second; - TapNote &tn = *trtn.pTN; - int iRow = iter->first; + int iTrack = iter.Track(); + int iRow = iter.Row(); + TrackRowTapNote trtn = { iTrack, iRow, &tn }; /* All holds must be of the same subType because fLife is handled * in different ways depending on the SubType. Handle Rolls one at a time @@ -789,7 +794,6 @@ void Player::Update( float fDeltaTime ) } } - { // Why was this originally "BeatToNoteRowNotRounded"? It should be rounded. -Chris /* We want to send the crossed row message exactly when we cross the row--not @@ -2142,11 +2146,14 @@ void Player::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds ) } } - NoteData::all_tracks_iterator &iter = *m_pIterNotJudged; + NoteData::all_tracks_iterator &iter = *m_pIterNeedsTapJudging; for( ; !iter.IsAtEnd() && iter.Row() < iMissIfOlderThanThisRow; ++iter ) { TapNote &tn = *iter; + + if( !NeedsTapJudging(tn) ) + continue; if( tn.pn != PLAYER_INVALID && tn.pn != m_pPlayerState->m_PlayerNumber ) continue; diff --git a/stepmania/src/Player.h b/stepmania/src/Player.h index 7561765090..5a93516bc5 100644 --- a/stepmania/src/Player.h +++ b/stepmania/src/Player.h @@ -167,8 +167,8 @@ protected: Inventory *m_pInventory; int m_iFirstUncrossedRow; // used by hold checkpoints logic - NoteData::all_tracks_iterator *m_pIterNotJudged; - NoteData::all_tracks_iterator *m_pIterCurrentOrUpcoming; + NoteData::all_tracks_iterator *m_pIterNeedsTapJudging; + NoteData::all_tracks_iterator *m_pIterNeedsHoldJudging; NoteData::all_tracks_iterator *m_pIterUncrossedRows; NoteData::all_tracks_iterator *m_pIterUnjudgedRows; NoteData::all_tracks_iterator *m_pIterUnjudgedMineRows;