also fixes randomization happening at the wrong spot: don't use row values
directly, as it'll break when the row resolution changes; always use values scaled to ROWS_PER_BEAT
This commit is contained in:
+31
-12
@@ -1089,26 +1089,45 @@ void PlayerMinus::CrossedMineRow( int iNoteRow )
|
|||||||
|
|
||||||
void PlayerMinus::RandomiseNotes( int iNoteRow )
|
void PlayerMinus::RandomiseNotes( int iNoteRow )
|
||||||
{
|
{
|
||||||
const int NewNoteRow = (int)(iNoteRow + 50 / GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fScrollSpeed); // change the row to look ahead from based upon their speed mod
|
// change the row to look ahead from based upon their speed mod
|
||||||
|
/* This is incorrect: if m_fScrollSpeed is 0.5, we'll never change
|
||||||
|
* any odd rows, and if it's 2, we'll shuffle each row twice. */
|
||||||
|
int iNewNoteRow = iNoteRow + ROWS_PER_BEAT*2;
|
||||||
|
iNewNoteRow = int( iNewNoteRow / GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fScrollSpeed );
|
||||||
|
|
||||||
bool UpdateNoteField = false;
|
|
||||||
int iNumOfTracks = GetNumTracks();
|
int iNumOfTracks = GetNumTracks();
|
||||||
for( int t=0; t+1 < iNumOfTracks; t++ )
|
for( int t=0; t+1 < iNumOfTracks; t++ )
|
||||||
{
|
{
|
||||||
int iRandomTrackToSwapWith = RandomInt(0, iNumOfTracks-1);
|
const int iSwapWith = RandomInt( 0, iNumOfTracks-1 );
|
||||||
const TapNote t1 = GetTapNote(t, NewNoteRow);
|
|
||||||
const TapNote t2 = GetTapNote(iRandomTrackToSwapWith, NewNoteRow);
|
|
||||||
|
|
||||||
if( (t1.type == TapNote::tap || t1.type == TapNote::empty) &&
|
/* Only swap a tap and an empty. */
|
||||||
(t2.type == TapNote::tap || t2.type == TapNote::empty) )
|
const TapNote t1 = GetTapNote(t, iNewNoteRow);
|
||||||
|
if( t1.type != TapNote::tap )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const TapNote t2 = GetTapNote( iSwapWith, iNewNoteRow );
|
||||||
|
if( t2.type != TapNote::empty )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Make sure the destination row isn't in the middle of a hold. */
|
||||||
|
bool bSkip = false;
|
||||||
|
for( int i = 0; !bSkip && i < GetNumHoldNotes(); ++i )
|
||||||
{
|
{
|
||||||
SetTapNote(t, NewNoteRow, t2);
|
const HoldNote &hn = GetHoldNote(i);
|
||||||
SetTapNote(iRandomTrackToSwapWith, NewNoteRow, t1);
|
if( hn.iTrack == iSwapWith && hn.RowIsInRange(iNewNoteRow) )
|
||||||
UpdateNoteField = true;
|
bSkip = true;
|
||||||
}
|
}
|
||||||
|
if( bSkip )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SetTapNote( t, iNewNoteRow, t2 );
|
||||||
|
SetTapNote( iSwapWith, iNewNoteRow, t1 );
|
||||||
|
|
||||||
|
const TapNote nft1 = m_pNoteField->GetTapNote( t, iNewNoteRow );
|
||||||
|
const TapNote nft2 = m_pNoteField->GetTapNote( iSwapWith, iNewNoteRow );
|
||||||
|
m_pNoteField->SetTapNote( t, iNewNoteRow, nft2 );
|
||||||
|
m_pNoteField->SetTapNote( iSwapWith, iNewNoteRow, nft1 );
|
||||||
}
|
}
|
||||||
if( UpdateNoteField )
|
|
||||||
m_pNoteField->CopyRange( this, NewNoteRow, NewNoteRow, NewNoteRow );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMinus::HandleTapRowScore( unsigned row )
|
void PlayerMinus::HandleTapRowScore( unsigned row )
|
||||||
|
|||||||
Reference in New Issue
Block a user