diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/vgui/dynamic_recipe_subpanel.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/vgui/dynamic_recipe_subpanel.h')
| -rw-r--r-- | game/client/tf/vgui/dynamic_recipe_subpanel.h | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/game/client/tf/vgui/dynamic_recipe_subpanel.h b/game/client/tf/vgui/dynamic_recipe_subpanel.h new file mode 100644 index 0000000..f0bddaa --- /dev/null +++ b/game/client/tf/vgui/dynamic_recipe_subpanel.h @@ -0,0 +1,267 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef DYNAMIC_RECIPE_SUBPANEL_H +#define DYNAMIC_RECIPE_SUBPANEL_H +#ifdef _WIN32 +#pragma once +#endif + +#include "backpack_panel.h" +#include "vgui_controls/ScrollableEditablePanel.h" +#include "tf_gcmessages.h" +#include "econ_gcmessages.h" +#include "tf_imagepanel.h" +#include "tf_controls.h" +#include "item_selection_panel.h" +#include "econ_dynamic_recipe.h" + +class CImageButton; + +#define DYNAMIC_RECIPE_INPUT_ROWS 4 +#define DYNAMIC_RECIPE_INPUT_COLS 3 +#define DYNAMIC_RECIPE_INPUT_COUNT ( DYNAMIC_RECIPE_INPUT_ROWS * DYNAMIC_RECIPE_INPUT_COLS ) +#define DYNAMIC_RECIPE_OUTPUT_ROWS 4 +#define DYNAMIC_RECIPE_OUTPUT_COLS 3 +#define DYNAMIC_RECIPE_OUTPUT_COUNT ( DYNAMIC_RECIPE_OUTPUT_ROWS * DYNAMIC_RECIPE_OUTPUT_COLS ) + +#define DYNAMIC_RECIPE_BACKPACK_ROWS 4 +#define DYNAMIC_RECIPE_BACKPACK_COLS 4 +#define DYNAMIC_RECIPE_PACKPACK_COUNT_PER_PAGE ( DYNAMIC_RECIPE_BACKPACK_ROWS * DYNAMIC_RECIPE_BACKPACK_COLS ) + +class CRecipeComponentItemModelPanel; + +class CRecipeComponentItemModelPanel : public CItemModelPanel +{ +public: + DECLARE_CLASS_SIMPLE( CRecipeComponentItemModelPanel, CItemModelPanel ); + CRecipeComponentItemModelPanel( vgui::Panel *parent, const char *name ); + + void AddRecipe( itemid_t nRecipe ); + virtual void DeleteRecipes(); + virtual void SetItem( const CEconItemView *pItem ) OVERRIDE; + void SetRecipeItem( itemid_t nRecipeItem, int nPageNumber ); + void AddDefaultItem( CEconItemView *pItem ); + CEconItemView* GetRecipeItem( int nPageNumber ) const; + itemid_t GetRecipeIndex( int nPageNumber ) const; + bool IsSlotAvailable( int nPageNumber ); + CEconItemView* GetDefaultItem() const { return m_nPageNumber < m_vecDefaultItems.Count() ? m_vecDefaultItems[ m_nPageNumber ] : NULL; } + void UpdateDisplayItem(); + + void SetPageNumber( int nPageNumber ); + int GetPageNumber() const { return m_nPageNumber; } +protected: + struct RecipeItem_t + { + itemid_t m_nRecipeIndex; + CEconItemView* m_pRecipeItem; + }; + + void UpdateRecipeItem( RecipeItem_t* pRecipeItem ); + virtual void SetBlankState(); + + CUtlVector< CEconItemView* > m_vecDefaultItems; + CUtlVector< RecipeItem_t > m_vecRecipes; + int m_nPageNumber; +}; + +class CInputPanelItemModelPanel : public CRecipeComponentItemModelPanel +{ +public: + CInputPanelItemModelPanel( vgui::Panel *parent, const char *name, const CEconItemView* pDynamicRecipeItem ) + : CRecipeComponentItemModelPanel( parent, name ) + , m_pDynamicRecipeItem( pDynamicRecipeItem ) + {} + + virtual void DeleteRecipes(); + void AddComponentInfo( const CEconItemAttributeDefinition *pComponentAttrib ); + bool MatchesAttribCriteria( itemid_t itemID ) const; + bool MatchesAttribCriteria( itemid_t itemID, int nPageNumber ) const; + const CEconItemAttributeDefinition * GetAttrib( int nPageNumber ) const; + void SetDynamicRecipeItem( const CEconItemView* pDynamicRecipeItem ) { m_pDynamicRecipeItem = pDynamicRecipeItem; } + +protected: + virtual void SetBlankState() OVERRIDE; + +private: + CUtlVector< const CEconItemAttributeDefinition* > m_vecAttrDef; + const CEconItemView* m_pDynamicRecipeItem; +}; + + +//----------------------------------------------------------------------------- +// An inventory screen that handles displaying the crafting screen +//----------------------------------------------------------------------------- +class CDynamicRecipePanel : public CBackpackPanel +{ + DECLARE_CLASS_SIMPLE( CDynamicRecipePanel, CBackpackPanel ); +public: + +#ifdef STAGING_ONLY + void Debug_GiveRequiredInputs() const; + CExButton *m_pDevGiveInputsButton; +#endif + + CDynamicRecipePanel( vgui::Panel *parent, const char *panelName, CEconItemView* pRecipeItem ); + ~CDynamicRecipePanel( void ); + + void SetNewRecipe( CEconItemView* pNewRecipeItem ); + void ConsumeItem( ); + void InitItemPanels(); + virtual const char *GetResFile( void ) { return "Resource/UI/DynamicRecipePanel.res"; } + + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE; + virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE; + virtual void PerformLayout( void ) OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + virtual void OnKeyCodePressed( vgui::KeyCode code ) OVERRIDE; + void OnButtonChecked( KeyValues *pData ) OVERRIDE; + + virtual void OpenContextMenu() OVERRIDE {} + virtual int GetNumItemPanels( void ) OVERRIDE; + virtual void AddNewItemPanel( int iPanelIndex ) OVERRIDE; + void Craft(); + virtual void OnTick( void ) OVERRIDE; + virtual void OnShowPanel( bool bVisible, bool bReturningFromArmory ) OVERRIDE; + void OnCraftResponse( itemid_t nNewToolID, EGCMsgResponse eResponse ); +private: + + bool IsInputPanel( int iPanelIndex ) const; + bool IsOutputPanel( int iPanelIndex) const; + bool IsBackpackPanel( int iPanelIndex) const; + bool IsInvPanelOnThisPage( unsigned nIndex ) const; + int GetNumBackpackPanelsPerPage() const { return DYNAMIC_RECIPE_BACKPACK_ROWS * DYNAMIC_RECIPE_BACKPACK_COLS; } + virtual int GetNumPages() OVERRIDE; + virtual void SetCurrentPage( int nNewPage ) OVERRIDE; + int GetFirstBackpackIndex() const { return DYNAMIC_RECIPE_INPUT_COUNT + DYNAMIC_RECIPE_OUTPUT_COUNT; } + + void SetCurrentInputPage( int nNewPage ); + int GetNumInputPages() const; + int GetNumInputPanelsPerPage() const { return DYNAMIC_RECIPE_INPUT_COUNT; } + + int GetNumOutputPage() const; + int GetNumOutputPanelsPerPage() const { return DYNAMIC_RECIPE_OUTPUT_COUNT; } + + class CRecipeComponentAttributeCounter : public CEconItemSpecificAttributeIterator + { + public: + CRecipeComponentAttributeCounter() + : m_nInputCount( 0 ) + {} + ~CRecipeComponentAttributeCounter() { Reset(); } + + virtual bool OnIterateAttributeValue( const CEconItemAttributeDefinition *pAttrDef, const CAttribute_DynamicRecipeComponent& value ) OVERRIDE; + int GetInputCount() const { return m_nInputCount; } + int GetOutputCount() const { return m_vecOutputItems.Count(); } + CEconItemView* GetOutputItem( int i ); + CEconItemView* GetInputItem( int i ); + const CEconItemAttributeDefinition* GetInputAttrib( int i ); + + void Reset(); + + private: + + struct InputComponent_t + { + CEconItemView m_ItemView; + const CEconItemAttributeDefinition* m_pAttrib; + }; + + typedef CUtlVector< CCopyableUtlVector<InputComponent_t> > InputComponentVec; + + static int LeastCommonInputSortFunc( const CCopyableUtlVector<InputComponent_t> *p1, const CCopyableUtlVector<InputComponent_t> *p2 ); + InputComponent_t* GetInputComponent( int i ); + + InputComponentVec m_vecInputItems; + CUtlVector< CEconItemView > m_vecOutputItems; + CUtlVector< CEconItem* > m_vecTempEconItems; + int m_nInputCount; + }; + + class CDynamicRecipeItemMatchFind : public CEconItemSpecificAttributeIterator + { + public: + CDynamicRecipeItemMatchFind( const CEconItemView* pSourceItem, const CEconItemView* pItemTomatch ) + : m_bMatchesAny( false ) + , m_pSourceItem( pSourceItem ) + , m_pItemToMatch( pItemTomatch ) + {} + + virtual bool OnIterateAttributeValue( const CEconItemAttributeDefinition *pAttrDef, const CAttribute_DynamicRecipeComponent& value ) OVERRIDE; + bool MatchesAnyAttributes() const { return m_bMatchesAny; } + private: + const CEconItemView* m_pSourceItem; + const CEconItemView* m_pItemToMatch; + bool m_bMatchesAny; + }; + + CEconItemView* m_pDynamicRecipeItem; + CRecipeComponentAttributeCounter m_RecipeIterator; + + bool AllRecipePanelsFilled( void ); + bool CheckForUntradableItems( void ); + bool WarnAboutPartialCompletion( void ); + void FindPossibleBackpackItems(); + virtual void PositionItemPanel( CItemModelPanel *pPanel, int iIndex ); + void PopulatePanelsForCurrentPage(); + virtual void UpdateModelPanels( void ); + virtual void SetBorderForItem( CItemModelPanel *pItemPanel, bool bMouseOver ); + void SetRecipeComponentIntoPanel( itemid_t nSrcRecipeIndex, CRecipeComponentItemModelPanel* pSrcPanel, int nSrcPage, CRecipeComponentItemModelPanel* pDstPanel, int nDstPage ); + bool InputPanelCanAcceptItem( CItemModelPanel* pPanel, itemid_t nItemID ); + + CTFTextToolTip *m_pToolTip; + vgui::EditablePanel *m_pToolTipEmbeddedPanel; + CExButton *m_pRecipeCraftButton; + CExLabel *m_pNoMatchesLabel; + CExLabel *m_pUntradableOutputsLabel; + CExLabel *m_pInputsLabel; + CExLabel *m_pOutputsLabel; + vgui::Label *m_pCurInputPageLabel; + CExButton *m_pNextInputPageButton; + CExButton *m_pPrevInputPageButton; + CItemModelPanel *m_pMouseOverItemPanel; + vgui::CheckButton *m_pShowUntradableItemsCheckbox; + + CUtlVector<CInputPanelItemModelPanel*> m_vecRecipeInputModelPanels; + CUtlVector<CRecipeComponentItemModelPanel*> m_vecBackpackModelPanels; + CUtlVector<CItemModelPanel*> m_vecRecipeOutputModelPanels; + + vgui::EditablePanel *m_pRecipeContainer; + vgui::EditablePanel *m_pInventoryContainer; + + unsigned m_nNumRecipeItems; + bool m_bAllRecipePanelsFilled; + bool m_bInputPanelsDirty; + bool m_bShowUntradable; + + int m_nInputPage; + int m_nOutputPage; + + float m_flAbortCraftingAt; + + MESSAGE_FUNC_PTR( OnItemPanelMouseDoublePressed, "ItemPanelMouseDoublePressed", panel ); + MESSAGE_FUNC_PTR( OnItemPanelEntered, "ItemPanelEntered", panel ); + MESSAGE_FUNC_PTR( OnItemPanelExited, "ItemPanelExited", panel ); + MESSAGE_FUNC( OnRecipeCompleted, "RecipeCompleted" ); + + virtual bool AllowDragging( CItemModelPanel *panel ) OVERRIDE; + virtual void StartDrag( int x, int y ) OVERRIDE; + virtual void StopDrag( bool bSucceeded ) OVERRIDE; + virtual bool CanDragTo( CItemModelPanel *pItemPanel, int iPanelIndex ) OVERRIDE; + virtual void HandleDragTo( CItemModelPanel *pItemPanel, int iPanelIndex ) OVERRIDE; + + void ReturnRecipeItemToBackpack( itemid_t nItemID, CRecipeComponentItemModelPanel* pSrcPanel, int nSrcPage ); + + CPanelAnimationVarAliasType( int, m_iItemCraftingOffcenterX, "item_crafting_offcenter_x", "0", "proportional_int" ); + CPanelAnimationVarAliasType( int, m_iOutputItemYPos, "output_item_ypos", "0", "proportional_int" ); + CPanelAnimationVarAliasType( int, m_iInventoryXPos, "inventory_xpos", "0", "proportional_int" ); + CPanelAnimationVarAliasType( int, m_iInventoryYPos, "inventory_ypos", "0", "proportional_int" ); + + friend void ConfirmDestroyItems( bool bConfirmed, void* pContext ); +}; + +#endif // DYNAMIC_RECIPE_SUBPANEL_H |