mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2024-12-02 17:02:17 +00:00
622 lines
No EOL
15 KiB
C++
622 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.
|
|
|
|
===========================================================================
|
|
*/
|
|
#ifndef __MENUDATA_H__
|
|
#define __MENUDATA_H__
|
|
|
|
enum shellAreas_t
|
|
{
|
|
SHELL_AREA_INVALID = -1,
|
|
SHELL_AREA_START,
|
|
SHELL_AREA_ROOT,
|
|
SHELL_AREA_DEV,
|
|
SHELL_AREA_CAMPAIGN,
|
|
SHELL_AREA_LOAD,
|
|
SHELL_AREA_SAVE,
|
|
SHELL_AREA_NEW_GAME,
|
|
SHELL_AREA_GAME_OPTIONS,
|
|
SHELL_AREA_SYSTEM_OPTIONS,
|
|
SHELL_AREA_MULTIPLAYER,
|
|
SHELL_AREA_GAME_LOBBY,
|
|
SHELL_AREA_STEREOSCOPICS,
|
|
SHELL_AREA_PARTY_LOBBY,
|
|
SHELL_AREA_SETTINGS,
|
|
SHELL_AREA_AUDIO,
|
|
SHELL_AREA_VIDEO,
|
|
SHELL_AREA_KEYBOARD,
|
|
SHELL_AREA_CONTROLS,
|
|
SHELL_AREA_CONTROLLER_LAYOUT,
|
|
SHELL_AREA_GAMEPAD,
|
|
SHELL_AREA_PAUSE,
|
|
SHELL_AREA_LEADERBOARDS,
|
|
SHELL_AREA_PLAYSTATION,
|
|
SHELL_AREA_DIFFICULTY,
|
|
SHELL_AREA_RESOLUTION,
|
|
SHELL_AREA_MATCH_SETTINGS,
|
|
SHELL_AREA_MODE_SELECT,
|
|
SHELL_AREA_BROWSER,
|
|
SHELL_AREA_CREDITS,
|
|
SHELL_NUM_AREAS
|
|
};
|
|
|
|
enum shellState_t
|
|
{
|
|
SHELL_STATE_INVALID = -1,
|
|
SHELL_STATE_PRESS_START,
|
|
SHELL_STATE_IDLE,
|
|
SHELL_STATE_PARTY_LOBBY,
|
|
SHELL_STATE_GAME_LOBBY,
|
|
SHELL_STATE_PAUSED,
|
|
SHELL_STATE_CONNECTING,
|
|
SHELL_STATE_SEARCHING,
|
|
SHELL_STATE_LOADING,
|
|
SHELL_STATE_BUSY,
|
|
SHELL_STATE_IN_GAME
|
|
};
|
|
|
|
enum pdaAreas_t
|
|
{
|
|
PDA_AREA_INVALID = -1,
|
|
PDA_AREA_USER_DATA,
|
|
PDA_AREA_USER_EMAIL,
|
|
PDA_AREA_VIDEO_DISKS,
|
|
PDA_AREA_INVENTORY,
|
|
PDA_NUM_AREAS
|
|
};
|
|
|
|
enum hudArea_t
|
|
{
|
|
HUD_AREA_INVALID = -1,
|
|
HUD_AREA_PLAYING,
|
|
HUD_NUM_AREAS
|
|
};
|
|
|
|
enum scoreboardArea_t
|
|
{
|
|
SCOREBOARD_AREA_INVALID = -1,
|
|
SCOREBOARD_AREA_DEFAULT,
|
|
SCOREBOARD_AREA_TEAM,
|
|
SCOREBOARD_AREA_CTF,
|
|
SCOREBOARD_NUM_AREAS
|
|
};
|
|
|
|
enum pdaHandlerWidgets_t
|
|
{
|
|
PDA_WIDGET_NAV_BAR,
|
|
PDA_WIDGET_PDA_LIST,
|
|
PDA_WIDGET_PDA_LIST_SCROLLBAR,
|
|
PDA_WIDGET_CMD_BAR
|
|
};
|
|
|
|
enum scoreboardHandlerWidgets_t
|
|
{
|
|
SCOREBOARD_WIDGET_CMD_BAR,
|
|
};
|
|
|
|
enum menuSounds_t
|
|
{
|
|
GUI_SOUND_MUSIC,
|
|
GUI_SOUND_SCROLL,
|
|
GUI_SOUND_ADVANCE,
|
|
GUI_SOUND_BACK,
|
|
GUI_SOUND_BUILD_ON,
|
|
GUI_SOUND_BUILD_OFF,
|
|
GUI_SOUND_FOCUS,
|
|
GUI_SOUND_ROLL_OVER,
|
|
GUI_SOUND_ROLL_OUT,
|
|
NUM_GUI_SOUNDS,
|
|
};
|
|
|
|
static const int MAX_SCREEN_AREAS = 32;
|
|
static const int DEFAULT_REPEAT_TIME = 150;
|
|
static const int WAIT_START_TIME_LONG = 30000;
|
|
static const int WAIT_START_TIME_SHORT = 5000;
|
|
|
|
struct actionRepeater_t
|
|
{
|
|
actionRepeater_t() :
|
|
widget( NULL ),
|
|
numRepetitions( 0 ),
|
|
nextRepeatTime( 0 ),
|
|
screenIndex( -1 ),
|
|
repeatDelay( DEFAULT_REPEAT_TIME ),
|
|
isActive( false )
|
|
{
|
|
}
|
|
|
|
idMenuWidget* widget;
|
|
idWidgetEvent event;
|
|
idWidgetAction action;
|
|
int numRepetitions;
|
|
int nextRepeatTime;
|
|
int repeatDelay;
|
|
int screenIndex;
|
|
bool isActive;
|
|
};
|
|
|
|
class mpScoreboardInfo
|
|
{
|
|
public:
|
|
|
|
mpScoreboardInfo() :
|
|
voiceState( VOICECHAT_DISPLAY_NONE ),
|
|
score( 0 ),
|
|
wins( 0 ),
|
|
ping( 0 ),
|
|
team( -1 ),
|
|
playerNum( 0 )
|
|
{
|
|
}
|
|
|
|
mpScoreboardInfo( const mpScoreboardInfo& src )
|
|
{
|
|
voiceState = src.voiceState;
|
|
score = src.score;
|
|
wins = src.wins;
|
|
ping = src.ping;
|
|
spectateData = src.spectateData;
|
|
name = src.name;
|
|
team = src.team;
|
|
playerNum = src.playerNum;
|
|
}
|
|
|
|
void operator=( const mpScoreboardInfo& src )
|
|
{
|
|
voiceState = src.voiceState;
|
|
score = src.score;
|
|
wins = src.wins;
|
|
ping = src.ping;
|
|
spectateData = src.spectateData;
|
|
name = src.name;
|
|
team = src.team;
|
|
playerNum = src.playerNum;
|
|
}
|
|
|
|
bool operator!=( const mpScoreboardInfo& otherInfo ) const
|
|
{
|
|
|
|
if( otherInfo.score != score || otherInfo.wins != wins || otherInfo.ping != ping ||
|
|
otherInfo.spectateData != spectateData || otherInfo.name != name || otherInfo.team != team ||
|
|
otherInfo.playerNum != playerNum || otherInfo.voiceState != voiceState )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool operator==( const mpScoreboardInfo& otherInfo ) const
|
|
{
|
|
|
|
if( otherInfo.score != score || otherInfo.wins != wins || otherInfo.ping != ping ||
|
|
otherInfo.spectateData != spectateData || otherInfo.name != name || otherInfo.team != team ||
|
|
otherInfo.playerNum != playerNum || otherInfo.voiceState != voiceState )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
voiceStateDisplay_t voiceState;
|
|
int score;
|
|
int wins;
|
|
int ping;
|
|
int team;
|
|
int playerNum;
|
|
idStr spectateData;
|
|
idStr name;
|
|
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
idMenuHandler
|
|
================================================
|
|
*/
|
|
class idMenuHandler
|
|
{
|
|
public:
|
|
idMenuHandler();
|
|
virtual ~idMenuHandler();
|
|
virtual void Initialize( const char* swfFile, idSoundWorld* sw );
|
|
virtual void Cleanup();
|
|
virtual void Update();
|
|
virtual void UpdateChildren();
|
|
virtual void UpdateMenuDisplay( int menu );
|
|
virtual bool HandleGuiEvent( const sysEvent_t* sev );
|
|
virtual bool IsActive();
|
|
virtual void ActivateMenu( bool show );
|
|
virtual void TriggerMenu();
|
|
virtual bool HandleAction( idWidgetAction& action, const idWidgetEvent& event, idMenuWidget* widget, bool forceHandled = false );
|
|
virtual int ActiveScreen()
|
|
{
|
|
return activeScreen;
|
|
}
|
|
virtual int NextScreen()
|
|
{
|
|
return nextScreen;
|
|
}
|
|
virtual int MenuTransition()
|
|
{
|
|
return transition;
|
|
}
|
|
virtual idMenuScreen* GetMenuScreen( int index )
|
|
{
|
|
return NULL;
|
|
}
|
|
virtual void SetNextScreen( int screen, int trans )
|
|
{
|
|
nextScreen = screen;
|
|
transition = trans;
|
|
}
|
|
|
|
virtual void StartWidgetActionRepeater( idMenuWidget* widget, const idWidgetAction& action, const idWidgetEvent& event );
|
|
virtual void PumpWidgetActionRepeater();
|
|
virtual void ClearWidgetActionRepeater();
|
|
virtual idSWF* GetGUI()
|
|
{
|
|
return gui;
|
|
}
|
|
virtual void AddChild( idMenuWidget* widget );
|
|
virtual idMenuWidget* GetChildFromIndex( int index );
|
|
virtual int GetPlatform( bool realPlatform = false );
|
|
virtual void PlaySound( menuSounds_t type, int channel = -1 );
|
|
virtual void StopSound( int channel = SCHANNEL_ANY );
|
|
|
|
idMenuWidget_CommandBar* GetCmdBar()
|
|
{
|
|
return cmdBar;
|
|
}
|
|
|
|
protected:
|
|
|
|
bool scrollingMenu;
|
|
int scrollCounter;
|
|
int activeScreen;
|
|
int nextScreen;
|
|
int transition;
|
|
int platform;
|
|
idSWF* gui;
|
|
actionRepeater_t actionRepeater;
|
|
idMenuScreen* menuScreens[MAX_SCREEN_AREAS];
|
|
idList< idMenuWidget*, TAG_IDLIB_LIST_MENU> children;
|
|
|
|
idStaticList< idStr, NUM_GUI_SOUNDS > sounds;
|
|
|
|
idMenuWidget_CommandBar* cmdBar;
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
lobbyPlayerInfo_t
|
|
================================================
|
|
*/
|
|
struct lobbyPlayerInfo_t
|
|
{
|
|
lobbyPlayerInfo_t() :
|
|
partyToken( 0 ),
|
|
voiceState( VOICECHAT_DISPLAY_NONE )
|
|
{
|
|
}
|
|
|
|
idStr name;
|
|
int partyToken;
|
|
voiceStateDisplay_t voiceState;
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
idMenuHandler_Shell
|
|
================================================
|
|
*/
|
|
class idMenuHandler_Shell : public idMenuHandler
|
|
{
|
|
public:
|
|
idMenuHandler_Shell() :
|
|
state( SHELL_STATE_INVALID ),
|
|
nextState( SHELL_STATE_INVALID ),
|
|
smallFrameShowing( false ),
|
|
largeFrameShowing( false ),
|
|
bgShowing( true ),
|
|
nextPeerUpdateMs( 0 ),
|
|
inGame( false ),
|
|
waitForBinding( false ),
|
|
waitBind( NULL ),
|
|
newGameType( 0 ),
|
|
menuBar( NULL ),
|
|
pacifier( NULL ),
|
|
showingIntro( false ),
|
|
introGui( NULL ),
|
|
doom3Intro( NULL ),
|
|
roeIntro( NULL ),
|
|
lmIntro( NULL ),
|
|
typeSoundShader( NULL ),
|
|
continueWaitForEnumerate( false ),
|
|
gameComplete( false ),
|
|
marsRotation( NULL )
|
|
{
|
|
}
|
|
virtual void Update();
|
|
virtual void ActivateMenu( bool show );
|
|
virtual void Initialize( const char* swfFile, idSoundWorld* sw );
|
|
virtual void Cleanup();
|
|
virtual bool HandleAction( idWidgetAction& action, const idWidgetEvent& event, idMenuWidget* widget, bool forceHandled = false );
|
|
virtual idMenuScreen* GetMenuScreen( int index );
|
|
virtual bool HandleGuiEvent( const sysEvent_t* sev );
|
|
|
|
void UpdateSavedGames();
|
|
void ShowSmallFrame( bool show );
|
|
void ShowMPFrame( bool show );
|
|
void ShowLogo( bool show );
|
|
void SetShellState( shellState_t s )
|
|
{
|
|
nextState = s;
|
|
}
|
|
bool IsSmallFrameShowing()
|
|
{
|
|
return smallFrameShowing;
|
|
}
|
|
void UpdateBGState();
|
|
void GetMapName( int index, idStr& name );
|
|
void GetModeName( int index, idStr& name );
|
|
|
|
idMenuWidget* GetPacifier()
|
|
{
|
|
return pacifier;
|
|
}
|
|
idMenuWidget_MenuBar* GetMenuBar()
|
|
{
|
|
return menuBar;
|
|
}
|
|
bool IsPacifierVisible() const
|
|
{
|
|
return ( pacifier != NULL && pacifier->GetSprite() != NULL ) ? pacifier->GetSprite()->IsVisible() : false;
|
|
}
|
|
void ShowPacifier( const idStr& msg );
|
|
void HidePacifier();
|
|
|
|
void SetTimeRemaining( int time )
|
|
{
|
|
timeRemaining = time;
|
|
}
|
|
int GetTimeRemaining()
|
|
{
|
|
return timeRemaining;
|
|
}
|
|
void SetNewGameType( int type )
|
|
{
|
|
newGameType = type;
|
|
}
|
|
int GetNewGameType()
|
|
{
|
|
return newGameType;
|
|
}
|
|
void SetInGame( bool val )
|
|
{
|
|
inGame = val;
|
|
}
|
|
bool GetInGame()
|
|
{
|
|
return inGame;
|
|
}
|
|
void HandleExitGameBtn();
|
|
void SetupPCOptions();
|
|
void SetWaitForBinding( const char* bind )
|
|
{
|
|
waitForBinding = true;
|
|
waitBind = bind;
|
|
}
|
|
void ClearWaitForBinding()
|
|
{
|
|
waitForBinding = false;
|
|
}
|
|
void UpdateLeaderboard( const idLeaderboardCallback* callback );
|
|
void UpdateLobby( idMenuWidget_LobbyList* lobbyList );
|
|
void ShowDoomIntro();
|
|
void ShowROEIntro();
|
|
void ShowLEIntro();
|
|
void StartGame( int index );
|
|
void SetContinueWaitForEnumerate( bool wait )
|
|
{
|
|
continueWaitForEnumerate = wait;
|
|
}
|
|
void SetCanContinue( bool valid );
|
|
void SetGameComplete()
|
|
{
|
|
gameComplete = true;
|
|
}
|
|
bool GetGameComplete()
|
|
{
|
|
return gameComplete;
|
|
}
|
|
|
|
private:
|
|
|
|
shellState_t state;
|
|
shellState_t nextState;
|
|
bool smallFrameShowing;
|
|
bool largeFrameShowing;
|
|
bool bgShowing;
|
|
bool waitForBinding;
|
|
const char* waitBind;
|
|
//idSysSignal deviceRequestedSignal;
|
|
|
|
idList<const char*, TAG_IDLIB_LIST_MENU> mpGameModes;
|
|
idList<mpMap_t, TAG_IDLIB_LIST_MENU> mpGameMaps;
|
|
idMenuWidget_MenuBar* menuBar;
|
|
idMenuWidget* pacifier;
|
|
int timeRemaining;
|
|
int nextPeerUpdateMs;
|
|
int newGameType;
|
|
bool inGame;
|
|
bool showingIntro;
|
|
bool continueWaitForEnumerate;
|
|
bool gameComplete;
|
|
idSWF* introGui;
|
|
const idSoundShader* typeSoundShader;
|
|
const idMaterial* doom3Intro;
|
|
const idMaterial* roeIntro;
|
|
const idMaterial* lmIntro;
|
|
const idMaterial* marsRotation;
|
|
idList< idStr, TAG_IDLIB_LIST_MENU> navOptions;
|
|
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
idMenuHandler_PDA
|
|
================================================
|
|
*/
|
|
class idMenuHandler_PDA : public idMenuHandler
|
|
{
|
|
public:
|
|
idMenuHandler_PDA() :
|
|
audioLogPlaying( false ),
|
|
videoPlaying( false ),
|
|
audioFile( NULL )
|
|
{
|
|
}
|
|
virtual ~idMenuHandler_PDA();
|
|
|
|
virtual void Update();
|
|
virtual void ActivateMenu( bool show );
|
|
virtual void TriggerMenu();
|
|
virtual void Initialize( const char* swfFile, idSoundWorld* sw );
|
|
virtual bool HandleAction( idWidgetAction& action, const idWidgetEvent& event, idMenuWidget* widget, bool forceHandled = false );
|
|
virtual idMenuScreen* GetMenuScreen( int index );
|
|
void UpdateAudioLogPlaying( bool playing );
|
|
void UdpateVideoPlaying( bool playing );
|
|
void ClearVideoPlaying()
|
|
{
|
|
videoPlaying = false;
|
|
}
|
|
|
|
bool PlayPDAAudioLog( int pdaIndex, int audioIndex );
|
|
virtual void Cleanup();
|
|
|
|
protected:
|
|
|
|
bool audioLogPlaying;
|
|
bool videoPlaying;
|
|
idList< idList< idStr, TAG_IDLIB_LIST_MENU >, TAG_IDLIB_LIST_MENU > pdaNames;
|
|
idList< idStr, TAG_IDLIB_LIST_MENU > navOptions;
|
|
const idDeclAudio* audioFile;
|
|
idMenuWidget_ScrollBar pdaScrollBar;
|
|
idMenuWidget_DynamicList pdaList;
|
|
idMenuWidget_NavBar navBar;
|
|
idMenuWidget_CommandBar commandBarWidget;
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
idMenuHandler_PDA
|
|
================================================
|
|
*/
|
|
class idMenuHandler_HUD : public idMenuHandler
|
|
{
|
|
public:
|
|
|
|
idMenuHandler_HUD() :
|
|
autoHideTip( true ),
|
|
tipStartTime( 0 ),
|
|
hiding( false ),
|
|
radioMessage( false )
|
|
{
|
|
}
|
|
|
|
virtual void Update();
|
|
virtual void ActivateMenu( bool show );
|
|
virtual void Initialize( const char* swfFile, idSoundWorld* sw );
|
|
virtual idMenuScreen* GetMenuScreen( int index );
|
|
|
|
idMenuScreen_HUD* GetHud();
|
|
void ShowTip( const char* title, const char* tip, bool autoHide );
|
|
void HideTip();
|
|
void SetRadioMessage( bool show )
|
|
{
|
|
radioMessage = show;
|
|
}
|
|
|
|
protected:
|
|
|
|
bool autoHideTip;
|
|
int tipStartTime;
|
|
bool hiding;
|
|
bool radioMessage;
|
|
|
|
};
|
|
|
|
/*
|
|
================================================
|
|
idMenuHandler_Scoreboard
|
|
================================================
|
|
*/
|
|
class idMenuHandler_Scoreboard : public idMenuHandler
|
|
{
|
|
public:
|
|
|
|
idMenuHandler_Scoreboard() :
|
|
redScore( 0 ),
|
|
blueScore( 0 ),
|
|
activationScreen( SCOREBOARD_AREA_INVALID )
|
|
{
|
|
}
|
|
|
|
virtual void Update();
|
|
virtual void TriggerMenu();
|
|
virtual void ActivateMenu( bool show );
|
|
virtual void Initialize( const char* swfFile, idSoundWorld* sw );
|
|
virtual idMenuScreen* GetMenuScreen( int index );
|
|
virtual bool HandleAction( idWidgetAction& action, const idWidgetEvent& event, idMenuWidget* widget, bool forceHandled = false );
|
|
|
|
void AddPlayerInfo( int index, voiceStateDisplay_t voiceState, int team, idStr name, int score, int wins, int ping, idStr spectateData );
|
|
void UpdateScoreboard( idList< mpScoreboardInfo >& data, idStr gameInfo );
|
|
void UpdateVoiceStates();
|
|
void UpdateSpectating( idStr spectate, idStr follow );
|
|
void SetTeamScores( int r, int b );
|
|
int GetNumPlayers( int team );
|
|
void SetActivationScreen( int screen, int trans );
|
|
void ViewPlayerProfile( int slot );
|
|
void MutePlayer( int slot );
|
|
void GetUserID( int slot, lobbyUserID_t& luid );
|
|
void UpdateScoreboardSelection();
|
|
|
|
protected:
|
|
|
|
int redScore;
|
|
int blueScore;
|
|
int activationScreen;
|
|
|
|
idList< mpScoreboardInfo > scoreboardInfo;
|
|
idList< scoreboardInfo_t, TAG_IDLIB_LIST_MENU > redInfo;
|
|
idList< scoreboardInfo_t, TAG_IDLIB_LIST_MENU> blueInfo;
|
|
|
|
};
|
|
|
|
|
|
#endif //__MENUDATA_H__
|