void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo ) { GetDirListing( ANNOUNCERS_DIR+"*", AddTo, true ); // strip out the folder called "CVS" and EMPTY_ANNOUNCER_NAME for( int i=AddTo.size()-1; i>=0; i-- ) if( !stricmp( AddTo[i], "cvs" ) ) AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); for( int i=AddTo.size()-1; i>=0; i-- ) if( !stricmp( AddTo[i], EMPTY_ANNOUNCER_NAME ) ) AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); }
void RageFileManager::GetDirListing( CString sPath, CStringArray &AddTo, bool bOnlyDirs, bool bReturnPathToo ) { LockMut( *g_Mutex ); NormalizePath( sPath ); for( unsigned i = 0; i < g_Drivers.size(); ++i ) { LoadedDriver &ld = g_Drivers[i]; const CString p = ld.GetPath( sPath ); if( p.size() == 0 ) continue; const unsigned OldStart = AddTo.size(); g_Drivers[i].driver->GetDirListing( p, AddTo, bOnlyDirs, bReturnPathToo ); /* If returning the path, prepend the mountpoint name to the files this driver returned. */ if( bReturnPathToo ) for( unsigned j = OldStart; j < AddTo.size(); ++j ) AddTo[j] = ld.MountPoint + AddTo[j]; } /* More than one driver might return the same file. Remove duplicates (case- * insensitively). */ sort( AddTo.begin(), AddTo.end(), ilt ); CStringArray::iterator it = unique( AddTo.begin(), AddTo.end(), ieq ); AddTo.erase(it, AddTo.end()); }
void KSFLoader::LoadTags( const CString &str, Song &out ) { /* str is either a #TITLE or a directory component. Fill in missing information. * str is either "title", "artist - title", or "artist - title - difficulty". */ CStringArray asBits; split( str, " - ", asBits, false ); /* Ignore the difficulty, since we get that elsewhere. */ if( asBits.size() == 3 && (!stricmp(asBits[2], "double") || !stricmp(asBits[2], "easy") || !stricmp(asBits[2], "normal") || !stricmp(asBits[2], "hard") || !stricmp(asBits[2], "crazy")) ) { asBits.erase(asBits.begin()+2, asBits.begin()+3); } CString title, artist; if( asBits.size() == 2 ) { artist = asBits[0]; title = asBits[1]; } else { title = asBits[0]; } /* Convert, if possible. Most KSFs are in Korean encodings (CP942/EUC-KR). */ if( !ConvertString( title, "korean" ) ) title = ""; if( !ConvertString( artist, "korean" ) ) artist = ""; if( out.m_sMainTitle == "" ) out.m_sMainTitle = title; if( out.m_sArtist == "" ) out.m_sArtist = artist; }
void PaneDisplay::SetContent( PaneContents c ) { CString str = "?"; // fill this in float val = 0; // fill this in const Song *pSong = GAMESTATE->m_pCurSong; const Steps *pSteps = GAMESTATE->m_pCurSteps[m_PlayerNumber]; const Course *pCourse = GAMESTATE->m_pCurCourse; const Trail *pTrail = GAMESTATE->m_pCurTrail[m_PlayerNumber]; const Profile *pProfile = PROFILEMAN->GetProfile( m_PlayerNumber ); bool bIsEdit = pSteps && pSteps->GetDifficulty() == DIFFICULTY_EDIT; if( (g_Contents[c].req&NEED_NOTES) && !pSteps ) goto done; if( (g_Contents[c].req&NEED_COURSE) && !pTrail ) goto done; if( (g_Contents[c].req&NEED_PROFILE) && !pProfile ) { str = "N/A"; goto done; } { RadarValues rv; if( g_Contents[c].req&NEED_NOTES ) rv = pSteps->GetRadarValues(); else if( g_Contents[c].req&NEED_COURSE ) rv = pTrail->GetRadarValues(); switch( c ) { case COURSE_NUM_STEPS: case SONG_NUM_STEPS: val = rv[RADAR_NUM_TAPS_AND_HOLDS]; break; case COURSE_JUMPS: case SONG_JUMPS: val = rv[RADAR_NUM_JUMPS]; break; case COURSE_HOLDS: case SONG_HOLDS: val = rv[RADAR_NUM_HOLDS]; break; case COURSE_MINES: case SONG_MINES: val = rv[RADAR_NUM_MINES]; break; case COURSE_HANDS: case SONG_HANDS: val = rv[RADAR_NUM_HANDS]; break; case SONG_DIFFICULTY_RADAR_STREAM: val = rv[RADAR_STREAM]; break; case SONG_DIFFICULTY_RADAR_VOLTAGE: val = rv[RADAR_VOLTAGE]; break; case SONG_DIFFICULTY_RADAR_AIR: val = rv[RADAR_AIR]; break; case SONG_DIFFICULTY_RADAR_FREEZE: val = rv[RADAR_FREEZE]; break; case SONG_DIFFICULTY_RADAR_CHAOS: val = rv[RADAR_CHAOS]; break; case SONG_PROFILE_HIGH_SCORE: val = 100.0f * PROFILEMAN->GetProfile(m_PlayerNumber)->GetStepsHighScoreList(pSong,pSteps).GetTopScore().fPercentDP; break; case SONG_PROFILE_NUM_PLAYS: val = (float) PROFILEMAN->GetProfile(m_PlayerNumber)->GetStepsNumTimesPlayed(pSong,pSteps); break; case SONG_MACHINE_HIGH_NAME: /* set val for color */ case SONG_MACHINE_HIGH_SCORE: CHECKPOINT; if( bIsEdit ) goto done; // no machine scores for edits val = 100.0f * PROFILEMAN->GetMachineProfile()->GetStepsHighScoreList(pSong,pSteps).GetTopScore().fPercentDP; break; case SONG_MACHINE_RANK: { const vector<Song*> best = SONGMAN->GetBestSongs( PROFILE_SLOT_MACHINE ); val = (float) FindIndex( best.begin(), best.end(), pSong ); val += 1; break; } case SONG_PROFILE_RANK: { const vector<Song*> best = SONGMAN->GetBestSongs( PlayerMemCard(m_PlayerNumber) ); val = (float) FindIndex( best.begin(), best.end(), pSong ); val += 1; break; } case COURSE_MACHINE_HIGH_NAME: /* set val for color */ case COURSE_MACHINE_HIGH_SCORE: val = 100.0f * PROFILEMAN->GetMachineProfile()->GetCourseHighScoreList(pCourse,pTrail).GetTopScore().fPercentDP; break; case COURSE_MACHINE_NUM_PLAYS: val = (float) PROFILEMAN->GetMachineProfile()->GetCourseNumTimesPlayed( pCourse ); break; case COURSE_MACHINE_RANK: { const vector<Course*> best = SONGMAN->GetBestCourses( PROFILE_SLOT_MACHINE ); val = (float) FindIndex( best.begin(), best.end(), pCourse ); val += 1; } break; case COURSE_PROFILE_HIGH_SCORE: val = 100.0f * PROFILEMAN->GetProfile(m_PlayerNumber)->GetCourseHighScoreList(pCourse,pTrail).GetTopScore().fPercentDP; break; case COURSE_PROFILE_NUM_PLAYS: val = (float) PROFILEMAN->GetProfile(m_PlayerNumber)->GetCourseNumTimesPlayed( pCourse ); break; case COURSE_PROFILE_RANK: const vector<Course*> best = SONGMAN->GetBestCourses( PlayerMemCard(m_PlayerNumber) ); val = (float) FindIndex( best.begin(), best.end(), pCourse ); val += 1; break; }; if( val == RADAR_VAL_UNKNOWN ) goto done; /* Scale, round, clamp, etc. for floats: */ switch( c ) { case SONG_DIFFICULTY_RADAR_STREAM: case SONG_DIFFICULTY_RADAR_VOLTAGE: case SONG_DIFFICULTY_RADAR_AIR: case SONG_DIFFICULTY_RADAR_FREEZE: case SONG_DIFFICULTY_RADAR_CHAOS: val = roundf( SCALE( val, 0, 1, 0, 10 ) ); val = clamp( val, 0, 10 ); str = ssprintf( "%.0f", val ); break; } switch( c ) { case SONG_MACHINE_HIGH_NAME: str = PROFILEMAN->GetMachineProfile()->GetStepsHighScoreList(pSong,pSteps).GetTopScore().sName; break; case COURSE_MACHINE_HIGH_NAME: str = PROFILEMAN->GetMachineProfile()->GetCourseHighScoreList(pCourse,pTrail).GetTopScore().sName; break; case SONG_MACHINE_HIGH_SCORE: case COURSE_MACHINE_HIGH_SCORE: case SONG_PROFILE_HIGH_SCORE: case COURSE_PROFILE_HIGH_SCORE: str = ssprintf( "%.2f%%", val ); break; case SONG_NUM_STEPS: case SONG_JUMPS: case SONG_HOLDS: case SONG_MINES: case SONG_HANDS: case COURSE_NUM_STEPS: case COURSE_JUMPS: case COURSE_HOLDS: case COURSE_MINES: case COURSE_HANDS: case SONG_MACHINE_NUM_PLAYS: case COURSE_MACHINE_NUM_PLAYS: case SONG_PROFILE_NUM_PLAYS: case COURSE_PROFILE_NUM_PLAYS: case SONG_MACHINE_RANK: case COURSE_MACHINE_RANK: case SONG_PROFILE_RANK: case COURSE_PROFILE_RANK: str = ssprintf( "%.0f", val ); } } done: m_textContents[c].SetText( str ); const int num = NUM_ITEM_COLORS( g_Contents[c].name ); for( int p = 0; p < num; ++p ) { const CString metric = ITEM_COLOR(g_Contents[c].name, p); CStringArray spec; split( metric, ";", spec ); if( spec.size() < 2 ) RageException::Throw( "Metric '%s' malformed", metric.c_str() ); const float n = strtof( spec[0], NULL ); if( val >= n ) continue; spec.erase( spec.begin(), spec.begin()+1 ); m_textContents[c].Command( join(";", spec) ); break; } }