/* =========================================================================== 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 . 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 ), repeatDelay( DEFAULT_REPEAT_TIME ), screenIndex( -1 ), 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 ), waitForBinding( false ), waitBind( NULL ), menuBar( NULL ), pacifier( NULL ), timeRemaining( 0 ), nextPeerUpdateMs( 0 ), newGameType( 0 ), inGame( false ), showingIntro( false ), continueWaitForEnumerate( false ), gameComplete( false ), introGui( NULL ), typeSoundShader( NULL ), doom3Intro( NULL ), roeIntro( NULL ), lmIntro( NULL ), 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 mpGameModes; idList 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__