/* $Id: gameinfowindow.cpp,v 1.7.4.1 2006/03/26 09:34:01 chfreund Exp $ */ #include "gameinfowindow.hpp" #include #include "image.h" #include "message.hpp" #include "serverentry.hpp" #include "player.hpp" #include "bot.hpp" #include "avatarworm.hpp" #include "wopsprites.hpp" #include "wopsprites.cpp" #include "scorekeeper.hpp" #include "wopgui.hpp" GameInfoWindow::GameInfoWindow( WopGUI* gui ) : m_gui( gui ) { m_content = new WidgetComposite(); VerticalLayout* contentLayout = new VerticalLayout( m_content ); m_content->setLayout( contentLayout ); m_generalContent = new WidgetComposite(); TableLayout* generalLayout = new TableLayout( m_generalContent, 2 ); generalLayout->setHorizontalSpacing( 10 ); generalLayout->setColumnStretch( 1, FILL ); m_generalContent->setLayout( generalLayout ); SDL_Color black = {0, 0, 0, 0}; TextLabel* label = new TextLabel( "Server address:" ); label->setColor( black ); m_generalContent->add( label ); m_addressField = new TextLabel( "" ); m_addressField->setColor( black ); m_generalContent->add( m_addressField ); label = new TextLabel( "Game mode:" ); label->setColor( black ); m_generalContent->add( label ); m_gamemodeField = new TextLabel( "" ); m_gamemodeField->setColor( black ); m_generalContent->add( m_gamemodeField ); m_allPlayerContent = new WidgetComposite(); HorizontalLayout* patLayout = new HorizontalLayout( m_allPlayerContent ); patLayout->setSpacing( 10 ); m_allPlayerContent->setLayout( patLayout ); m_playerFrame = new WidgetComposite(); VerticalLayout* playerFrameLayout = new VerticalLayout( m_playerFrame ); m_playerFrame->setLayout( playerFrameLayout ); label = new TextLabel( "tahomabd.ttf", 14, "Players in the game" ); label->setColor( black ); m_playerFrame->add( label ); m_playerContent = new WidgetComposite(); TableLayout* playerLayout = new TableLayout( m_playerContent, 3 ); playerLayout->setHorizontalSpacing( 10 ); playerLayout->setColumnStretch( 1, FILL ); m_playerContent->setLayout( playerLayout ); m_playerContent->setWidth( 265 ); m_playerFrame->add( m_playerContent ); m_localFrame = new WidgetComposite(); VerticalLayout* localFrameLayout = new VerticalLayout( m_localFrame ); m_localFrame->setLayout( localFrameLayout ); label = new TextLabel( "tahomabd.ttf", 14, "Local Players" ); label->setColor( black ); m_localFrame->add( label ); m_localContent = new WidgetComposite(); TableLayout* localLayout = new TableLayout( m_localContent, 4 ); localLayout->setHorizontalSpacing( 10 ); localLayout->setColumnStretch( 1, FILL ); m_localContent->setLayout( localLayout ); m_localContent->setWidth( 265 ); m_localFrame->add( m_localContent ); /* m_infoArea = new TextArea( 540, 200 ); m_infoArea->setFont( "tahoma.ttf", 12 ); m_infoArea->setColor( black ); m_infoArea->appendLine( "" );*/ m_allPlayerContent->add( m_playerFrame ); m_allPlayerContent->add( m_localFrame ); // m_allPlayerContent->add( m_infoArea ); patLayout->setStretch( m_playerFrame, FILL ); patLayout->setStretch( m_localFrame, FILL ); // patLayout->setStretch( m_infoArea, FILL ); // m_playerAndTeamContent->setHeight( 200 ); WidgetComposite* buttonRow = new WidgetComposite(); HorizontalLayout* buttonRowLayout = new HorizontalLayout( buttonRow ); buttonRow->setLayout( buttonRowLayout ); buttonRowLayout->setSpacing( 5 ); m_goButton = new TextButton( "Go!" ); m_goButton->setHighlightable( true ); m_goButton->addActionListener( this ); buttonRow->add( m_goButton ); buttonRowLayout->setStretch( m_goButton, FILL ); m_backButton = new TextButton( "Back" ); m_backButton->setHighlightable( true ); m_backButton->addActionListener( this ); buttonRow->add( m_backButton ); buttonRowLayout->setStretch( m_backButton, FILL ); buttonRow->setWidth( 540 ); m_generalContent->setWidth( 540 ); m_content->add( m_generalContent ); m_allPlayerContent->setWidth( 540 ); m_content->add( m_allPlayerContent ); // m_content->add( m_playerFrame ); /* m_content->add( m_infoArea );*/ m_content->add( buttonRow ); setTitle( "Game Information" ); setWidget( m_content ); } void GameInfoWindow::setInfo( ServerEntry* entry, InfoMessage* infoMessage, Player* player, std::vector bots, Video* video ) { if ( entry->type == ServerEntry::DIRECT ) { m_addressField->setText( "Local server" ); } else if ( entry->type == ServerEntry::REMOTE ) { RemoteServerEntry* remoteEntry = static_cast( entry ); //m_addressField->setText( remoteEntry->name ); // this segfaults for me (32bit, Linux), Tom m_addressField->setText( "Remote server" ); } switch ( infoMessage->gamemode ) { case DEATHMATCH: m_gamemodeField->setText( "Deathmatch" ); break; case TEAMPLAY: m_gamemodeField->setText( "Team deathmatch" ); break; default: m_gamemodeField->setText( "Unknown" ); } m_video = video; m_world.setSpriteInterface( video->getSpriteInterface() ); m_world.getScorekeeper()->setGameMode( infoMessage->gamemode ); m_player = player; m_bots = bots; // std::map teamMap; // m_infoArea->clear(); m_playerContent->removeAndDeleteAll(); if ( infoMessage->player.size() == 0 ) { TextLabel* label = new TextLabel( "tahoma.ttf", 12, "World is empty" ); SDL_Color black = { 0, 0, 0, 0 }; label->setColor( black ); m_playerContent->add( label ); // m_infoArea->appendLine( "No players in the world" ); } else { for ( unsigned int i = 0; i < infoMessage->player.size(); i++ ) { Player* p = infoMessage->player[i]; addPlayerToWidget( p, m_playerContent ); } } rebuildLocalContent(); /* if ( infoMessage->gamemode == TEAMPLAY ) { std::map::const_iterator it; for ( it = teamMap.begin(); it != teamMap.end(); it++ ) { int teamID = it->first; int playersInTeam = it->second; std::ostringstream os; os << "Team " << teamID << " consists of " << playersInTeam << " player(s)"; // m_infoArea->appendLine( os.str() ); } }*/ } void GameInfoWindow::actionPerformed( Uint32 cmd, void* source ) { if ( source == m_goButton && cmd == Button::BUTTON_PRESSED ) { fireAction( GO_PRESSED, this ); } else if ( source == m_backButton && cmd == Button::BUTTON_PRESSED ) { fireAction( BACK_PRESSED, this ); } else if ( source == m_playerConfigWindow && cmd == PlayerConfigWindow::OK_PRESSED ) { m_selectedPlayer->setName( m_playerConfigWindow->getName().c_str() ); m_selectedPlayer->setTeamID( m_playerConfigWindow->getTeamID() ); Uint32 color = m_playerConfigWindow->getColorR() << 16 | m_playerConfigWindow->getColorG() << 8 | m_playerConfigWindow->getColorB(); m_selectedPlayer->setPlayerColor( color ); RootContainer* root = getRoot(); m_gui->lock(); root->remove( m_playerConfigWindow ); rebuildLocalContent(); root->add( this ); m_gui->unlock(); delete m_playerConfigWindow; m_playerConfigWindow = 0; } else if ( source == m_playerConfigWindow && cmd == PlayerConfigWindow::CANCEL_PRESSED ) { RootContainer* root = getRoot(); m_gui->lock(); root->remove( m_playerConfigWindow ); root->add( this ); m_gui->unlock(); delete m_playerConfigWindow; m_playerConfigWindow = 0; } else { for ( std::vector::iterator it = m_configureButtons.begin(); it != m_configureButtons.end(); it++ ) { if ( source == *it && cmd == Button::BUTTON_PRESSED ) { if ( it == m_configureButtons.begin() ) m_selectedPlayer = m_player; else m_selectedPlayer = m_bots[it - m_configureButtons.begin() - 1]; // fireAction( CONFIGURE_PRESSED, this ); RootContainer* root = getRoot(); m_playerConfigWindow = new PlayerConfigWindow( m_selectedPlayer ); m_playerConfigWindow->setPosition( ( root->getWidth() - m_playerConfigWindow->getWidth() ) / 2, ( root->getHeight() - m_playerConfigWindow->getHeight() ) / 2 ); m_playerConfigWindow->addActionListener( this ); m_gui->lock(); root->remove( this ); root->add( m_playerConfigWindow ); m_gui->unlock(); break; } } } } bool GameInfoWindow::handleEvent( SDL_Event* event ) { if ( event->type == SDL_KEYDOWN ) { if ( event->key.keysym.sym == SDLK_ESCAPE ) { fireAction( BACK_PRESSED, this ); return true; } } return WopWindow::handleEvent( event ); } void GameInfoWindow::addPlayerToWidget( Player* player, WidgetComposite* widget ) { // ugly, ugly, ugly... player->setPlayerColor( player->getPlayerColor() ); AvatarWorm avatar; avatar.setWorldPointer( &m_world ); player->attachAvatar( &avatar ); avatar.setDirection( Avatar::RIGHT ); const Sprite* sprite = m_video->getSprites().getSprite( avatar ); Image* image = new Image( sprite->getWidth(), sprite->getHeight() ); SDL_Color colorkey = { 254, 0, 254, 0 }; Uint32 color = SDL_MapRGB( image->getSurface()->format, colorkey.r, colorkey.g, colorkey.b ); SDL_FillRect( image->getSurface(), 0, color ); SDL_SetColorKey( image->getSurface(), SDL_SRCCOLORKEY | SDL_RLEACCEL, color ); avatar.setPos( 10, 16 ); m_video->getSprites().draw( avatar, image->getSurface() ); player->detachAvatar(); widget->add( image ); TextLabel* label = new TextLabel( player->getName().getString(), 12 ); 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 ); label->setColor( textColor ); widget->add( label ); std::ostringstream os; if ( m_world.getScorekeeper()->getGameMode() == TEAMPLAY ) { os << static_cast( player->getTeamID() ); label = new TextLabel( os.str(), 12 ); label->setColor( textColor ); widget->add( label ); /* if ( teamMap.find( player->getTeamID() ) == teamMap.end() ) teamMap[player->getTeamID()] = 1; else teamMap[player->getTeamID()]++;*/ } else { label = new TextLabel( "N/A", 12 ); label->setColor( textColor ); widget->add( label ); } } void GameInfoWindow::rebuildLocalContent() { // rebuild local content m_localContent->removeAndDeleteAll(); m_configureButtons.clear(); if ( m_player ) { addPlayerToWidget( m_player, m_localContent ); TextButton* button = new TextButton( "Configure" ); button->setHighlightable( true ); button->addActionListener( this ); m_localContent->add( button ); m_configureButtons.push_back( button ); } for ( unsigned int i = 0; i < m_bots.size(); i++ ) { Bot* bot = m_bots[i]; addPlayerToWidget( bot, m_localContent ); TextButton* button = new TextButton( "Configure" ); m_localContent->add( button ); button->setHighlightable( true ); button->addActionListener( this ); m_configureButtons.push_back( button ); } }