You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
10 KiB
267 lines
10 KiB
//========= 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
|
|
|