fix brake/boost tweening

allow tweening to/from constant speed mods
This commit is contained in:
Glenn Maynard
2004-04-09 04:49:29 +00:00
parent e540237288
commit ab7e7b1afa
3 changed files with 21 additions and 16 deletions
+13 -7
View File
@@ -27,26 +27,32 @@ float g_fExpandSeconds = 0;
static float GetNoteFieldHeight( PlayerNumber pn ) static float GetNoteFieldHeight( PlayerNumber pn )
{ {
return SCREEN_HEIGHT + fabsf(GAMESTATE->m_PlayerOptions[pn].m_fPerspectiveTilt)*200; return SCREEN_HEIGHT + fabsf(GAMESTATE->m_CurrentPlayerOptions[pn].m_fPerspectiveTilt)*200;
} }
float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat ) float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat )
{ {
float fYOffset; float fYOffset = 0;
if( !GAMESTATE->m_PlayerOptions[pn].m_bTimeSpacing )
/* Usually, fTimeSpacing is 0 or 1, in which case we use entirely beat spacing or
* entirely time spacing (respectively). Occasionally, we tween between them. */
if( GAMESTATE->m_CurrentPlayerOptions[pn].m_fTimeSpacing != 1.0f )
{ {
float fSongBeat = GAMESTATE->m_fSongBeat; float fSongBeat = GAMESTATE->m_fSongBeat;
float fBeatsUntilStep = fNoteBeat - fSongBeat; float fBeatsUntilStep = fNoteBeat - fSongBeat;
fYOffset = fBeatsUntilStep * ARROW_SPACING; float fYOffsetBeatSpacing = fBeatsUntilStep * ARROW_SPACING;
fYOffset += fYOffsetBeatSpacing * (1-GAMESTATE->m_CurrentPlayerOptions[pn].m_fTimeSpacing);
} }
else
if( GAMESTATE->m_CurrentPlayerOptions[pn].m_fTimeSpacing != 0.0f )
{ {
float fSongSeconds = GAMESTATE->m_fMusicSeconds; float fSongSeconds = GAMESTATE->m_fMusicSeconds;
float fNoteSeconds = GAMESTATE->m_pCurSong->GetElapsedTimeFromBeat(fNoteBeat); float fNoteSeconds = GAMESTATE->m_pCurSong->GetElapsedTimeFromBeat(fNoteBeat);
float fSecondsUntilStep = fNoteSeconds - fSongSeconds; float fSecondsUntilStep = fNoteSeconds - fSongSeconds;
float fBPM = GAMESTATE->m_PlayerOptions[pn].m_fScrollBPM; float fBPM = GAMESTATE->m_CurrentPlayerOptions[pn].m_fScrollBPM;
float fBPS = fBPM/60.f; float fBPS = fBPM/60.f;
fYOffset = fSecondsUntilStep * fBPS * ARROW_SPACING; float fYOffsetTimeSpacing = fSecondsUntilStep * fBPS * ARROW_SPACING;
fYOffset += fYOffsetTimeSpacing * GAMESTATE->m_CurrentPlayerOptions[pn].m_fTimeSpacing;
} }
// don't mess with the arrows after they've crossed 0 // don't mess with the arrows after they've crossed 0
+7 -6
View File
@@ -25,7 +25,7 @@
void PlayerOptions::Init() void PlayerOptions::Init()
{ {
m_bTimeSpacing = false; m_fTimeSpacing = 0; m_SpeedfTimeSpacing = 1.0f;
m_fScrollSpeed = 1.0f; m_SpeedfScrollSpeed = 1.0f; m_fScrollSpeed = 1.0f; m_SpeedfScrollSpeed = 1.0f;
m_fScrollBPM = 200; m_SpeedfScrollBPM = 1.0f; m_fScrollBPM = 200; m_SpeedfScrollBPM = 1.0f;
ZERO( m_fAccels ); ONE( m_SpeedfAccels ); ZERO( m_fAccels ); ONE( m_SpeedfAccels );
@@ -59,6 +59,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
APP( fAppearances[i] ); APP( fAppearances[i] );
for( i=0; i<NUM_SCROLLS; i++ ) for( i=0; i<NUM_SCROLLS; i++ )
APP( fScrolls[i] ); APP( fScrolls[i] );
APP( fTimeSpacing );
APP( fScrollSpeed ); APP( fScrollSpeed );
APP( fDark ); APP( fDark );
APP( fBlind ); APP( fBlind );
@@ -82,7 +83,7 @@ CString PlayerOptions::GetString() const
{ {
CString sReturn; CString sReturn;
if( !m_bTimeSpacing ) if( !m_fTimeSpacing )
{ {
if( m_fScrollSpeed != 1 ) if( m_fScrollSpeed != 1 )
{ {
@@ -206,7 +207,7 @@ void PlayerOptions::FromString( CString sOptions )
vector<CString> matches; vector<CString> matches;
if( mult.Compare(sBit, matches) ) if( mult.Compare(sBit, matches) )
{ {
m_bTimeSpacing = false; m_fTimeSpacing = 0.0f;
int ret = sscanf( matches[0], "%f", &m_fScrollSpeed ); int ret = sscanf( matches[0], "%f", &m_fScrollSpeed );
ASSERT( ret == 1 ); ASSERT( ret == 1 );
continue; continue;
@@ -214,7 +215,7 @@ void PlayerOptions::FromString( CString sOptions )
else if( sscanf( sBit, "c%d", &i1 ) == 1 ) else if( sscanf( sBit, "c%d", &i1 ) == 1 )
{ {
m_bTimeSpacing = true; m_fTimeSpacing = 1.0f;
m_fScrollBPM = (float) i1; m_fScrollBPM = (float) i1;
continue; continue;
} }
@@ -514,7 +515,7 @@ float PlayerOptions::GetReversePercentForColumn( int iCol )
bool PlayerOptions::operator==( const PlayerOptions &other ) const bool PlayerOptions::operator==( const PlayerOptions &other ) const
{ {
#define COMPARE(x) { if( x != other.x ) return false; } #define COMPARE(x) { if( x != other.x ) return false; }
COMPARE(m_bTimeSpacing); COMPARE(m_fTimeSpacing);
COMPARE(m_fScrollSpeed); COMPARE(m_fScrollSpeed);
COMPARE(m_fScrollBPM); COMPARE(m_fScrollBPM);
COMPARE(m_fDark); COMPARE(m_fDark);
@@ -544,7 +545,7 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const
bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps ) bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps )
{ {
if( m_bTimeSpacing && pSong->HasSignificantBpmChangesOrStops() ) if( m_fTimeSpacing && pSong->HasSignificantBpmChangesOrStops() )
return true; return true;
if( m_bTransforms[TRANSFORM_NOHOLDS] && pSteps->GetRadarValues()[RADAR_NUM_HOLDS]>0 ) if( m_bTransforms[TRANSFORM_NOHOLDS] && pSteps->GetRadarValues()[RADAR_NUM_HOLDS]>0 )
return true; return true;
+1 -3
View File
@@ -95,11 +95,9 @@ struct PlayerOptions
}; };
float GetReversePercentForColumn( int iCol ); // accounts for all Directions float GetReversePercentForColumn( int iCol ); // accounts for all Directions
bool m_bTimeSpacing; // instead of Beat spacing
/* All floats have a corresponding speed setting, which determines how fast /* All floats have a corresponding speed setting, which determines how fast
* PlayerOptions::Approach approaches. */ * PlayerOptions::Approach approaches. */
float m_fTimeSpacing, m_SpeedfTimeSpacing; // instead of Beat spacing
float m_fScrollSpeed, m_SpeedfScrollSpeed; // used if !m_bTimeSpacing float m_fScrollSpeed, m_SpeedfScrollSpeed; // used if !m_bTimeSpacing
float m_fScrollBPM, m_SpeedfScrollBPM; // used if m_bTimeSpacing float m_fScrollBPM, m_SpeedfScrollBPM; // used if m_bTimeSpacing
float m_fAccels[NUM_ACCELS], m_SpeedfAccels[NUM_ACCELS]; float m_fAccels[NUM_ACCELS], m_SpeedfAccels[NUM_ACCELS];