add Player::UpdateHoldNotes, score groups of hold notes together if JudgeHoldNotesOnSameRowTogether (experimental)

This commit is contained in:
Chris Danford
2007-01-15 12:00:14 +00:00
parent 7a15dddb62
commit 6d87063e3c
2 changed files with 150 additions and 112 deletions
+70 -39
View File
@@ -650,8 +650,10 @@ void Player::Update( float fDeltaTime )
// update HoldNotes logic // update HoldNotes logic
// //
{ {
// Check only 1 beat back for holds. Even 1 beat is overkill.
const int iStartCheckingAt = max( 0, iSongRow-BeatToNoteRow(1) ); const int iStartCheckingAt = max( 0, iSongRow-BeatToNoteRow(1) );
vector<TrackRowTapNote> vHoldNotesToGradeTogether; vector<TrackRowTapNote> vHoldNotesToGradeTogether;
int iRowOfLastHoldNote = -1;
NoteData::all_tracks_iterator iter = m_NoteData.GetTapNoteRangeAllTracks( iStartCheckingAt, iSongRow+1, NULL, true ); NoteData::all_tracks_iterator iter = m_NoteData.GetTapNoteRangeAllTracks( iStartCheckingAt, iSongRow+1, NULL, true );
for( ; !iter.IsAtEnd(); ++iter ) for( ; !iter.IsAtEnd(); ++iter )
{ {
@@ -661,6 +663,74 @@ void Player::Update( float fDeltaTime )
int iTrack = iter.Track(); int iTrack = iter.Track();
int iRow = iter.Row(); int iRow = iter.Row();
TrackRowTapNote trtn = { iTrack, iRow, &tn };
if( iRow != iRowOfLastHoldNote )//|| !JUDGE_HOLD_NOTES_ON_SAME_ROW_TOGETHER )
{
if( !vHoldNotesToGradeTogether.empty() )
{
UpdateHoldNotes( iSongRow, fDeltaTime, vHoldNotesToGradeTogether );
vHoldNotesToGradeTogether.clear();
}
}
iRowOfLastHoldNote = iRow;
vHoldNotesToGradeTogether.push_back( trtn );
}
if( !vHoldNotesToGradeTogether.empty() )
{
UpdateHoldNotes( iSongRow, fDeltaTime, vHoldNotesToGradeTogether );
vHoldNotesToGradeTogether.clear();
}
}
{
// 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
* .5 before the row. Use a very slow song (around 2 BPM) as a test case: without
* rounding, autoplay steps early. -glenn */
const int iRowNow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat );
if( iRowNow >= 0 )
{
// for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) )
FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( m_NoteData, r, m_iRowLastCrossed, iRowNow+1 )
CrossedRow( r, now );
m_iRowLastCrossed = iRowNow+1;
}
}
{
// TRICKY:
float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
fPositionSeconds -= PREFSMAN->m_fPadStickSeconds;
const float fSongBeat = GAMESTATE->m_pCurSong ? GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ) : 0;
const int iRowNow = BeatToNoteRowNotRounded( fSongBeat );
if( iRowNow >= 0 )
{
// for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) )
FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( m_NoteData, r, m_iMineRowLastCrossed, iRowNow+1 )
CrossedMineRow( r, now );
m_iMineRowLastCrossed = iRowNow+1;
}
}
// Check for completely judged rows.
UpdateJudgedRows();
// process transforms that are waiting to be applied
ApplyWaitingTransforms();
}
/* Update every hold in TrackRowTapNote, but require that all holds in */
void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vector<TrackRowTapNote> &vTN )
{
FOREACH( TrackRowTapNote, vTN, trtn )
{
int iTrack = trtn->iTrack;
int iRow = trtn->iRow;
TapNote &tn = *trtn->pTN;
int iEndRow = iRow + tn.iDuration; int iEndRow = iRow + tn.iDuration;
// set hold flags so NoteField can do intelligent drawing // set hold flags so NoteField can do intelligent drawing
@@ -778,45 +848,6 @@ void Player::Update( float fDeltaTime )
SetHoldJudgment( tn.result.tns, tn.HoldResult.hns, iTrack ); SetHoldJudgment( tn.result.tns, tn.HoldResult.hns, iTrack );
} }
} }
}
{
// 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
* .5 before the row. Use a very slow song (around 2 BPM) as a test case: without
* rounding, autoplay steps early. -glenn */
const int iRowNow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat );
if( iRowNow >= 0 )
{
// for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) )
FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( m_NoteData, r, m_iRowLastCrossed, iRowNow+1 )
CrossedRow( r, now );
m_iRowLastCrossed = iRowNow+1;
}
}
{
// TRICKY:
float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
fPositionSeconds -= PREFSMAN->m_fPadStickSeconds;
const float fSongBeat = GAMESTATE->m_pCurSong ? GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ) : 0;
const int iRowNow = BeatToNoteRowNotRounded( fSongBeat );
if( iRowNow >= 0 )
{
// for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_pPlayerState) )
FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( m_NoteData, r, m_iMineRowLastCrossed, iRowNow+1 )
CrossedMineRow( r, now );
m_iMineRowLastCrossed = iRowNow+1;
}
}
// Check for completely judged rows.
UpdateJudgedRows();
// process transforms that are waiting to be applied
ApplyWaitingTransforms();
} }
void Player::ApplyWaitingTransforms() void Player::ApplyWaitingTransforms()
+8 -1
View File
@@ -86,7 +86,6 @@ public:
} }
}; };
class Player: public ActorFrame class Player: public ActorFrame
{ {
public: public:
@@ -97,6 +96,14 @@ public:
virtual void Update( float fDeltaTime ); virtual void Update( float fDeltaTime );
virtual void DrawPrimitives(); virtual void DrawPrimitives();
struct TrackRowTapNote
{
int iTrack;
int iRow;
TapNote *pTN;
};
void UpdateHoldNotes( int iSongRow, float fDeltaTime, vector<TrackRowTapNote> &vTN );
void Init( void Init(
const RString &sType, const RString &sType,
PlayerState* pPlayerState, PlayerState* pPlayerState,