summaryrefslogtreecommitdiff
path: root/game/client/tf/vgui/quest_item_panel.h
blob: dfdb5a88f0bde6f915b87d973e978fb5b6b1c0f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef QUEST_ITEM_PANEL_H
#define QUEST_ITEM_PANEL_H
#ifdef _WIN32
#pragma once
#endif

#include "econ_item_inventory.h"
#include "tf_controls.h"

using namespace vgui;

class CScrollableQuestList;
class CItemModelPanel;

//-----------------------------------------------------------------------------
// Simple tooltip class that looks into the moused-over panel's dialog variables
// for "tiptext" and uses that value as its string to present.
//-----------------------------------------------------------------------------
class CQuestTooltip : public CTFTextToolTip
{
	DECLARE_CLASS_SIMPLE( CQuestTooltip, CTFTextToolTip );
public:
	CQuestTooltip( vgui::Panel *parent, const char *text = NULL )
		: BaseClass( parent, text )
	{}

	virtual void ShowTooltip( Panel *pCurrentPanel ) OVERRIDE;
	virtual void PositionWindow( Panel *pTipPanel ) OVERRIDE;
private:
};

//-----------------------------------------------------------------------------
// Can pass various input events to other panels
//-----------------------------------------------------------------------------
class CInputProxyPanel : public EditablePanel
{
public:

	enum EInputTypes
	{
		INPUT_MOUSE_ENTER = 0,
		INPUT_MOUSE_EXIT,
		INPUT_MOUSE_PRESS,
		INPUT_MOUSE_DOUBLE_PRESS,
		INPUT_MOUSE_RELEASED,
		INPUT_MOUSE_WHEEL,
		INPUT_MOUSE_MOVE,
		NUM_INPUT_TYPES,
	};

	DECLARE_CLASS_SIMPLE( CInputProxyPanel, EditablePanel );
	CInputProxyPanel( Panel *parent, const char *pszPanelName );

	void AddPanelForCommand( EInputTypes eInputType, Panel* pPanel, const char* pszCommand );

	MESSAGE_FUNC_INT_INT( OnCursorMoved, "OnCursorMoved", x, y );
	virtual void OnCursorEntered();
	virtual void OnCursorExited();
	virtual void OnMousePressed(MouseCode code);
	virtual void OnMouseDoublePressed(MouseCode code);
	virtual void OnMouseReleased(MouseCode code);
	virtual void OnMouseWheeled(int delta);

private:

	struct CommandPair_t
	{
		Panel* m_pPanel;
		const char* m_pszCommand;
	};
	CUtlVector< CommandPair_t > m_vecRedirectPanels[NUM_INPUT_TYPES];
};

//-----------------------------------------------------------------------------
// Contains a panel that animates into place when it needs to show or hide
//-----------------------------------------------------------------------------
class CQuestStatusPanel : public EditablePanel
{
public:
	DECLARE_CLASS_SIMPLE( CQuestStatusPanel, EditablePanel );
	CQuestStatusPanel( Panel *parent, const char *pszPanelName );

	void SetShow( bool bShow );
	virtual void OnThink() OVERRIDE;

private:
	EditablePanel* m_pMovingContainer;
	RealTimeCountdownTimer m_transitionTimer;
	bool m_bShouldBeVisible;

	CPanelAnimationVarAliasType( int, m_iVisibleY, "visible_y", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iHiddenY, "hidden_y", "40", "proportional_int" );
};

//-----------------------------------------------------------------------------
// An representation of a single quest
//-----------------------------------------------------------------------------
class CQuestItemPanel : public EditablePanel, CGameEventListener
{
public:
	enum EItemPanelState_t
	{
		STATE_NORMAL = 0,
		STATE_UNIDENTIFIED,
		STATE_IDENTIFYING,
		STATE_COMPLETED,
		STATE_TURNING_IN__WAITING_FOR_GC,
		STATE_TURNING_IN__GC_RESPONDED,
		STATE_SHOW_ACCEPTED,

		NUM_STATES,
	};

	DECLARE_CLASS_SIMPLE( CQuestItemPanel, EditablePanel );

	CQuestItemPanel( Panel *parent, const char *pszPanelName, CEconItemView* pQuestItem, CScrollableQuestList* pQuestList );
	virtual ~CQuestItemPanel();

	virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE;
	virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE;
	virtual void PerformLayout( void ) OVERRIDE;
	virtual void OnCommand( const char *command ) OVERRIDE;
	virtual void OnThink() OVERRIDE;
	virtual void FireGameEvent( IGameEvent *event ) OVERRIDE;
	virtual void OnSizeChanged(int wide, int tall) OVERRIDE {}
	virtual void OnMouseReleased(MouseCode code) OVERRIDE;

	const CEconItemView* GetItem() { return m_hQuestItem; }
	void SetItem( CEconItemView* pItem );
	void QuestCompletedResponse();
	EItemPanelState_t GetState() const { return m_eState; }
	void SetSelected( bool bSelected, bool bImmediate );
	bool IsSelected() const { return !m_bCollapsed; }
	bool IsCursorOverMainContainer() const;

