//============================================================================= void MainMenu::OnCommand( const char *command ) { int iUserSlot = CBaseModPanel::GetSingleton().GetLastActiveUserId(); if ( UI_IsDebug() ) { Msg("[GAMEUI] Handling main menu command %s from user%d ctrlr%d\n", command, iUserSlot, XBX_GetUserId( iUserSlot ) ); } bool bOpeningFlyout = false; if ( char const *szQuickMatch = StringAfterPrefix( command, "QuickMatch_" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() || CUIGameData::Get()->CheckAndDisplayErrorIfNotSignedInToLive( this ) ) return; KeyValues *pSettings = KeyValues::FromString( "settings", " system { " " network LIVE " " } " " game { " " mode = " " } " " options { " " action quickmatch " " } " ); KeyValues::AutoDelete autodelete( pSettings ); pSettings->SetString( "game/mode", szQuickMatch ); // TCR: We need to respect the default difficulty if ( GameModeHasDifficulty( szQuickMatch ) ) pSettings->SetString( "game/difficulty", GameModeGetDefaultDifficulty( szQuickMatch ) ); g_pMatchFramework->MatchSession( pSettings ); } else if ( char const *szCustomMatch = StringAfterPrefix( command, "CustomMatch_" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() || CUIGameData::Get()->CheckAndDisplayErrorIfNotSignedInToLive( this ) ) return; KeyValues *pSettings = KeyValues::FromString( "settings", " system { " " network LIVE " " } " " game { " " mode = " " } " " options { " " action custommatch " " } " ); KeyValues::AutoDelete autodelete( pSettings ); pSettings->SetString( "game/mode", szCustomMatch ); CBaseModPanel::GetSingleton().OpenWindow( ui_play_online_browser.GetBool() ? WT_FOUNDPUBLICGAMES : WT_GAMESETTINGS, this, true, pSettings ); } else if ( char const *szFriendsMatch = StringAfterPrefix( command, "FriendsMatch_" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; if ( StringHasPrefix( szFriendsMatch, "team" ) && CUIGameData::Get()->CheckAndDisplayErrorIfNotSignedInToLive( this ) ) // Team games require to be signed in to LIVE return; KeyValues *pSettings = KeyValues::FromString( "settings", " game { " " mode = " " } " ); KeyValues::AutoDelete autodelete( pSettings ); pSettings->SetString( "game/mode", szFriendsMatch ); if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow( WT_ALLGAMESEARCHRESULTS, this, true, pSettings ); } else if ( char const *szGroupServer = StringAfterPrefix( command, "GroupServer_" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; KeyValues *pSettings = KeyValues::FromString( "settings", " game { " // " mode = " " } " " options { " " action groupserver " " } " ); KeyValues::AutoDelete autodelete( pSettings ); if ( *szGroupServer ) pSettings->SetString( "game/mode", szGroupServer ); if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow( WT_STEAMGROUPSERVERS, this, true, pSettings ); } else if ( char const *szLeaderboards = StringAfterPrefix( command, "Leaderboards_" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() || CUIGameData::Get()->CheckAndDisplayErrorIfOffline( this, "#L4D360UI_MainMenu_SurvivalLeaderboards_Tip_Disabled" ) ) return; KeyValues *pSettings = KeyValues::FromString( "settings", " game { " " mode = " " } " ); KeyValues::AutoDelete autodelete( pSettings ); pSettings->SetString( "game/mode", szLeaderboards ); if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow( WT_LEADERBOARD, this, true, pSettings ); } else if( !Q_strcmp( command, "VersusSoftLock" ) ) { OnCommand( "FlmVersusFlyout" ); return; } else if ( !Q_strcmp( command, "SurvivalCheck" ) ) { OnCommand( "FlmSurvivalFlyout" ); return; } else if ( !Q_strcmp( command, "ScavengeCheck" ) ) { OnCommand( "FlmScavengeFlyout" ); return; } else if ( !Q_strcmp( command, "SoloPlay" ) ) { if ( !asw_show_all_singleplayer_maps.GetBool() ) { KeyValues *pSettings = KeyValues::FromString( "settings", " system { " " network offline " " } " " game { " " mode sdk " " mission sdk_teams_hdr " " } " ); KeyValues::AutoDelete autodelete( pSettings ); pSettings->SetString( "Game/difficulty", GameModeGetDefaultDifficulty( pSettings->GetString( "Game/mode" ) ) ); g_pMatchFramework->CreateSession( pSettings ); // Automatically start the credits session, no configuration required if ( IMatchSession *pMatchSession = g_pMatchFramework->GetMatchSession() ) { pMatchSession->Command( KeyValues::AutoDeleteInline( new KeyValues( "Start" ) ) ); } } else { KeyValues *pSettings = KeyValues::FromString( "Settings", " System { " " network offline " " } " " Game { " " mode sdk " " mission sdk_teams_hdr " " } " ); KeyValues::AutoDelete autodelete( pSettings ); // TCR: We need to respect the default difficulty pSettings->SetString( "Game/difficulty", GameModeGetDefaultDifficulty( pSettings->GetString( "Game/mode" ) ) ); g_pMatchFramework->CreateSession( pSettings ); } } else if ( !Q_strcmp( command, "DeveloperCommentary" ) ) { // Explain the rules of commentary GenericConfirmation* confirmation = static_cast< GenericConfirmation* >( CBaseModPanel::GetSingleton().OpenWindow( WT_GENERICCONFIRMATION, this, false ) ); GenericConfirmation::Data_t data; data.pWindowTitle = "#GAMEUI_CommentaryDialogTitle"; data.pMessageText = "#L4D360UI_Commentary_Explanation"; data.bOkButtonEnabled = true; data.pfnOkCallback = &AcceptCommentaryRulesCallback; data.bCancelButtonEnabled = true; confirmation->SetUsageData(data); NavigateFrom(); } else if ( !Q_strcmp( command, "StatsAndAchievements" ) ) { // If PC make sure that the Steam user is logged in if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow( WT_ACHIEVEMENTS, this, true ); } else if ( !Q_strcmp( command, "FlmExtrasFlyoutCheck" ) ) { if ( IsX360() && CUIGameData::Get()->SignedInToLive() ) OnCommand( "FlmExtrasFlyout_Live" ); else OnCommand( "FlmExtrasFlyout_Simple" ); return; } else if ( char const *szInviteType = StringAfterPrefix( command, "InviteUI_" ) ) { if ( IsX360() ) { CUIGameData::Get()->OpenInviteUI( szInviteType ); } else { CUIGameData::Get()->ExecuteOverlayCommand( "LobbyInvite" ); } } else if (!Q_strcmp(command, "Game")) { if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_GAMEOPTIONS, this, true ); } else if (!Q_strcmp(command, "AudioVideo")) { if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_AUDIOVIDEO, this, true ); } else if (!Q_strcmp(command, "Controller")) { if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_CONTROLLER, this, true ); } else if (!Q_strcmp(command, "Storage")) { if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } // Trigger storage device selector CUIGameData::Get()->SelectStorageDevice( new CChangeStorageDevice( XBX_GetUserId( iUserSlot ) ) ); } else if (!Q_strcmp(command, "Credits")) { KeyValues *pSettings = KeyValues::FromString( "settings", " system { " " network offline " " } " " game { " " mode single_mission " " } " " options { " " play credits " " } " ); KeyValues::AutoDelete autodelete( pSettings ); g_pMatchFramework->CreateSession( pSettings ); // Automatically start the credits session, no configuration required if ( IMatchSession *pMatchSession = g_pMatchFramework->GetMatchSession() ) { pMatchSession->Command( KeyValues::AutoDeleteInline( new KeyValues( "Start" ) ) ); } } else if (!Q_strcmp(command, "QuitGame")) { if ( IsPC() ) { GenericConfirmation* confirmation = static_cast< GenericConfirmation* >( CBaseModPanel::GetSingleton().OpenWindow( WT_GENERICCONFIRMATION, this, false ) ); GenericConfirmation::Data_t data; data.pWindowTitle = "#L4D360UI_MainMenu_Quit_Confirm"; data.pMessageText = "#L4D360UI_MainMenu_Quit_ConfirmMsg"; data.bOkButtonEnabled = true; data.pfnOkCallback = &AcceptQuitGameCallback; data.bCancelButtonEnabled = true; confirmation->SetUsageData(data); NavigateFrom(); } } else if ( !Q_stricmp( command, "QuitGame_NoConfirm" ) ) { if ( IsPC() ) { engine->ClientCmd( "quit" ); } } else if ( !Q_strcmp( command, "EnableSplitscreen" ) ) { Msg( "Enabling splitscreen from main menu...\n" ); CBaseModPanel::GetSingleton().CloseAllWindows(); CAttractScreen::SetAttractMode( CAttractScreen::ATTRACT_GOSPLITSCREEN ); CBaseModPanel::GetSingleton().OpenWindow( WT_ATTRACTSCREEN, NULL, true ); } else if ( !Q_strcmp( command, "DisableSplitscreen" ) ) { GenericConfirmation* confirmation = static_cast< GenericConfirmation* >( CBaseModPanel::GetSingleton().OpenWindow( WT_GENERICCONFIRMATION, this, false ) ); GenericConfirmation::Data_t data; data.pWindowTitle = "#L4D360UI_MainMenu_SplitscreenDisableConf"; data.pMessageText = "#L4D360UI_MainMenu_SplitscreenDisableConfMsg"; data.bOkButtonEnabled = true; data.pfnOkCallback = &AcceptSplitscreenDisableCallback; data.bCancelButtonEnabled = true; confirmation->SetUsageData(data); } else if ( !Q_strcmp( command, "DisableSplitscreen_NoConfirm" ) ) { Msg( "Disabling splitscreen from main menu...\n" ); CAttractScreen::SetAttractMode( CAttractScreen::ATTRACT_GAMESTART ); OnCommand( "ActivateAttractScreen" ); } else if (!Q_strcmp(command, "Audio")) { if ( ui_old_options_menu.GetBool() ) { CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); } else { // audio options dialog, PC only if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_AUDIO, this, true ); } } else if (!Q_strcmp(command, "Video")) { if ( ui_old_options_menu.GetBool() ) { CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); } else { // video options dialog, PC only if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_VIDEO, this, true ); } } else if (!Q_strcmp(command, "Brightness")) { if ( ui_old_options_menu.GetBool() ) { CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); } else { // brightness options dialog, PC only OpenGammaDialog( GetVParent() ); } } else if (!Q_strcmp(command, "KeyboardMouse")) { if ( ui_old_options_menu.GetBool() ) { CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); } else { // standalone keyboard/mouse dialog, PC only if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_KEYBOARDMOUSE, this, true ); } } else if( Q_stricmp( "#L4D360UI_Controller_Edit_Keys_Buttons", command ) == 0 ) { FlyoutMenu::CloseActiveMenu(); CBaseModPanel::GetSingleton().OpenKeyBindingsDialog( this ); } else if (!Q_strcmp(command, "MultiplayerSettings")) { if ( ui_old_options_menu.GetBool() ) { CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); } else { // standalone multiplayer settings dialog, PC only if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_MULTIPLAYER, this, true ); } } else if (!Q_strcmp(command, "CloudSettings")) { // standalone cloud settings dialog, PC only if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow(WT_CLOUD, this, true ); } else if (!Q_strcmp(command, "SeeAll")) { if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; KeyValues *pSettings = KeyValues::FromString( "settings", " game { " // passing empty game settings to indicate no preference " } " ); KeyValues::AutoDelete autodelete( pSettings ); if ( m_ActiveControl ) { m_ActiveControl->NavigateFrom( ); } CBaseModPanel::GetSingleton().OpenWindow( WT_ALLGAMESEARCHRESULTS, this, true, pSettings ); CBaseModPanel::GetSingleton().PlayUISound( UISOUND_ACCEPT ); } else if ( !Q_strcmp( command, "OpenServerBrowser" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; // on PC, bring up the server browser and switch it to the LAN tab (tab #5) engine->ClientCmd( "openserverbrowser" ); } else if ( !Q_strcmp( command, "DemoConnect" ) ) { g_pMatchFramework->GetMatchTitle()->PrepareClientForConnect( NULL ); engine->ClientCmd( CFmtStr( "connect %s", demo_connect_string.GetString() ) ); } else if (command && command[0] == '#') { // Pass it straight to the engine as a command engine->ClientCmd( command+1 ); } else if( !Q_strcmp( command, "Addons" ) ) { CBaseModPanel::GetSingleton().OpenWindow( WT_ADDONS, this, true ); } else if( !Q_strcmp( command, "CreateGame" ) ) { KeyValues *pSettings = KeyValues::FromString( "settings", " system { " " network LIVE " " access public " " } " " game { " " mode = " " sdk = " " mission = " " } " " options { " " action create " " } " ); KeyValues::AutoDelete autodelete( pSettings ); char const *szGameMode = "sdk"; pSettings->SetString( "game/mode", szGameMode ); pSettings->SetString( "game/campaign", "jacob" ); pSettings->SetString( "game/mission", "sdk_teams_hdr" ); if ( !CUIGameData::Get()->SignedInToLive() ) { pSettings->SetString( "system/network", "lan" ); pSettings->SetString( "system/access", "public" ); } if ( StringHasPrefix( szGameMode, "team" ) ) { pSettings->SetString( "system/netflag", "teamlobby" ); } // else if ( !Q_stricmp( "custommatch", m_pDataSettings->GetString( "options/action", "" ) ) ) // { // pSettings->SetString( "system/access", "public" ); // } // TCR: We need to respect the default difficulty pSettings->SetString( "game/difficulty", GameModeGetDefaultDifficulty( szGameMode ) ); CBaseModPanel::GetSingleton().PlayUISound( UISOUND_ACCEPT ); CBaseModPanel::GetSingleton().CloseAllWindows(); CBaseModPanel::GetSingleton().OpenWindow( WT_GAMESETTINGS, NULL, true, pSettings ); } else { const char *pchCommand = command; if ( !Q_strcmp(command, "FlmOptionsFlyout") ) { #ifdef _X360 if ( XBX_GetPrimaryUserIsGuest() ) { pchCommand = "FlmOptionsGuestFlyout"; } #endif } else if ( !Q_strcmp(command, "FlmVersusFlyout") ) { command = "VersusSoftLock"; } else if ( !Q_strcmp( command, "FlmSurvivalFlyout" ) ) { command = "SurvivalCheck"; } else if ( !Q_strcmp( command, "FlmScavengeFlyout" ) ) { command = "ScavengeCheck"; } else if ( StringHasPrefix( command, "FlmExtrasFlyout_" ) ) { command = "FlmExtrasFlyoutCheck"; } // does this command match a flyout menu? BaseModUI::FlyoutMenu *flyout = dynamic_cast< FlyoutMenu* >( FindChildByName( pchCommand ) ); if ( flyout ) { bOpeningFlyout = true; // If so, enumerate the buttons on the menu and find the button that issues this command. // (No other way to determine which button got pressed; no notion of "current" button on PC.) for ( int iChild = 0; iChild < GetChildCount(); iChild++ ) { bool bFound = false; GameModes *pGameModes = dynamic_cast< GameModes *>( GetChild( iChild ) ); if ( pGameModes ) { for ( int iGameMode = 0; iGameMode < pGameModes->GetNumGameInfos(); iGameMode++ ) { BaseModHybridButton *pHybrid = pGameModes->GetHybridButton( iGameMode ); if ( pHybrid && pHybrid->GetCommand() && !Q_strcmp( pHybrid->GetCommand()->GetString( "command"), command ) ) { pHybrid->NavigateFrom(); // open the menu next to the button that got clicked flyout->OpenMenu( pHybrid ); flyout->SetListener( this ); bFound = true; break; } } } if ( !bFound ) { BaseModHybridButton *hybrid = dynamic_cast<BaseModHybridButton *>( GetChild( iChild ) ); if ( hybrid && hybrid->GetCommand() && !Q_strcmp( hybrid->GetCommand()->GetString( "command"), command ) ) { hybrid->NavigateFrom(); // open the menu next to the button that got clicked flyout->OpenMenu( hybrid ); flyout->SetListener( this ); break; } } } } else { BaseClass::OnCommand( command ); } } if( !bOpeningFlyout ) { FlyoutMenu::CloseActiveMenu(); //due to unpredictability of mouse navigation over keyboard, we should just close any flyouts that may still be open anywhere. } }
//============================================================================= void InGameMainMenu::OnCommand( const char *command ) { int iUserSlot = CBaseModPanel::GetSingleton().GetLastActiveUserId(); if ( UI_IsDebug() ) { Msg("[GAMEUI] Handling ingame menu command %s from user%d ctrlr%d\n", command, iUserSlot, XBX_GetUserId( iUserSlot ) ); } int iOldSlot = GetGameUIActiveSplitScreenPlayerSlot(); SetGameUIActiveSplitScreenPlayerSlot( iUserSlot ); GAMEUI_ACTIVE_SPLITSCREEN_PLAYER_GUARD( iUserSlot ); if ( !Q_strcmp( command, "ReturnToGame" ) ) { engine->ClientCmd("gameui_hide"); } // -- // SINGLEPLAYER else if ( !Q_strcmp( command, "StartNewGame" ) ) { #ifdef UI_USING_OLDDIALOGS CBaseModPanel::GetSingleton().OpenOptionsDialog( this ); #else m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow( WT_NEWGAME, this, true ); #endif } else if ( !Q_strcmp( command, "SaveGame" ) ) { m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow( WT_SAVEGAME, this, true ); } else if ( !Q_strcmp( command, "LoadGame" ) ) { m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow( WT_LOADGAME, this, true ); } else if (!Q_strcmp(command, "Gameplay")) { m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow(WT_GAMEPLAYSETTINGS, this, true ); } else if ( !Q_strcmp( command, "StatsAndAchievements" ) ) { if ( CheckAndDisplayErrorIfNotLoggedIn() ) return; m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow( WT_ACHIEVEMENTS, this, true ); } else if (!Q_strcmp(command, "Controller")) { CBaseModPanel::GetSingleton().OpenWindow(WT_CONTROLLER, this, true ); } else if (!Q_strcmp(command, "Audio")) { // audio options dialog, PC only m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow(WT_AUDIO, this, true ); } else if (!Q_strcmp(command, "Video")) { // video options dialog, PC only m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow(WT_VIDEO, this, true ); } else if (!Q_strcmp(command, "Brightness")) { // brightness options dialog, PC only OpenGammaDialog( GetVParent() ); } else if (!Q_strcmp(command, "KeyboardMouse")) { // standalone keyboard/mouse dialog, PC only m_ActiveControl->NavigateFrom( ); CBaseModPanel::GetSingleton().OpenWindow(WT_KEYBOARDMOUSE, this, true ); } else if( Q_stricmp( "#L4D360UI_Controller_Edit_Keys_Buttons", command ) == 0 ) { FlyoutMenu::CloseActiveMenu(); CBaseModPanel::GetSingleton().OpenKeyBindingsDialog( this ); } else if ( !Q_strcmp( command, "EnableSplitscreen" ) || !Q_strcmp( command, "DisableSplitscreen" ) ) { GenericConfirmation* confirmation = static_cast< GenericConfirmation* >( CBaseModPanel::GetSingleton().OpenWindow( WT_GENERICCONFIRMATION, this, true ) ); GenericConfirmation::Data_t data; data.pWindowTitle = "#L4D360UI_LeaveMultiplayerConf"; data.pMessageText = "#L4D360UI_MainMenu_SplitscreenChangeConfMsg"; data.bOkButtonEnabled = true; data.pfnOkCallback = &LeaveGameOkCallback; data.bCancelButtonEnabled = true; confirmation->SetUsageData(data); } else if( !Q_strcmp( command, "ExitToMainMenu" ) ) { GenericConfirmation* confirmation = static_cast< GenericConfirmation* >( CBaseModPanel::GetSingleton().OpenWindow( WT_GENERICCONFIRMATION, this, true ) ); GenericConfirmation::Data_t data; data.pWindowTitle = "#L4D360UI_LeaveMultiplayerConf"; data.pMessageText = "#L4D360UI_LeaveMultiplayerConfMsg"; data.bOkButtonEnabled = true; data.pfnOkCallback = &LeaveGameOkCallback; data.bCancelButtonEnabled = true; confirmation->SetUsageData(data); } else { const char *pchCommand = command; // does this command match a flyout menu? BaseModUI::FlyoutMenu *flyout = dynamic_cast< FlyoutMenu* >( FindChildByName( pchCommand ) ); if ( flyout ) { // If so, enumerate the buttons on the menu and find the button that issues this command. // (No other way to determine which button got pressed; no notion of "current" button on PC.) for ( int iChild = 0; iChild < GetChildCount(); iChild++ ) { BaseModHybridButton *hybrid = dynamic_cast<BaseModHybridButton *>( GetChild( iChild ) ); if ( hybrid && hybrid->GetCommand() && !Q_strcmp( hybrid->GetCommand()->GetString( "command"), command ) ) { #ifdef _X360 hybrid->NavigateFrom( ); #endif //_X360 // open the menu next to the button that got clicked flyout->OpenMenu( hybrid ); break; } } } } SetGameUIActiveSplitScreenPlayerSlot( iOldSlot ); }