doom3-bfg/neo/d3xp/menus/MenuHandler_Scoreboard.cpp

614 lines
No EOL
15 KiB
C++

/*
===========================================================================
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();
}
}
}