summaryrefslogtreecommitdiff
path: root/game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp')
-rw-r--r--game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp357
1 files changed, 357 insertions, 0 deletions
diff --git a/game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp b/game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp
new file mode 100644
index 0000000..016f5a1
--- /dev/null
+++ b/game/client/tf/vgui/tf_lobby_container_frame_mvm.cpp
@@ -0,0 +1,357 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_party.h"
+#include "vgui_controls/PropertySheet.h"
+#include "vgui_controls/SectionedListPanel.h"
+#include "tf_lobbypanel_mvm.h"
+
+#include "tf_lobby_container_frame_mvm.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-----------------------------------------------------------------------------
+CLobbyContainerFrame_MvM::CLobbyContainerFrame_MvM()
+ : CBaseLobbyContainerFrame( "LobbyContainerFrame" )
+{
+ // Our internal lobby panel
+ m_pContents = new CLobbyPanel_MvM( this, this );
+ m_pContents->MoveToFront();
+ m_pContents->AddActionSignalTarget( this );
+ AddPage( m_pContents, "#TF_Matchmaking_HeaderMvM" );
+ GetPropertySheet()->SetNavToRelay( m_pContents->GetName() );
+ m_pContents->SetVisible( true );
+}
+
+//-----------------------------------------------------------------------------
+CLobbyContainerFrame_MvM::~CLobbyContainerFrame_MvM( void )
+{
+}
+
+//-----------------------------------------------------------------------------
+void CLobbyContainerFrame_MvM::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ m_pStartPartyButton = dynamic_cast<vgui::Button *>(FindChildByName( "StartPartyButton", true )); Assert( m_pStartPartyButton );
+ m_pPlayNowButton = dynamic_cast<vgui::Button *>(FindChildByName( "PlayNowButton", true )); Assert( m_pPlayNowButton );
+ m_pPracticeButton = dynamic_cast<vgui::Button *>(FindChildByName( "PracticeButton", true )); Assert( m_pPracticeButton );
+}
+
+bool CLobbyContainerFrame_MvM::VerifyPartyAuthorization() const
+{
+ // They want to Mann Up. Confirm that everybody in the party has a ticket.
+ // if they are in a party of one, we provide slightly more specific UI.
+ bool bBraggingRights = GTFGCClientSystem()->GetSearchPlayForBraggingRights();
+
+ // Early out. Anyone can play for free
+ if ( !bBraggingRights )
+ return true;
+
+ // Solo
+ CTFParty *pParty = GTFGCClientSystem()->GetParty();
+ if ( pParty == NULL || pParty->GetNumMembers() <= 1 )
+ {
+ if ( bBraggingRights && !GTFGCClientSystem()->BLocalPlayerInventoryHasMvmTicket() )
+ {
+ ShowEconRequirementDialog( "#TF_MvM_RequiresTicket_Title", "#TF_MvM_RequiresTicket", CTFItemSchema::k_rchMvMTicketItemDefName );
+ return false;
+ }
+ }
+ // Group
+ else
+ {
+ wchar_t wszLocalized[512];
+ char szLocalized[512];
+ wchar_t wszCharPlayerName[128];
+
+ bool bAnyMembersWithoutAuth = false;
+
+ if ( bBraggingRights )
+ {
+ for ( int i = 0 ; i < pParty->GetNumMembers() ; ++i )
+ {
+ if ( !pParty->Obj().members( i ).owns_ticket() )
+ {
+ bAnyMembersWithoutAuth = true;
+
+ V_UTF8ToUnicode( steamapicontext->SteamFriends()->GetFriendPersonaName( pParty->GetMember( i ) ), wszCharPlayerName, sizeof( wszCharPlayerName ) );
+ g_pVGuiLocalize->ConstructString_safe( wszLocalized, g_pVGuiLocalize->Find( "#TF_Matchmaking_MissingTicket" ), 1, wszCharPlayerName );
+ g_pVGuiLocalize->ConvertUnicodeToANSI( wszLocalized, szLocalized, sizeof( szLocalized ) );
+
+ GTFGCClientSystem()->SendSteamLobbyChat( CTFGCClientSystem::k_eLobbyMsg_SystemMsgFromLeader, szLocalized );
+ }
+ }
+ }
+
+ if ( bAnyMembersWithoutAuth )
+ {
+ if ( bBraggingRights )
+ {
+ ShowMessageBox( "#TF_MvM_RequiresTicket_Title", "#TF_MvM_RequiresTicketParty", "#GameUI_OK" );
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void CLobbyContainerFrame_MvM::HandleBackPressed()
+{
+ switch ( GTFGCClientSystem()->GetWizardStep() )
+ {
+ case TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS:
+ // !FIXME! Rreally need to confirm this!
+ GTFGCClientSystem()->EndMatchmaking();
+ // And hide us
+ ShowPanel( false );
+ return;
+
+#ifdef USE_MVM_TOUR
+ case TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY:
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS );
+ return;
+#endif // USE_MVM_TOUR
+
+ case TF_Matchmaking_WizardStep_MVM_CHALLENGE:
+#ifdef USE_MVM_TOUR
+ if ( GTFGCClientSystem()->GetSearchPlayForBraggingRights() )
+ {
+ TF_Matchmaking_WizardStep step = TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY;
+ GTFGCClientSystem()->RequestSelectWizardStep( step );
+ }
+ else
+ {
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS );
+ }
+#else // new mm
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS );
+#endif // USE_MVM_TOUR
+ return;
+
+ case TF_Matchmaking_WizardStep_SEARCHING:
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_CHALLENGE );
+ return;
+
+ default:
+ Msg( "Unexpected wizard step %d", (int)GTFGCClientSystem()->GetWizardStep() );
+ break;
+ }
+
+ // Unhandled case
+ BaseClass::HandleBackPressed();
+}
+
+//-----------------------------------------------------------------------------
+void CLobbyContainerFrame_MvM::OnCommand( const char *command )
+{
+ if ( FStrEq( command, "learn_more" ) )
+ {
+ if ( steamapicontext && steamapicontext->SteamFriends() )
+ {
+ steamapicontext->SteamFriends()->ActivateGameOverlayToWebPage( "http://www.teamfortress.com/mvm/" );
+ }
+ return;
+ }
+ else if ( FStrEq( command, "mannup" ) )
+ {
+ GTFGCClientSystem()->SetSearchPlayForBraggingRights( true );
+#ifdef USE_MVM_TOUR
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY );
+#else // new mm
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_CHALLENGE );
+#endif // USE_MVM_TOUR
+ return;
+ }
+ else if ( FStrEq( command, "practice" ) )
+ {
+ GTFGCClientSystem()->SetSearchPlayForBraggingRights( false );
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_CHALLENGE );
+ return;
+ }
+ else if ( FStrEq( command, "next" ) )
+ {
+ switch ( GTFGCClientSystem()->GetWizardStep() )
+ {
+ case TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS:
+#ifdef USE_MVM_TOUR
+ if ( GTFGCClientSystem()->GetSearchPlayForBraggingRights() )
+ {
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY );
+ }
+ else
+ {
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_CHALLENGE );
+ }
+ break;
+
+ case TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY:
+#endif // USE_MVM_TOUR
+ GTFGCClientSystem()->RequestSelectWizardStep( TF_Matchmaking_WizardStep_MVM_CHALLENGE );
+ break;
+
+ case TF_Matchmaking_WizardStep_MVM_CHALLENGE:
+ case TF_Matchmaking_WizardStep_LADDER:
+ StartSearch();
+ break;
+
+ default:
+ AssertMsg1( false, "Unexpected wizard step %d", (int)GTFGCClientSystem()->GetWizardStep() );
+ break;
+ }
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CLobbyContainerFrame_MvM::OnKeyCodePressed(vgui::KeyCode code)
+{
+ ButtonCode_t nButtonCode = GetBaseButtonCode( code );
+
+ if ( nButtonCode == KEY_XBUTTON_Y )
+ {
+ static_cast< CLobbyPanel_MvM* >( m_pContents )->ToggleSquadSurplusCheckButton();
+ }
+
+ BaseClass::OnKeyCodePressed( code );
+}
+
+
+//-----------------------------------------------------------------------------
+void CLobbyContainerFrame_MvM::WriteControls()
+{
+ // Make sure we want to be in matchmaking. (If we don't, the frame should hide us pretty quickly.)
+ // We might get an event or something right at the transition point occasionally when the UI should
+ // not be visible
+ if ( GTFGCClientSystem()->GetMatchmakingUIState() == eMatchmakingUIState_Inactive )
+ {
+ return;
+ }
+ const char *pszBackButtonText = "#TF_Matchmaking_Back";
+ const char *pszNextButtonText = NULL;
+
+ CMvMMissionSet challenges;
+ GTFGCClientSystem()->GetSearchChallenges( challenges );
+
+ bool bShowPlayNowButtons = false;
+
+ if ( GCClientSystem()->BConnectedtoGC() )
+ {
+ if ( BIsPartyLeader() )
+ {
+ switch ( GTFGCClientSystem()->GetWizardStep() )
+ {
+ case TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS:
+ {
+ if ( !m_pStartPartyButton->IsVisible() )
+ {
+ pszBackButtonText = "#TF_Matchmaking_LeaveParty";
+ }
+ else
+ {
+ pszBackButtonText = "#TF_Matchmaking_Back";
+ }
+
+ bShowPlayNowButtons = BIsPartyLeader();
+ break;
+ }
+
+ case TF_Matchmaking_WizardStep_MVM_TOUR_OF_DUTY:
+#ifdef USE_MVM_TOUR
+ pszBackButtonText = "#TF_Matchmaking_Back";
+ pszNextButtonText = "#TF_MvM_SelectChallenge";
+
+ SetNextButtonEnabled( GTFGCClientSystem()->GetSearchMannUpTourIndex() >= 0 );
+#else // new mm
+ AssertMsg( 0, "This is legacy code. We don't have concept of tour anymore." );
+#endif // USE_MVM_TOUR
+ break;
+
+ case TF_Matchmaking_WizardStep_MVM_CHALLENGE:
+ pszBackButtonText = "#TF_Matchmaking_Back";
+
+ pszNextButtonText = "#TF_Matchmaking_StartSearch";
+ SetNextButtonEnabled( !challenges.IsEmpty() );
+
+ break;
+
+ case TF_Matchmaking_WizardStep_SEARCHING:
+ pszBackButtonText = "#TF_Matchmaking_CancelSearch";
+ break;
+
+ case TF_Matchmaking_WizardStep_INVALID:
+ // Still being setup
+ break;
+
+ default:
+ AssertMsg1( false, "Unknown wizard step %d", (int)GTFGCClientSystem()->GetWizardStep() );
+ break;
+ }
+ }
+ else
+ {
+ pszBackButtonText = "#TF_Matchmaking_LeaveParty";
+ m_pNextButton->SetEnabled( false );
+ }
+ }
+
+ m_pPlayNowButton->SetVisible( bShowPlayNowButtons );
+ m_pPracticeButton->SetVisible( bShowPlayNowButtons );
+ SetControlVisible( "LearnMoreButton", GTFGCClientSystem()->GetWizardStep() == TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS );
+
+ // Set appropriate page title
+ switch ( GTFGCClientSystem()->GetSearchMode() )
+ {
+ case TF_Matchmaking_MVM:
+ if ( GTFGCClientSystem()->GetSearchPlayForBraggingRights() ||
+ GTFGCClientSystem()->GetWizardStep() == TF_Matchmaking_WizardStep_MVM_PLAY_FOR_BRAGGING_RIGHTS )
+ {
+ GetPropertySheet()->SetTabTitle( 0, "#TF_MvM_HeaderCoop" );
+ }
+ else
+ {
+ GetPropertySheet()->SetTabTitle( 0, "#TF_MvM_HeaderPractice" );
+ }
+ break;
+
+ default:
+ AssertMsg1( false, "Invalid search mode %d", GTFGCClientSystem()->GetSearchMode() );
+ break;
+ }
+
+ // Check if we already have a party, then make sure and show it
+ if ( m_pStartPartyButton->IsVisible() && m_pContents->NumPlayersInParty() > 1 )
+ {
+ m_pContents->SetControlVisible( "PartyActiveGroupBox", true );
+ }
+
+ SetControlVisible( "PlayWithFriendsExplanation", ShouldShowPartyButton() );
+
+
+ static_cast< CLobbyPanel_MvM* >( m_pContents )->SetMannUpTicketCount( GTFGCClientSystem()->GetLocalPlayerInventoryMvmTicketCount() );
+ static_cast< CLobbyPanel_MvM* >( m_pContents )->SetSquadSurplusCount( GTFGCClientSystem()->GetLocalPlayerInventorySquadSurplusVoucherCount() );
+
+ m_pBackButton->SetText( pszBackButtonText );
+ if ( pszNextButtonText )
+ {
+ m_pNextButton->SetText( pszNextButtonText );
+ m_pNextButton->SetVisible( true );
+ }
+ else
+ {
+ m_pNextButton->SetVisible( false );
+ }
+
+ BaseClass::WriteControls();
+}
+