diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index 01549f8c8c..60e0624490 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -111,6 +111,50 @@ float ArrowGetXPos( PlayerNumber pn, int iColNum, float fYPos ) fPixelOffsetFromCenter += fDistance * fEffects[PlayerOptions::EFFECT_FLIP]; } + if( fEffects[PlayerOptions::EFFECT_BEAT] > 0 ) + do { + float fAccelTime = 0.2f, fTotalTime = 0.5f; + + /* If the song is really fast, slow down the rate, but speed up the + * acceleration to compensate or it'll look weird. */ + const float fBPM = GAMESTATE->m_fCurBPS * 60; + const float fDiv = max(1.0f, truncf( fBPM / 150.0f )); + fAccelTime /= fDiv; + fTotalTime /= fDiv; + + float fBeat = GAMESTATE->m_fSongBeat + fAccelTime; + fBeat /= fDiv; + + const bool bEvenBeat = ( int(fBeat) % 2 ) != 0; + + /* -100.2 -> -0.2 -> 0.2 */ + if( fBeat < 0 ) + break; + + fBeat -= truncf( fBeat ); + fBeat += 1; + fBeat -= truncf( fBeat ); + + if( fBeat >= fTotalTime ) + break; + + float fAmount; + if( fBeat < fAccelTime ) + { + fAmount = SCALE( fBeat, 0.0f, fAccelTime, 0.0f, 1.0f); + fAmount *= fAmount; + } else /* fBeat < fTotalTime */ { + fAmount = SCALE( fBeat, fAccelTime, fTotalTime, 1.0f, 0.0f); + fAmount = 1 - (1-fAmount) * (1-fAmount); + } + + if( bEvenBeat ) + fAmount *= -1; + + const float fShift = 20.0f*fAmount*sinf( fYPos / 15.0f + PI/2.0f ); + fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_BEAT] * fShift; + } while(0); + return fPixelOffsetFromCenter; } diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index 2be9c368a8..cb1bc08762 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -93,6 +93,7 @@ CString PlayerOptions::GetString() if( m_fEffects[EFFECT_FLIP]==1 ) sReturn += "Flip, "; if( m_fEffects[EFFECT_TORNADO]==1 ) sReturn += "Tornado, "; if( m_fEffects[EFFECT_BUMPY]==1 ) sReturn += "Bumpy, "; + if( m_fEffects[EFFECT_BEAT]==1 ) sReturn += "Beat, "; if( m_fAppearances[APPEARANCE_HIDDEN]==1 ) sReturn += "Hidden, "; if( m_fAppearances[APPEARANCE_SUDDEN]==1 ) sReturn += "Sudden, "; @@ -186,6 +187,7 @@ void PlayerOptions::FromString( CString sOptions ) else if( sBit == "flip" ) m_fEffects[EFFECT_FLIP] = 1; else if( sBit == "tornado" ) m_fEffects[EFFECT_TORNADO] = 1; else if( sBit == "bumpy" ) m_fEffects[EFFECT_BUMPY] = 1; + else if( sBit == "beat" ) m_fEffects[EFFECT_BEAT] = 1; else if( sBit == "hidden" ) m_fAppearances[APPEARANCE_HIDDEN] = 1; else if( sBit == "sudden" ) m_fAppearances[APPEARANCE_SUDDEN] = 1; else if( sBit == "stealth" ) m_fAppearances[APPEARANCE_STEALTH] = 1; diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index bdb12115ad..ae9da94171 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -36,6 +36,7 @@ struct PlayerOptions EFFECT_FLIP, EFFECT_TORNADO, EFFECT_BUMPY, + EFFECT_BEAT, NUM_EFFECTS }; enum Appearance {