summaryrefslogtreecommitdiff
path: root/game/shared/econ/item_selection_criteria.h
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/econ/item_selection_criteria.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/econ/item_selection_criteria.h')
-rw-r--r--game/shared/econ/item_selection_criteria.h290
1 files changed, 290 insertions, 0 deletions
diff --git a/game/shared/econ/item_selection_criteria.h b/game/shared/econ/item_selection_criteria.h
new file mode 100644
index 0000000..a4da52d
--- /dev/null
+++ b/game/shared/econ/item_selection_criteria.h
@@ -0,0 +1,290 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: CItemSelectionCriteria, which serves as a criteria for selection
+// of a econ item
+//
+//=============================================================================
+
+#ifndef ITEM_SELECTION_CRITERIA_H
+#define ITEM_SELECTION_CRITERIA_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+// Maximum string length in item create APIs
+const int k_cchCreateItemLen = 64;
+
+// Operators for BAddNewItemCriteria
+enum EItemCriteriaOperator
+{
+ k_EOperator_String_EQ = 0, // Field is string equal to value
+ k_EOperator_Not = 1, // Logical not
+ k_EOperator_String_Not_EQ = 1, // Field is not string equal to value
+ k_EOperator_Float_EQ = 2, // Field as a float is equal to value
+ k_EOperator_Float_Not_EQ = 3, // Field as a float is not equal to value
+ k_EOperator_Float_LT = 4, // Field as a float is less than value
+ k_EOperator_Float_Not_LT = 5, // Field as a float is not less than value
+ k_EOperator_Float_LTE = 6, // Field as a float is less than or equal value
+ k_EOperator_Float_Not_LTE = 7, // Field as a float is not less than or equal value
+ k_EOperator_Float_GT = 8, // Field as a float is greater than value
+ k_EOperator_Float_Not_GT = 9, // Field as a float is not greater than value
+ k_EOperator_Float_GTE = 10, // Field as a float is greater than or equal value
+ k_EOperator_Float_Not_GTE = 11, // Field as a float is not greater than or equal value
+ k_EOperator_Subkey_Contains = 12, // Field contains value as a subkey
+ k_EOperator_Subkey_Not_Contains = 13, // Field does not contain value as a subkey
+
+ // Must be last
+ k_EItemCriteriaOperator_Count = 14,
+};
+
+
+EItemCriteriaOperator EItemCriteriaOperatorFromName( const char *pch );
+const char *PchNameFromEItemCriteriaOperator( int eItemCriteriaOperator );
+
+class CEconItemSchema;
+class CEconItemDefinition;
+class CSOItemCriteria;
+class CSOItemCriteriaCondition;
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// CItemSelectionCriteria
+// A class that contains all the conditions a server needs to specify what
+// kind of random item they wish to generate.
+//-----------------------------------------------------------------------------
+class CItemSelectionCriteria
+{
+public:
+ // Constructors and destructor
+ CItemSelectionCriteria() :
+ m_bItemLevelSet( false ),
+ m_unItemLevel( 0 ),
+ m_bQualitySet( false ),
+ m_nItemQuality( k_unItemQuality_Any ),
+ m_unInitialInventory( 0 ),
+ m_bInitialQuantitySet( false ),
+ m_unInitialQuantity( 1 ),
+ m_bIgnoreEnabledFlag( false )
+ {
+ }
+
+ CItemSelectionCriteria( const CItemSelectionCriteria &that );
+ CItemSelectionCriteria &operator=( const CItemSelectionCriteria& rhs );
+ ~CItemSelectionCriteria();
+
+ // Accessors and Settors
+ bool BItemLevelSet( void ) const { return m_bItemLevelSet; }
+ uint32 GetItemLevel( void ) const { Assert( m_bItemLevelSet ); return m_unItemLevel; }
+ void SetItemLevel( uint32 unLevel ) { m_unItemLevel = unLevel; m_bItemLevelSet = true; }
+ bool BQualitySet( void ) const { return m_bQualitySet; }
+ int32 GetQuality( void ) const { Assert( m_bQualitySet ); return m_nItemQuality; }
+ void SetQuality( int32 nQuality ) { m_nItemQuality = nQuality; m_bQualitySet = true; }
+ uint32 GetInitialInventory( void ) const { return m_unInitialInventory; }
+ void SetInitialInventory( uint32 unInventory ) { m_unInitialInventory = unInventory; }
+ bool BInitialQuantitySet( void ) const { return m_bQualitySet; }
+ uint32 GetInitialQuantity( void ) const { Assert( m_bQualitySet ); return m_unInitialQuantity; }
+ void SetInitialQuantity( uint32 unQuantity ) { m_unInitialQuantity = unQuantity; m_bInitialQuantitySet = true; }
+ void SetIgnoreEnabledFlag( bool bIgnore ) { m_bIgnoreEnabledFlag = bIgnore; }
+
+ // Tags
+ void SetTags( const char *pszTags );
+
+
+ // Add conditions to the criteria
+ class ICondition
+ {
+ public:
+ virtual ~ICondition() { }
+
+ virtual bool BItemDefinitionPassesCriteria( const CEconItemDefinition *pItemDef ) const = 0;
+
+ virtual EItemCriteriaOperator GetEOp() const { return k_EItemCriteriaOperator_Count; }
+ virtual const char *GetField() const { return ""; }
+ virtual const char *GetValue() const { return ""; }
+
+ virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const { Assert( !"BSerializeToMsg() called on for unimplementing ICondition!" ); return false; }
+ };
+
+ bool BAddCondition( const char *pszField, EItemCriteriaOperator eOp, float flValue, bool bRequired );
+ bool BAddCondition( const char *pszField, EItemCriteriaOperator eOp, const char * pszValue, bool bRequired );
+ bool BAddCondition( ICondition *pCondition );
+ int GetConditionsCount() { return m_vecConditions.Count(); }
+ const char *GetValueForFirstConditionOfType( EItemCriteriaOperator eType ) const;
+ const char *GetFieldForFirstConditionOfType( EItemCriteriaOperator eType ) const;
+
+ // Alternate ways of initializing
+ bool BInitFromKV( KeyValues *pKVCriteria );
+
+ // Serializes the criteria to and from messages
+ bool BSerializeToMsg( CSOItemCriteria & msg ) const;
+ bool BDeserializeFromMsg( const CSOItemCriteria & msg );
+
+ // Evaluates an item definition against this criteria. Returns true if
+ // the definition passes the filter
+ bool BEvaluate( const CEconItemDefinition* pItemDef ) const;
+
+ // Validation
+#ifdef DBGFLAG_VALIDATE
+ void Validate( CValidator &validator, const char *pchName );
+#endif
+
+private:
+ //-----------------------------------------------------------------------------
+ // CItemSelectionCriteria::CCondition
+ // Represents one condition of the criteria
+ //-----------------------------------------------------------------------------
+ class CCondition : public ICondition
+ {
+ public:
+ CCondition( const char *pszField, EItemCriteriaOperator eOp, bool bRequired )
+ : m_sField( pszField ), m_EOp( eOp ), m_bRequired( bRequired )
+ {
+ }
+
+ // ICondition interface.
+ virtual bool BItemDefinitionPassesCriteria( const CEconItemDefinition *pItemDef ) const OVERRIDE;
+
+ // Serializes the condition to the message
+ virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const;
+
+ // Validation
+#ifdef DBGFLAG_VALIDATE
+ virtual void Validate( CValidator &validator, const char *pchName );
+#endif
+
+ EItemCriteriaOperator GetEOp( void ) const OVERRIDE { return m_EOp; }
+ virtual const char *GetField( void ) const OVERRIDE { return m_sField.Get(); }
+ virtual const char *GetValue( void ) const OVERRIDE { Assert(0); return NULL; }
+
+ private:
+ // Returns if the given KeyValues block passes this condition
+ // Performs common checks and calls BInternalEvaluate
+ bool BEvaluate( KeyValues *pKVItem ) const;
+
+ protected:
+ // Returns true if applying the element's operator on m_sField of
+ // pKVItem returns true. This is only called if m_pszField exists in pKVItem
+ virtual bool BInternalEvaluate( KeyValues *pKVItem ) const = 0;
+
+ // The field of the raw KeyValue form of the item definition to check
+ CUtlString m_sField;
+ // The operator this clause uses
+ EItemCriteriaOperator m_EOp;
+ // When true, BEvaluate returns false if m_sField does not exist in pKVItem
+ bool m_bRequired;
+ };
+
+
+ //-----------------------------------------------------------------------------
+ // CItemSelectionCriteria::CStringCondition
+ // CCondition that handles the string-based operators
+ //-----------------------------------------------------------------------------
+ class CStringCondition : public CCondition
+ {
+ public:
+ CStringCondition( const char *pszField, EItemCriteriaOperator eOp, const char *pszValue, bool bRequired )
+ : CCondition( pszField, eOp, bRequired ), m_sValue( pszValue )
+ {
+ }
+
+ virtual ~CStringCondition( ) { }
+
+ virtual const char *GetValue( void ) const OVERRIDE { return m_sValue.Get(); }
+
+ // Validation
+#ifdef DBGFLAG_VALIDATE
+ virtual void Validate( CValidator &validator, const char *pchName );
+#endif
+
+ protected:
+ virtual bool BInternalEvaluate( KeyValues *pKVItem ) const;
+ virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const;
+
+ // The value to check against
+ CUtlString m_sValue;
+ };
+
+
+ //-----------------------------------------------------------------------------
+ // CItemSelectionCriteria::CFloatCondition
+ // CCondition that handles the float-based operators
+ //-----------------------------------------------------------------------------
+ class CFloatCondition : public CCondition
+ {
+ public:
+ CFloatCondition( const char *pszField, EItemCriteriaOperator eOp, float flValue, bool bRequired )
+ : CCondition( pszField, eOp, bRequired ), m_flValue( flValue )
+ {
+ }
+
+ virtual ~CFloatCondition( ) { }
+
+ protected:
+ virtual bool BInternalEvaluate( KeyValues *pKVItem ) const;
+ virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const;
+
+ // The value to check against
+ float m_flValue;
+ };
+
+
+ //-----------------------------------------------------------------------------
+ // CItemSelectionCriteria::CSetCondition
+ // CCondition that handles subkey checks
+ //-----------------------------------------------------------------------------
+ class CSetCondition : public CCondition
+ {
+ public:
+ CSetCondition( const char *pszField, EItemCriteriaOperator eOp, const char *pszValue, bool bRequired )
+ : CCondition( pszField, eOp, bRequired ), m_sValue( pszValue )
+ {
+ }
+
+ virtual ~CSetCondition( ) { }
+
+ // Validation
+#ifdef DBGFLAG_VALIDATE
+ virtual void Validate( CValidator &validator, const char *pchName );
+#endif
+
+ protected:
+ virtual bool BInternalEvaluate( KeyValues *pKVItem ) const;
+
+ virtual bool BSerializeToMsg( CSOItemCriteriaCondition & msg ) const;
+
+ // The subkey to look for
+ CUtlString m_sValue;
+ };
+
+ // True if item level is specified in this criteria
+ bool m_bItemLevelSet;
+ // The level of the item to generate
+ uint32 m_unItemLevel;
+ // True if quality is specified in this criteria
+ bool m_bQualitySet;
+ // The quality of the item to generate
+ int32 m_nItemQuality;
+ // The initial inventory token of the item
+ uint32 m_unInitialInventory;
+ // True if initial quantity is specified in this criteria.
+ bool m_bInitialQuantitySet;
+ // The initial quantity of the item
+ uint32 m_unInitialQuantity;
+ // Enforced explicit quality matching
+ bool m_bForcedQualityMatch;
+ // Ignoring enabled flag (used when crafting)
+ bool m_bIgnoreEnabledFlag;
+
+ // A list of tags
+ CUtlString m_strTags;
+ CUtlVector<econ_tag_handle_t> m_vecTags;
+
+ // A list of the conditions
+ CUtlVector<ICondition *> m_vecConditions;
+};
+
+
+#endif //ITEM_SELECTION_CRITERIA_H