summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_survey_questions.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_survey_questions.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_survey_questions.cpp')
-rw-r--r--game/shared/tf/tf_survey_questions.cpp280
1 files changed, 280 insertions, 0 deletions
diff --git a/game/shared/tf/tf_survey_questions.cpp b/game/shared/tf/tf_survey_questions.cpp
new file mode 100644
index 0000000..2fd6cb9
--- /dev/null
+++ b/game/shared/tf/tf_survey_questions.cpp
@@ -0,0 +1,280 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+
+#include "tf_survey_questions.h"
+#include "ienginevgui.h"
+#include "tf_match_description.h"
+
+#ifdef CLIENT_DLL
+ #include "tf_gc_client.h"
+ #include "vgui_controls/RadioButton.h"
+ #include "iclientmode.h"
+ #include <vgui_controls/AnimationController.h>
+ #include "game/client/iviewport.h"
+ #include "tf_hud_mainmenuoverride.h"
+ #include "tf_gamerules.h"
+#endif
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+// Purpose: Criteria function for competitive inquiry survey
+// Only include casual matches
+//-----------------------------------------------------------------------------
+bool CompetitiveInquiry( const CMsgGC_Match_Result& msgMatchResult, uint32 nPlayerIndex )
+{
+ const IMatchGroupDescription* pMatchDesc = GetMatchGroupDescription( (EMatchGroup) msgMatchResult.match_group() );
+
+ if ( pMatchDesc )
+ {
+ // Only show this in Casual 12v12
+ return pMatchDesc->m_eMatchGroup == k_nMatchGroup_Casual_12v12;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Criteria function for casual inquiry survey
+// Only include competitive matches
+//-----------------------------------------------------------------------------
+bool CasualInquiry( const CMsgGC_Match_Result& msgMatchResult, uint32 nPlayerIndex )
+{
+ const IMatchGroupDescription* pMatchDesc = GetMatchGroupDescription( ( EMatchGroup )msgMatchResult.match_group() );
+
+ if ( pMatchDesc )
+ {
+ // Only show this in Competitive 6v6
+ return pMatchDesc->m_eMatchGroup == k_nMatchGroup_Ladder_6v6;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: The actual definition of the survey questions
+//-----------------------------------------------------------------------------
+ // Survey Enum Help Text String Weight Criteria Function Active
+const SurveyQuestion_t g_SurveyQuestions[SurveyQuestionType_ARRAYSIZE] = { { QUESTION_MATCH_QUALITY, "MatchQuality", 1.f, NULL, true },
+ { QUESTION_MAP_QUALITY, "MapQuality", 1.f, NULL, true },
+ { QUESTION_COMP_INQUIRY, "CompetitiveInquiry", 1.f, &CompetitiveInquiry, true },
+ { QUESTION_CASUAL_INQUIRY, "CasualInquiry", 1.f, &CasualInquiry, true } };
+
+#ifdef CLIENT_DLL
+
+//-----------------------------------------------------------------------------
+// Purpose: Figure out which survey panel to make
+//-----------------------------------------------------------------------------
+CSurveyQuestionPanel* CreateSurveyQuestionPanel( Panel* pParent, const CMsgGCSurveyRequest& msgSurveyQuestion )
+{
+ CSurveyQuestionPanel* pSurveyPanel = NULL;
+
+ Assert( msgSurveyQuestion.has_question_type() );
+ switch( msgSurveyQuestion.question_type() )
+ {
+ case QUESTION_MATCH_QUALITY:
+ pSurveyPanel = new CMatchQualitySurvey( pParent, msgSurveyQuestion );
+ break;
+ case QUESTION_MAP_QUALITY:
+ pSurveyPanel = new CMapQualitySurvey( pParent, msgSurveyQuestion );
+ break;
+ case QUESTION_COMP_INQUIRY:
+ pSurveyPanel = new CCompInquirySurvey( pParent, msgSurveyQuestion );
+ break;
+ case QUESTION_CASUAL_INQUIRY:
+ pSurveyPanel = new CCasualInquirySurvey( pParent, msgSurveyQuestion );
+ break;
+ default:
+ Assert( !"Unhandled survey question type!" );
+ }
+
+ return pSurveyPanel;
+}
+
+CSurveyQuestionPanel::CSurveyQuestionPanel( Panel* pParent, CMsgGCSurveyRequest msgSurveyQuestion )
+ : EditablePanel( pParent, "Survey" )
+ , m_msgRequest( msgSurveyQuestion )
+ , m_bResponded( false )
+{
+ vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/ClientScheme.res", "ClientScheme");
+ SetScheme(scheme);
+ SetProportional( true );
+
+ ListenForGameEvent( "server_spawn" );
+ ListenForGameEvent( "client_disconnect" );
+ ListenForGameEvent( "client_beginconnect" );
+}
+
+CSurveyQuestionPanel::~CSurveyQuestionPanel()
+{
+ if ( !m_bResponded )
+ {
+ GTFGCClientSystem()->SendSurveyResponse( SEEN_BUT_UNANSWERED_SURVEY_QUESTION );
+ m_bResponded = true;
+ }
+
+ GTFGCClientSystem()->ClearSurveyRequest();
+}
+
+void CSurveyQuestionPanel::OnCommand( const char *command )
+{
+ if ( FStrEq( command, "close" ) )
+ {
+ if ( !m_bResponded )
+ {
+ GTFGCClientSystem()->SendSurveyResponse( SEEN_AND_DISMISSED_SURVEY_QUESTION );
+ m_bResponded = true;
+ }
+
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( GetParent(), "SurveyHideSequence", false );
+ return;
+ }
+ else if ( FStrEq( command, "submit" ) )
+ {
+ if ( !m_bResponded )
+ {
+ Submit();
+ m_bResponded = true;
+ }
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( GetParent(), "SurveySubmitSequence", false );
+
+ return;
+ }
+ else if ( FStrEq( command, "delete" ) )
+ {
+ MarkForDeletion();
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+void CSurveyQuestionPanel::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ SetProportional( true );
+ LoadControlSettings( GetResFile() );
+ InvalidateLayout( true );
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( GetParent(), "SurveyShowSequence", false );
+}
+
+void CSurveyQuestionPanel::FireGameEvent( IGameEvent *event )
+{
+ const char *pEventName = event->GetName();
+
+ // They left/changed servers. Consider the survey abandoned
+ if ( !Q_stricmp( pEventName, "client_disconnect" ) ||
+ !Q_stricmp( pEventName, "client_beginconnect" ) ||
+ !Q_stricmp( pEventName, "server_spawn" ) )
+ {
+ MarkForDeletion();
+ }
+}
+
+CMultipleChoiceSurveyQuestionPanel::CMultipleChoiceSurveyQuestionPanel( Panel* pParent, CMsgGCSurveyRequest msgSurveyQuestion, uint16 nSurveyResponses )
+ : CSurveyQuestionPanel( pParent, msgSurveyQuestion )
+{
+ m_nSurveyResponses = nSurveyResponses;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Get the labels under the radio buttons to highlight
+//-----------------------------------------------------------------------------
+void CMultipleChoiceSurveyQuestionPanel::Think()
+{
+ // We need to be on top of absolutely everything. Clicking on another
+ // popup will move it on top of us, and that cannot be!
+ MoveToFront();
+
+ bool bAnySelected = false;
+ // Radio buttons aren't cool and can ONLY have their labels to the right.
+ // This panel has extra labels under the radio labels that we want to highlight
+ // so set the label's FG colors to the radio buttons FG colors.
+ for( int i = 0; i < m_nSurveyResponses; ++i )
+ {
+ RadioButton* pRadioButton = FindControl< RadioButton >( CFmtStr( "Radio%d", i ), true );
+ Panel* pRadioLabel = FindChildByName( CFmtStr( "Radio%dLabel", i ), true );
+
+ if ( pRadioButton && pRadioLabel )
+ {
+ pRadioLabel->SetFgColor( pRadioButton->GetFgColor() );
+ bAnySelected = bAnySelected || pRadioButton->IsSelected();
+ }
+ }
+
+ Panel* pSubmitButton = FindChildByName( "SubmitButton", true );
+ if ( pSubmitButton )
+ {
+ pSubmitButton->SetEnabled( bAnySelected );
+ }
+}
+
+void CMultipleChoiceSurveyQuestionPanel::Submit()
+{
+ // Figure out which radio button is checked, and use that as our response
+ for( int i = 0; i < m_nSurveyResponses; ++i )
+ {
+ RadioButton* pRadioButton = FindControl< RadioButton >( CFmtStr( "Radio%d", i ), true );
+
+ if ( pRadioButton && pRadioButton->IsSelected() )
+ {
+ GTFGCClientSystem()->SendSurveyResponse( i );
+ return;
+ }
+ }
+}
+
+void CMapQualitySurvey::PerformLayout()
+{
+ const MapDef_t* pMapDef = NULL;
+
+ if ( TFGameRules() )
+ {
+ pMapDef = GetItemSchema()->GetMasterMapDefByName ( TFGameRules()->MapName() );
+ }
+ else
+ {
+ pMapDef = GetItemSchema()->GetMasterMapDefByIndex( RandomInt( 1, GetItemSchema()->GetMapCount() - 1 ) );
+ }
+
+ Assert( pMapDef );
+ if ( !pMapDef )
+ return;
+
+ EditablePanel* pMapChoice = FindControl< EditablePanel >( "QuestionContainer", true );
+ if ( pMapChoice )
+ {
+ // Label text
+ pMapChoice->SetDialogVariable( "mapname", g_pVGuiLocalize->Find( pMapDef->pszMapNameLocKey ) );
+ }
+}
+
+#ifdef STAGING_ONLY
+CON_COMMAND( test_survey, "Creates a test survey" )
+{
+ if( args.ArgC() < 2 )
+ return;
+
+ int nDefIndex = atoi( args[1] );
+ if ( nDefIndex < 0 || nDefIndex >= SurveyQuestionType_ARRAYSIZE )
+ return;
+
+ CMsgGCSurveyRequest msgSurvey;
+ msgSurvey.set_match_id( 0 );
+ msgSurvey.set_question_type( (SurveyQuestionType)nDefIndex );
+
+ Panel* pSurvey = CreateSurveyQuestionPanel( NULL, msgSurvey );
+ IViewPortPanel *pMMOverride = ( gViewPortInterface->FindPanelByName( PANEL_MAINMENUOVERRIDE ) );
+ pSurvey->SetParent( (CHudMainMenuOverride*)pMMOverride );
+}
+#endif
+
+#endif \ No newline at end of file