123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- /*
- ===========================================================================
- Doom 3 BFG Edition GPL Source Code
- Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
- Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #pragma hdrstop
- #include "../../idLib/precompiled.h"
- #include "../Game_local.h"
- /*
- ========================
- idMenuHandler_Scoreboard::Update
- ========================
- */
- void idMenuHandler_Scoreboard::Update() {
- if ( gui == NULL || !gui->IsActive() ) {
- return;
- }
- if ( nextScreen != activeScreen ) {
- if ( nextScreen == SCOREBOARD_AREA_INVALID ) {
- if ( activeScreen > SCOREBOARD_AREA_INVALID && activeScreen < SCOREBOARD_NUM_AREAS && menuScreens[ activeScreen ] != NULL ) {
- menuScreens[ activeScreen ]->HideScreen( static_cast<mainMenuTransition_t>(transition) );
- }
- idMenuWidget_CommandBar * cmdBar = dynamic_cast< idMenuWidget_CommandBar * >( GetChildFromIndex( SCOREBOARD_WIDGET_CMD_BAR ) );
- if ( cmdBar != NULL ) {
- cmdBar->ClearAllButtons();
- cmdBar->Update();
- }
- idSWFSpriteInstance * bg = gui->GetRootObject().GetNestedSprite( "background" );
- if ( bg != NULL ) {
- bg->PlayFrame( "rollOff" );
- }
- } else {
- if ( activeScreen > SCOREBOARD_AREA_INVALID && activeScreen < SCOREBOARD_NUM_AREAS && menuScreens[ activeScreen ] != NULL ) {
- menuScreens[ activeScreen ]->HideScreen( static_cast<mainMenuTransition_t>(transition) );
- }
- if ( nextScreen > SCOREBOARD_AREA_INVALID && nextScreen < SCOREBOARD_NUM_AREAS && menuScreens[ nextScreen ] != NULL ) {
- menuScreens[ nextScreen ]->UpdateCmds();
- menuScreens[ nextScreen ]->ShowScreen( static_cast<mainMenuTransition_t>(transition) );
- }
- }
- transition = MENU_TRANSITION_INVALID;
- activeScreen = nextScreen;
- }
- idMenuHandler::Update();
- }
- /*
- ========================
- idMenuHandler_Scoreboard::ActivateMenu
- ========================
- */
- void idMenuHandler_Scoreboard::TriggerMenu() {
- nextScreen = activationScreen;
- }
- /*
- ========================
- idMenuHandler_Scoreboard::ActivateMenu
- ========================
- */
- void idMenuHandler_Scoreboard::ActivateMenu( bool show ) {
- idMenuHandler::ActivateMenu( show );
- idPlayer * player = gameLocal.GetLocalPlayer();
- if ( player == NULL ) {
- return;
- }
- if ( show ) {
- idMenuWidget_CommandBar * cmdBar = dynamic_cast< idMenuWidget_CommandBar * >( GetChildFromIndex( SCOREBOARD_WIDGET_CMD_BAR ) );
- if ( cmdBar != NULL ) {
- cmdBar->ClearAllButtons();
- cmdBar->Update();
- }
- nextScreen = SCOREBOARD_AREA_INVALID;
- activeScreen = SCOREBOARD_AREA_INVALID;
- } else {
- activeScreen = SCOREBOARD_AREA_INVALID;
- nextScreen = SCOREBOARD_AREA_INVALID;
- }
- class idSWFScriptFunction_activateMenu : public idSWFScriptFunction_RefCounted {
- public:
- idSWFScriptFunction_activateMenu( idMenuHandler * _handler ) {
- handler = _handler;
- }
- idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ) {
- if ( handler != NULL ) {
- handler->TriggerMenu();
- }
- return idSWFScriptVar();
- }
- private:
- idMenuHandler * handler;
- };
- gui->SetGlobal( "activateMenus", new (TAG_SWF) idSWFScriptFunction_activateMenu( this ) );
- }
- /*
- ========================
- idMenuHandler_Scoreboard::Initialize
- ========================
- */
- void idMenuHandler_Scoreboard::Initialize( const char * swfFile, idSoundWorld * sw ) {
- idMenuHandler::Initialize( swfFile, sw );
- //---------------------
- // Initialize the menus
- //---------------------
- #define BIND_SCOREBOARD_SCREEN( screenId, className, menuHandler ) \
- menuScreens[ (screenId) ] = new className(); \
- menuScreens[ (screenId) ]->Initialize( menuHandler ); \
- menuScreens[ (screenId) ]->AddRef();
- for ( int i = 0; i < SCOREBOARD_NUM_AREAS; ++i ) {
- menuScreens[ i ] = NULL;
- }
- BIND_SCOREBOARD_SCREEN( SCOREBOARD_AREA_DEFAULT, idMenuScreen_Scoreboard, this );
- BIND_SCOREBOARD_SCREEN( SCOREBOARD_AREA_TEAM, idMenuScreen_Scoreboard_Team, this );
- //
- // command bar
- //
- idMenuWidget_CommandBar * const commandBarWidget = new (TAG_SWF) idMenuWidget_CommandBar();
- commandBarWidget->SetAlignment( idMenuWidget_CommandBar::LEFT );
- commandBarWidget->SetSpritePath( "prompts" );
- commandBarWidget->Initialize( this );
- AddChild( commandBarWidget );
- class idScoreboardGUIClose : public idSWFScriptFunction_RefCounted {
- public:
- idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ) {
- gameLocal.mpGame.SetScoreboardActive( false );
- return idSWFScriptVar();
- }
- };
- if ( gui != NULL ) {
- gui->SetGlobal( "closeScoreboard", new idScoreboardGUIClose() );
- }
- // precache sounds
- // don't load gui music for the pause menu to save some memory
- const idSoundShader * soundShader = NULL;
- soundShader = declManager->FindSound( "gui/list_scroll", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_SCROLL ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/btn_PDA_advance", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_ADVANCE ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/btn_PDA_back", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_BACK ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/pda_next_tab", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_BUILD_ON ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/pda_prev_tab", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_BUILD_OFF ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/btn_set_focus", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_FOCUS ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/btn_roll_over", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_ROLL_OVER ] = soundShader->GetName();
- }
- soundShader = declManager->FindSound( "gui/btn_roll_out", true );
- if ( soundShader != NULL ) {
- sounds[ GUI_SOUND_ROLL_OUT ] = soundShader->GetName();
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::GetMenuScreen
- ========================
- */
- idMenuScreen * idMenuHandler_Scoreboard::GetMenuScreen( int index ) {
- if ( index < 0 || index >= SCOREBOARD_NUM_AREAS ) {
- return NULL;
- }
- return menuScreens[ index ];
- }
- /*
- ========================
- idMenuHandler_Scoreboard::HandleAction
- ========================
- */
- bool idMenuHandler_Scoreboard::HandleAction( idWidgetAction & action, const idWidgetEvent & event, idMenuWidget * widget, bool forceHandled ) {
- if ( activeScreen == SCOREBOARD_AREA_INVALID ) {
- return true;
- }
- widgetAction_t actionType = action.GetType();
- //const idSWFParmList & parms = action.GetParms();
- if ( event.type == WIDGET_EVENT_COMMAND ) {
- if ( menuScreens[ activeScreen ] != NULL && !forceHandled ) {
- if ( menuScreens[ activeScreen ]->HandleAction( action, event, widget, true ) ) {
- if ( actionType == WIDGET_ACTION_GO_BACK ) {
- PlaySound( GUI_SOUND_BACK );
- } else {
- PlaySound( GUI_SOUND_ADVANCE );
- }
- return true;
- }
- }
- }
- return idMenuHandler::HandleAction( action, event, widget, forceHandled );
- }
- /*
- ========================
- idMenuHandler_Scoreboard::AddPlayerInfo
- ========================
- */
- void idMenuHandler_Scoreboard::AddPlayerInfo( int index, voiceStateDisplay_t voiceState, int team, idStr name, int score, int wins, int ping, idStr spectateData ) {
-
- scoreboardInfo_t info;
- idList< idStr > values;
- values.Append( name );
- if ( spectateData.IsEmpty() || gameLocal.mpGame.GetGameState() == idMultiplayerGame::GAMEREVIEW ) {
- values.Append( va( "%i", score ) );
- } else {
- values.Append( spectateData );
- }
- values.Append( va( "%i", wins ) );
- values.Append( va( "%i", ping ) );
- info.index = index;
- info.voiceState = voiceState;
- info.values = values;
- if ( team == 1 ) {
- blueInfo.Append( info );
- } else {
- redInfo.Append( info );
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::UpdateScoreboard
- ========================
- */
- void idMenuHandler_Scoreboard::UpdateSpectating( idStr spectate, idStr follow ) {
- if ( nextScreen == SCOREBOARD_AREA_DEFAULT ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_DEFAULT ] );
- if ( screen ) {
- screen->UpdateSpectating( spectate, follow );
- }
- } else if ( nextScreen == SCOREBOARD_AREA_TEAM ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_TEAM ] );
- if ( screen ) {
- screen->UpdateSpectating( spectate, follow );
- }
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::UpdateScoreboard
- ========================
- */
- void idMenuHandler_Scoreboard::UpdateScoreboard( idList< mpScoreboardInfo > & data, idStr gameInfo ) {
- bool changed = false;
- if ( data.Num() != scoreboardInfo.Num() ) {
- changed = true;
- } else {
- for ( int i = 0; i < data.Num(); ++i ) {
- if ( data[i] != scoreboardInfo[i] ) {
- changed = true;
- break;
- }
- }
- }
- if ( nextScreen == SCOREBOARD_AREA_DEFAULT ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_DEFAULT ] );
- if ( screen ) {
- screen->UpdateGameInfo( gameInfo );
- screen->UpdateTeamScores( redScore, blueScore );
- }
- } else if ( nextScreen == SCOREBOARD_AREA_TEAM ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_TEAM ] );
- if ( screen ) {
- screen->UpdateGameInfo( gameInfo );
- screen->UpdateTeamScores( redScore, blueScore );
- }
- }
- redInfo.Clear();
- blueInfo.Clear();
- for ( int i = 0; i < data.Num(); ++i ) {
- AddPlayerInfo( data[i].playerNum, data[i].voiceState, data[i].team, data[i].name, data[i].score, data[i].wins, data[i].ping, data[i].spectateData );
- }
- idList< scoreboardInfo_t, TAG_IDLIB_LIST_MENU > listItemInfo;
- for ( int i = 0; i < redInfo.Num(); ++i ) {
- listItemInfo.Append( redInfo[i] );
- }
- // add empty items to list
- if ( blueInfo.Num() > 0 ) {
- while ( listItemInfo.Num() < 4 ) {
- scoreboardInfo_t info;
- listItemInfo.Append( info );
- }
- }
- for ( int i = 0; i < blueInfo.Num(); ++i ) {
- listItemInfo.Append( blueInfo[i] );
- }
- while ( listItemInfo.Num() < 8 ) {
- scoreboardInfo_t info;
- listItemInfo.Append( info );
- }
- if ( nextScreen == SCOREBOARD_AREA_DEFAULT || activationScreen == SCOREBOARD_AREA_DEFAULT ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_DEFAULT ] );
- if ( screen ) {
- screen->SetPlayerData( listItemInfo );
- }
- } else if ( nextScreen == SCOREBOARD_AREA_TEAM || activationScreen == SCOREBOARD_AREA_TEAM ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_TEAM ] );
- if ( screen ) {
- screen->SetPlayerData( listItemInfo );
- }
- }
- scoreboardInfo = data;
- }
- /*
- ========================
- idMenuHandler_Scoreboard::SetTeamScore
- ========================
- */
- void idMenuHandler_Scoreboard::SetTeamScores( int r, int b ) {
- redScore = r;
- blueScore = b;
- }
- /*
- ========================
- idMenuHandler_Scoreboard::GetNumPlayers
- ========================
- */
- int idMenuHandler_Scoreboard::GetNumPlayers( int team ) {
- if ( team == 1 ) {
- return blueInfo.Num();
- } else {
- return redInfo.Num();
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::SetActivationScreen
- ========================
- */
- void idMenuHandler_Scoreboard::SetActivationScreen( int screen, int trans ) {
- activationScreen = screen;
- transition = trans;
- }
- /*
- ========================
- idMenuHandler_Scoreboard::GetUserID
- ========================
- */
- void idMenuHandler_Scoreboard::GetUserID( int slot, lobbyUserID_t & luid ) {
- idList< int > redList;
- idList< int > blueList;
- for ( int i = 0; i < scoreboardInfo.Num(); ++i ) {
- if ( scoreboardInfo[i].team == 1 ) {
- blueList.Append( scoreboardInfo[i].playerNum );
- } else {
- redList.Append( scoreboardInfo[i].playerNum );
- }
- }
- idList< int > displayList;
- for ( int i = 0; i < redList.Num(); ++i ) {
- displayList.Append( redList[ i ] );
- }
- for ( int i = 0; i < blueList.Num(); ++i ) {
- displayList.Append( blueList[ i ] );
- }
- if ( slot >= displayList.Num() ) {
- return;
- }
- luid = gameLocal.lobbyUserIDs[ displayList[ slot ] ];
- }
- /*
- ========================
- idMenuHandler_Scoreboard::ViewPlayerProfile
- ========================
- */
- void idMenuHandler_Scoreboard::ViewPlayerProfile( int slot ) {
- lobbyUserID_t luid;
- GetUserID( slot, luid );
- if ( luid.IsValid() ) {
- session->ShowLobbyUserGamerCardUI( luid );
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::MutePlayer
- ========================
- */
- void idMenuHandler_Scoreboard::MutePlayer( int slot ) {
- lobbyUserID_t luid;
- GetUserID( slot, luid );
- if ( luid.IsValid() ) {
- session->ToggleLobbyUserVoiceMute( luid );
- }
- }
- /*
- ========================
- idMenuHandler_Scoreboard::UpdateScoreboardSelection
- ========================
- */
- void idMenuHandler_Scoreboard::UpdateScoreboardSelection() {
-
- if ( nextScreen == SCOREBOARD_AREA_DEFAULT || activationScreen == SCOREBOARD_AREA_DEFAULT ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_DEFAULT ] );
- if ( screen ) {
- screen->UpdateHighlight();
- }
- } else if ( nextScreen == SCOREBOARD_AREA_TEAM || activationScreen == SCOREBOARD_AREA_TEAM ) {
- idMenuScreen_Scoreboard * screen = dynamic_cast< idMenuScreen_Scoreboard * >( menuScreens[ SCOREBOARD_AREA_TEAM ] );
- if ( screen ) {
- screen->UpdateHighlight();
- }
- }
- }
|