/* $Id: scoretable.cpp,v 1.15 2005/10/11 16:06:10 chfreund Exp $ */ #include "scoretable.hpp" #include #include ScoreTable::ScoreTable() : WidgetComposite( new TableLayout( this, 5 ) ) { TableLayout* layout = static_cast( _layout_manager ); layout->setHorizontalSpacing( 10 ); // create table header m_tableHeader[0] = new TextLabel( "Name" ); m_tableHeader[1] = new TextLabel( "Frags" ); m_tableHeader[2] = new TextLabel( "Kills" ); m_tableHeader[3] = new TextLabel( "Deaths" ); m_tableHeader[4] = new TextLabel( "Damage" ); SDL_Color black; black.r = black.g = black.b = 0; m_tableHeader[0]->setColor( black ); m_tableHeader[1]->setColor( black ); m_tableHeader[2]->setColor( black ); m_tableHeader[3]->setColor( black ); m_tableHeader[4]->setColor( black ); add( m_tableHeader[0] ); add( m_tableHeader[1] ); add( m_tableHeader[2] ); add( m_tableHeader[3] ); add( m_tableHeader[4] ); } void ScoreTable::updateScores( World* world ) { Scorekeeper* sk = world->getScorekeeper(); std::vector players = world->getAllPlayers(); // remove all entries removeAll(); // clean old labels for ( std::vector::iterator it = m_scoreLabels.begin(); it != m_scoreLabels.end(); it++ ) { TextLabel* label = *it; remove( label ); delete label; } m_scoreLabels.clear(); // insert header labels add( m_tableHeader[0] ); add( m_tableHeader[1] ); add( m_tableHeader[2] ); add( m_tableHeader[3] ); add( m_tableHeader[4] ); if ( sk->isTeamPlay() ) { TeamScore teamScores[MAX_NUMBER_OF_PLAYERS]; std::vector activeTeams; bool teamUpdated[MAX_NUMBER_OF_PLAYERS]; for ( Uint8 t = 0; t < MAX_NUMBER_OF_PLAYERS; t++ ) { teamUpdated[t] = false; } for ( std::vector::iterator it = players.begin(); it != players.end(); it++ ) { Player* player = *it; Uint8 teamID = player->getTeamID(); if ( !teamUpdated[teamID] ) { teamScores[teamID].teamID = teamID; teamScores[teamID].nFrags = sk->getFragsForTeam( teamID ); teamScores[teamID].nKills = sk->getKillsForTeam( teamID ); teamScores[teamID].nDeaths = sk->getDeathsForTeam( teamID ); teamScores[teamID].nDamage = sk->getDamageForTeam( teamID ); activeTeams.push_back( &teamScores[teamID] ); teamUpdated[teamID] = true; } } sort( activeTeams.begin(), activeTeams.end(), CompareTeamByFrags( world ) ); for ( std::vector::iterator it = activeTeams.begin(); it != activeTeams.end(); it++ ) { TeamScore* teamScore = *it; SDL_Color textColor; textColor.r = static_cast( (TEAM_COLOR[teamScore->teamID] >> 16) & 0xff ); textColor.g = static_cast( (TEAM_COLOR[teamScore->teamID] >> 8) & 0xff ); textColor.b = static_cast( (TEAM_COLOR[teamScore->teamID] ) & 0xff ); std::ostringstream labelTextBuffer; labelTextBuffer << "Team " << static_cast( teamScore->teamID ); TextLabel* label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << teamScore->nFrags; label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << teamScore->nKills; label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << teamScore->nDeaths; label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << teamScore->nDamage / 10000; label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); } } else { // sort player vector by frags sort( players.begin(), players.end(), ComparePlayerByFrags( world ) ); for ( std::vector::iterator it = players.begin(); it != players.end(); it++ ) { Player* player = *it; SDL_Color textColor; textColor.r = static_cast( (player->getPlayerColor() >> 16) & 0xff ); textColor.g = static_cast( (player->getPlayerColor() >> 8) & 0xff ); textColor.b = static_cast( (player->getPlayerColor() ) & 0xff ); std::ostringstream labelTextBuffer; labelTextBuffer << player->getName(); TextLabel* label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << sk->getFragsForPlayer( player->getPlayerID() ); label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << sk->getKillsForPlayer( player->getPlayerID() ); label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << sk->getDeathsForPlayer( player->getPlayerID() ); label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); labelTextBuffer.str( "" ); labelTextBuffer << sk->getDamageForPlayer( player->getPlayerID() ) / 10000; label = new TextLabel( "tahomabd.ttf", 14, labelTextBuffer.str() ); label->setColor( textColor ); m_scoreLabels.push_back( label ); add( label ); } } }