From bd2bd7e2bfc1c1d480e3ce336b49f4a6d522edd7 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 11 Dec 2004 12:31:17 +0000 Subject: [PATCH] real arrow visibility fix fix numbers not actually being random --- stepmania/src/ArrowEffects.cpp | 17 +++++++---------- stepmania/src/ArrowEffects.h | 2 +- stepmania/src/NoteField.cpp | 10 +++++----- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index bfed387a01..f6a7479ed8 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -23,7 +23,7 @@ static float GetNoteFieldHeight( PlayerNumber pn ) /* For visibility testing: if iAbsolute is -1, then all random modifiers must return * the minimal possible offset; if +1, they must return the maximum possible offset. * When actually rendering, iAbsolute is 0. */ -float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, int iAbsolute ) +float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, bool bAbsolute ) { float fYOffset = 0; @@ -86,17 +86,14 @@ float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, int iAbsolute fYOffset += fAccels[PlayerOptions::ACCEL_BOOMERANG] * (fYOffset * SCALE( fYOffset, 0.f, SCREEN_HEIGHT, 1.5f, 0.5f )- fYOffset); float fScrollSpeed = GAMESTATE->m_CurrentPlayerOptions[pn].m_fScrollSpeed; - if( GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed > 1.0f ) + if( GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed > 1.0f && !bAbsolute ) { int seed = GAMESTATE->m_iRoundSeed + ( BeatToNoteRow( fNoteBeat ) << 8 ) + (iCol * 100); - float fRandom; - switch( iAbsolute ) - { - case 0: fRandom = RandomFloat( seed ); break; - case -1: fRandom = 1.0f; break; /* highest scroll speed = lowest visibility */ - case +1: fRandom = 0.0f; break; - default: FAIL_M( ssprintf("%i",iAbsolute) ); - }; + + /* Temporary hack: the first call to RandomFloat isn't "random"; it takes an extra + * call to get the RNG rolling. */ + RandomFloat( seed ); + float fRandom = RandomFloat( seed ); fScrollSpeed *= SCALE( fRandom, diff --git a/stepmania/src/ArrowEffects.h b/stepmania/src/ArrowEffects.h index a8db8c8098..471358b062 100644 --- a/stepmania/src/ArrowEffects.h +++ b/stepmania/src/ArrowEffects.h @@ -11,7 +11,7 @@ // fYOffset is a vertical position in pixels relative to the center. // (positive if has not yet been stepped on, negative if has already passed). // The ArrowEffect and ScrollSpeed is applied in this stage. -float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, int iAbsolute = 0 ); +float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, bool bAbsolute=false ); /* Actual display position, with reverse and post-reverse-effects factored in * (fYOffset -> YPos). */ diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index 83baee4d0f..754d1ee73e 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -354,7 +354,7 @@ float FindFirstDisplayedBeat( PlayerNumber pn, int iFirstPixelToDraw ) while( fFirstBeatToDraw < GAMESTATE->m_fSongBeat ) { - float fYOffset = ArrowGetYOffset( pn, 0, fFirstBeatToDraw, -1 ); + float fYOffset = ArrowGetYOffset( pn, 0, fFirstBeatToDraw, true ); if( fYOffset < iFirstPixelToDraw ) // off screen fFirstBeatToDraw += 0.1f; // move toward fSongBeat else // on screen @@ -378,7 +378,7 @@ float FindLastDisplayedBeat( PlayerNumber pn, int iLastPixelToDraw ) for( int i=0; i iLastPixelToDraw ) // off screen fLastBeatToDraw -= fSearchDistance; @@ -543,8 +543,8 @@ void NoteField::DrawPrimitives() // TRICKY: If boomerang is on, then all notes in the range // [iFirstIndexToDraw,iLastIndexToDraw] aren't necessarily visible. // Test every note to make sure it's on screen before drawing - float fYStartOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(hn.iStartRow) ); - float fYEndOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(hn.iEndRow) ); + float fYStartOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(hn.iStartRow), true ); + float fYEndOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(hn.iEndRow), true ); if( !( iFirstPixelToDraw <= fYEndOffset && fYEndOffset <= iLastPixelToDraw || iFirstPixelToDraw <= fYStartOffset && fYStartOffset <= iLastPixelToDraw || fYStartOffset < iFirstPixelToDraw && fYEndOffset > iLastPixelToDraw ) ) @@ -588,7 +588,7 @@ void NoteField::DrawPrimitives() // TRICKY: If boomerang is on, then all notes in the range // [iFirstIndexToDraw,iLastIndexToDraw] aren't necessarily visible. // Test every note to make sure it's on screen before drawing - float fYOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(i) ); + float fYOffset = ArrowGetYOffset( m_PlayerNumber, 0, NoteRowToBeat(i), true ); if( fYOffset > iLastPixelToDraw ) // off screen continue; // skip if( fYOffset < iFirstPixelToDraw ) // off screen