	MESSAGE_FUNC( OnCollapsedGlowStart, "CollapsedGlowStart" );
	MESSAGE_FUNC( OnCollapsedGlowEnd, "CollapsedGlowEnd" );
	MESSAGE_FUNC( OnDiscardQuest, "DiscardQuest" );
	MESSAGE_FUNC( OnEquipLoaners, "EquipLoaners" );
	void OnCompleteQuest();
	void OnConfirmDelete( bool bConfirm );
	void OnConfirmEquipLoaners( bool bConfirm );

protected:

	bool HasAllControls() const { return m_bHasAllControls; }

	void LoadResFileForCurrentItem();
	void OnIdentify();
	void SetupObjectivesPanels( bool bRecreate );
	bool IsUnacknowledged();
	void SetState( EItemPanelState_t eState );
	void CaptureAndEncodeStrings();
	const wchar_t* GetDecodedString( const char* pszKeyName, float flPercentDecoded );
	void UpdateInvalidReasons();

	EItemPanelState_t m_eState;
	CEconItemViewHandle m_hQuestItem;

	EditablePanel	*m_pQuestPaperContainer;
	EditablePanel	*m_pFrontFolderContainer;
	ImagePanel		*m_pFrontFolderImage;
	EditablePanel	*m_pBackFolderContainer;
	ImagePanel		*m_pBackFolderImage;
	ImagePanel		*m_pEncodedImage;
	EditablePanel	*m_pMainContainer;

	CQuestStatusPanel					*m_pEncodedStatus;
	CQuestStatusPanel					*m_pInactiveStatus;
	CQuestStatusPanel					*m_pReadyToTurnInStatus;
	Label								*m_pFlavorText;
	Label								*m_pObjectiveExplanationLabel;
	Label								*m_pExpirationLabel;
	EditablePanel						*m_pTurnInContainer;
	EditablePanel						*m_pTurnInDimmer;
	Button								*m_pTurnInButton;
	EditablePanel						*m_pTurnInSpinnerContainer;
	CExButton							*m_pTitleButton;
	EditablePanel						*m_pIdentifyDimmer;
	EditablePanel						*m_pIdentifyContainer;
	CExButton							*m_pIdentifyButton;
	ImagePanel							*m_pPhotoStatic;
	ImagePanel							*m_pAcceptedImage;
	Label								*m_pTurningInLabel;
	class CExScrollingEditablePanel		*m_pFlavorScrollingContainer;
	CExButton							*m_pFindServerButton;
	
	// loaners
	EditablePanel						*m_pLoanerContainerPanel;
	CExButton							*m_pRequestLoanerItemsButton;
	CExButton							*m_pEquipLoanerItemsButton;
	CItemModelPanel						*m_pLoanerItemModelPanel[2];

	CExButton							*m_pDiscardButton;


	int									m_nPaperXPos;
	int									m_nPaperYPos;	
	int									m_nPaperXShakePos;
	int									m_nPaperYShakePos;
	bool								m_bHasAllControls;
	CUtlString							m_strItemTrackerResFile;
	CUtlString							m_strQuickPlayMap;
	
	CUtlString							m_strMatchmakingGroupName;
	CUtlString							m_strMatchmakingCategoryName;
	CUtlString							m_strMatchmakingMapName;

	// Sound effects
	CUtlString							m_strExpandSound;
	CUtlString							m_strCollapseSound;
	CUtlString							m_strTurnInSound;
	CUtlString							m_strTurnInSuccessSound;
	CUtlString							m_strDecodeSound;

	// Animation
	CUtlString							m_strReset;
	CUtlString							m_strAnimExpand;
	CUtlString							m_strAnimCollapse;
	CUtlString							m_strTurningIn;
	CUtlString							m_strHighlightOn;
	CUtlString							m_strHighlightOff;

	class CItemTrackerPanel *m_pItemTrackerPanel;

	CScrollableQuestList *m_pQuestList;

	RealTimeCountdownTimer	m_StateTimer;
	KeyValues *m_pKVItemTracker;

	struct FolderPair_t
	{
		CUtlString m_strFront;
		CUtlString m_strBack;
	};
	CUtlVector< FolderPair_t > m_vecFoldersImages;

	CUtlString m_strEncodedText;
	CUtlString m_strExpireText;
	const char *m_pszCompleteSound;
	bool m_bCollapsed;

	KeyValues *m_pKVCipherStrings;

	CPanelAnimationVarAliasType( int, m_iFrontPaperHideHeight, "front_paper_hide_height", "1000", "proportional_int" ); // Default to a large value so it wont be visible
	CPanelAnimationVarAliasType( int, m_iUnidentifiedHeight, "unidentified_height", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iObjectiveInset, "objective_inset", "200", "proportional_int" );
	//CPanelAnimationVarAliasType( int, m_iScrollingContainerHeight, "scrolling_container_height", "200", "proportional_int" );

	enum EDecodeStyle
	{
		DECODE_STYLE_CYPHER = 0,
		DECODE_STYLE_PANEL_FADE,
	};
	CPanelAnimationVarAliasType( EDecodeStyle, m_eDecodeStyle, "decode_style", "0", "int" );
};

#endif // QUEST_ITEM_PANEL_H