CString OptionRow::GetRowTitle() const { CString sLineName = m_RowDef.name; CString sTitle = THEME_TITLES ? OPTION_TITLE(sLineName) : sLineName; // HACK: tack the BPM onto the name of the speed line if( sLineName.CompareNoCase("speed")==0 ) { bool bShowBpmInSpeedTitle = SHOW_BPM_IN_SPEED_TITLE; if( GAMESTATE->m_pCurCourse ) { Trail* pTrail = GAMESTATE->m_pCurTrail[GAMESTATE->m_MasterPlayerNumber]; ASSERT( pTrail != NULL ); const int iNumCourseEntries = pTrail->m_vEntries.size(); if( iNumCourseEntries > MAX_COURSE_ENTRIES_BEFORE_VARIOUS ) bShowBpmInSpeedTitle = false; } if( bShowBpmInSpeedTitle ) { DisplayBpms bpms; if( GAMESTATE->m_pCurSong ) { Song* pSong = GAMESTATE->m_pCurSong; pSong->GetDisplayBpms( bpms ); } else if( GAMESTATE->m_pCurCourse ) { Course *pCourse = GAMESTATE->m_pCurCourse; StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; Trail* pTrail = pCourse->GetTrail( st ); ASSERT( pTrail ); pTrail->GetDisplayBpms( bpms ); } if( bpms.IsSecret() ) sTitle += ssprintf( " (??" "?)" ); /* split so gcc doesn't think this is a trigraph */ else if( bpms.BpmIsConstant() ) sTitle += ssprintf( " (%.0f)", bpms.GetMin() ); else sTitle += ssprintf( " (%.0f-%.0f)", bpms.GetMin(), bpms.GetMax() ); } } return sTitle; }
void BPMDisplay::SetBpmFromCourse( const Course* pCourse ) { ASSERT( pCourse != NULL ); ASSERT( GAMESTATE->GetCurrentStyle(PLAYER_INVALID) != NULL ); StepsType st = GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType; Trail *pTrail = pCourse->GetTrail( st ); // GetTranslitFullTitle because "Crashinfo.txt is garbled because of the ANSI output as usual." -f ASSERT_M( pTrail != NULL, ssprintf("Course '%s' has no trail for StepsType '%s'", pCourse->GetTranslitFullTitle().c_str(), StringConversion::ToString(st).c_str() ) ); m_fCycleTime = (float)COURSE_CYCLE_SPEED; if( (int)pTrail->m_vEntries.size() > CommonMetrics::MAX_COURSE_ENTRIES_BEFORE_VARIOUS ) { SetVarious(); return; } DisplayBpms bpms; pTrail->GetDisplayBpms( bpms ); SetBPMRange( bpms ); }