add Player::UpdateHoldNotes, score groups of hold notes together if JudgeHoldNotesOnSameRowTogether (experimental)
This commit is contained in:
+70
-39
@@ -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()
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user