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.
946 lines
34 KiB
946 lines
34 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
|
|
#ifndef TFITEMSCHEMA_H
|
|
#define TFITEMSCHEMA_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "econ_item_schema.h"
|
|
#include "tf_item_constants.h"
|
|
#include "tf_shareddefs.h"
|
|
#include "tf_matchmaking_shared.h"
|
|
|
|
#ifndef GC_DLL
|
|
#include "util_shared.h"
|
|
#endif
|
|
|
|
const int k_iMvmMissionIndex_Any = -1;
|
|
const int k_iMvmMissionIndex_NotInSchema = -2;
|
|
|
|
//#ifndef STAGING_ONLY
|
|
#define USE_MVM_TOUR 1
|
|
//#endif // !STAGING_ONLY
|
|
|
|
const int k_iMvmTourIndex_Empty = -1; // empty tour name
|
|
const int k_iMvmTourIndex_NotInSchema = -2;
|
|
const int k_iMvmTourIndex_NotMannedUp = -3; // special value used when asking for the selected tour when not manned up
|
|
|
|
const uint32 k_unMvMMaxPointsPerBadgeLevel = 3; // require 3 missions to level up a badge
|
|
|
|
class CRandomChanceString
|
|
{
|
|
public:
|
|
CRandomChanceString();
|
|
|
|
void AddString( const char *pszString, int nChance );
|
|
const char *GetRandomString() const;
|
|
|
|
private:
|
|
CUtlVector< std::pair< const char *, int > > m_vecChoices;
|
|
int m_unTotalChance;
|
|
};
|
|
|
|
class CTFTauntInfo
|
|
{
|
|
public:
|
|
CTFTauntInfo();
|
|
|
|
bool BInitFromKV( KeyValues *pKV, CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
int GetIntroSceneCount( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_vecIntroScenes[iClass].Count(); }
|
|
const char *GetIntroScene( int iClass, int iSceneIndex ) const
|
|
{
|
|
Assert( iSceneIndex >= 0 && iSceneIndex < GetIntroSceneCount( iClass ) );
|
|
return m_vecIntroScenes[iClass][iSceneIndex];
|
|
}
|
|
|
|
int GetOutroSceneCount( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_vecOutroScenes[iClass].Count(); }
|
|
const char *GetOutroScene( int iClass, int iSceneIndex ) const
|
|
{
|
|
Assert( iSceneIndex >= 0 && iSceneIndex < GetOutroSceneCount( iClass ) );
|
|
return m_vecOutroScenes[iClass][iSceneIndex];
|
|
}
|
|
|
|
int GetPartnerTauntInitiatorSceneCount( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_vecPartnerTauntInitiatorScenes[iClass].Count(); }
|
|
const char *GetPartnerTauntInitiatorScene( int iClass, int iSceneIndex ) const
|
|
{
|
|
Assert( iSceneIndex >= 0 && iSceneIndex < GetPartnerTauntInitiatorSceneCount( iClass ) );
|
|
return m_vecPartnerTauntInitiatorScenes[iClass][iSceneIndex];
|
|
}
|
|
|
|
int GetPartnerTauntReceiverSceneCount( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_vecPartnerTauntReceiverScenes[iClass].Count(); }
|
|
const char *GetPartnerTauntReceiverScene( int iClass, int iSceneIndex ) const
|
|
{
|
|
Assert( iSceneIndex >= 0 && iSceneIndex < GetPartnerTauntReceiverSceneCount( iClass ) );
|
|
return m_vecPartnerTauntReceiverScenes[iClass][iSceneIndex];
|
|
}
|
|
|
|
const char *GetProp( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_pszProp[iClass]; }
|
|
const char *GetPropIntroScene( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_pszPropIntroScene[iClass]; }
|
|
const char *GetPropOutroScene( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_pszPropOutroScene[iClass]; }
|
|
|
|
float GetTauntSeparationForwardDistance() const { return m_flTauntSeparationForwardDistance; }
|
|
float GetTauntSeparationRightDistance() const { return m_flTauntSeparationRightDistance; }
|
|
float GetMinTauntTime() const { return m_flMinTauntTime; }
|
|
|
|
bool IsPartnerTaunt() const { return m_bIsPartnerTaunt; }
|
|
bool ShouldStopTauntIfMoved() const { return m_bStopTauntIfMoved; }
|
|
|
|
int GetFOV() const { return m_nFOV; }
|
|
float GetCameraDist() const { return m_flCameraDist; }
|
|
float GetCameraDistUp() const { return m_flCameraDistUp; }
|
|
|
|
const char *GetParticleAttachment() const { return m_pszParticleAttachment; }
|
|
|
|
struct TauntInputRemap_t
|
|
{
|
|
TauntInputRemap_t()
|
|
{
|
|
m_iButton = 0;
|
|
}
|
|
int m_iButton;
|
|
CUtlVector< const char* > m_vecButtonPressedScenes[LOADOUT_COUNT];
|
|
CUtlVector< const char* > m_vecButtonReleasedScenes[LOADOUT_COUNT];
|
|
};
|
|
int GetTauntInputRemapCount() const { return m_vecTauntInputRemap.Count(); }
|
|
const TauntInputRemap_t &GetTauntInputRemapScene( int iButtonIndex ) const
|
|
{
|
|
return m_vecTauntInputRemap[iButtonIndex];
|
|
}
|
|
|
|
private:
|
|
|
|
bool InitTauntInputRemap( KeyValues *pKV, CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
CUtlVector< const char* > m_vecIntroScenes[LOADOUT_COUNT];
|
|
CUtlVector< const char* > m_vecOutroScenes[LOADOUT_COUNT];
|
|
CUtlVector< const char* > m_vecPartnerTauntInitiatorScenes[LOADOUT_COUNT];
|
|
CUtlVector< const char* > m_vecPartnerTauntReceiverScenes[LOADOUT_COUNT];
|
|
CUtlVector< TauntInputRemap_t > m_vecTauntInputRemap;
|
|
const char *m_pszProp[LOADOUT_COUNT];
|
|
const char *m_pszPropIntroScene[LOADOUT_COUNT];
|
|
const char *m_pszPropOutroScene[LOADOUT_COUNT];
|
|
const char *m_pszParticleAttachment;
|
|
float m_flTauntSeparationForwardDistance;
|
|
float m_flTauntSeparationRightDistance;
|
|
float m_flMinTauntTime;
|
|
bool m_bIsPartnerTaunt;
|
|
bool m_bStopTauntIfMoved;
|
|
|
|
int m_nFOV;
|
|
float m_flCameraDist;
|
|
float m_flCameraDistUp;
|
|
};
|
|
|
|
class CQuestThemeDefinition
|
|
{
|
|
public:
|
|
|
|
CQuestThemeDefinition( void );
|
|
virtual ~CQuestThemeDefinition( void );
|
|
|
|
bool BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
|
|
const char *GetName() const { return m_pszName; }
|
|
|
|
const char *GetNotificationResFile() const { return m_pszNotificationRes; }
|
|
const char *GetQuestItemResFile() const { return m_pszQuestItemRes; }
|
|
const char *GetInGameTrackerResFile() const { return m_pszInGameTrackerRes; }
|
|
unacknowledged_item_inventory_positions_t GetUnackPos() const { return m_eUnackPos; }
|
|
|
|
#ifndef GC_DLL
|
|
const char *GetGiveSoundForClass( int iClass ) const { return UTIL_GetRandomSoundFromEntry( m_vecGiveStrings[ iClass ].GetRandomString() ); }
|
|
const char *GetCompleteSoundForClass( int iClass ) const { return UTIL_GetRandomSoundFromEntry( m_vecCompleteStrings[ iClass ].GetRandomString() ); }
|
|
const char *GetFullyCompleteSoundForClass( int iClass ) const { return UTIL_GetRandomSoundFromEntry( m_vecFullyCompleteStrings[ iClass ].GetRandomString() ); }
|
|
const char *GetDiscardSound() const { return UTIL_GetRandomSoundFromEntry( m_pszDiscardString ); }
|
|
const char *GetRewardSound() const { return UTIL_GetRandomSoundFromEntry( m_pszRewardString ); }
|
|
const char *GetRevealSound() const { return UTIL_GetRandomSoundFromEntry( m_pszOnRevealText ); }
|
|
#endif
|
|
|
|
private:
|
|
|
|
KeyValues *m_pRawKVs;
|
|
|
|
const char *m_pszName;
|
|
|
|
// UI
|
|
const char* m_pszNotificationRes;
|
|
const char* m_pszQuestItemRes;
|
|
const char* m_pszInGameTrackerRes;
|
|
unacknowledged_item_inventory_positions_t m_eUnackPos;
|
|
|
|
// Sounds
|
|
CRandomChanceString m_vecGiveStrings[LOADOUT_COUNT]; // Per class
|
|
CRandomChanceString m_vecCompleteStrings[LOADOUT_COUNT]; // Per class
|
|
CRandomChanceString m_vecFullyCompleteStrings[LOADOUT_COUNT]; // Per class
|
|
const char* m_pszRewardString;
|
|
const char* m_pszDiscardString;
|
|
const char* m_pszOnRevealText;
|
|
};
|
|
|
|
typedef CUtlVector< const class CTFQuestObjectiveDefinition* > QuestObjectiveDefVec_t;
|
|
typedef CUtlVector< const char * > QuestDescriptionVec_t;
|
|
typedef CUtlVector< const char * > QuestNameVec_t;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CTFRequiredQuestItemsSet
|
|
//-----------------------------------------------------------------------------
|
|
class CTFRequiredQuestItemsSet
|
|
{
|
|
public:
|
|
CTFRequiredQuestItemsSet( void ) {}
|
|
|
|
bool BInitFromKV( KeyValues *pKV, CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
bool BPostInit( CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
|
|
bool OwnsRequiredItems( const CUtlVector< item_definition_index_t >& vecOwnedItemDefs ) const;
|
|
const item_definition_index_t& GetLoanerItemDef() const { return m_LoanerItemDef; }
|
|
|
|
private:
|
|
CUtlVector< item_definition_index_t > m_vecQualifyingItemDefs;
|
|
item_definition_index_t m_LoanerItemDef;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CQuestDefinition
|
|
//-----------------------------------------------------------------------------
|
|
class CQuestDefinition
|
|
{
|
|
public:
|
|
|
|
CQuestDefinition( void );
|
|
|
|
bool BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
|
|
uint32 GetMaxStandardPoints() const { return m_nMaxStandardPoints; }
|
|
uint32 GetMaxBonusPoints() const { return m_nMaxBonusPoints; }
|
|
const char *GetRewardLootlistName() const { return m_pszRewardLootlistName; }
|
|
const char *GetQuickplayMapName() const { return m_pszQuickplayMapName; }
|
|
|
|
const char *GetMatchmakingGroupName() const { return m_strMatchmakingGroupName.Get(); }
|
|
const char *GetMatchmakingCategoryName() const { return m_strMatchmakingCategoryName.Get(); }
|
|
const char *GetMatchmakingMapName() const { return m_strMatchmakingMapName.Get(); }
|
|
|
|
const QuestObjectiveDefVec_t& GetObjectives() const { return m_vecObjectiveDefinitions; }
|
|
void GetRolledObjectivesForItem( QuestObjectiveDefVec_t& vecRolledObjectives, const CEconItem* pItem ) const;
|
|
const CQuestThemeDefinition *GetQuestTheme() const;
|
|
const char *GetRolledDescriptionForItem( const CEconItem* pItem ) const;
|
|
const char *GetRolledNameForItem( const CEconItem* pItem ) const;
|
|
const char *GetCorrespondingOperationName() const { return m_pszCorrespondingOperationName; }
|
|
|
|
const CUtlVector< CTFRequiredQuestItemsSet >& GetRequiredItemSets() const { return m_vecRequiredItemSets; }
|
|
|
|
private:
|
|
|
|
QuestObjectiveDefVec_t m_vecObjectiveDefinitions;
|
|
uint32 m_nMaxStandardPoints;
|
|
uint32 m_nMaxBonusPoints;
|
|
const char *m_pszRewardLootlistName;
|
|
uint16 m_nNumObjectivesToRoll;
|
|
const char *m_pszQuestThemeName;
|
|
const char *m_pszCorrespondingOperationName;
|
|
const char *m_pszQuickplayMapName;
|
|
|
|
CUtlString m_strMatchmakingGroupName;
|
|
CUtlString m_strMatchmakingCategoryName;
|
|
CUtlString m_strMatchmakingMapName;
|
|
|
|
QuestDescriptionVec_t m_vecQuestDescriptions;
|
|
QuestNameVec_t m_vecQuestNames;
|
|
CEconItemDefinition *m_pOperationBadgeDef;
|
|
|
|
// loaner items for this quest
|
|
CUtlVector< CTFRequiredQuestItemsSet > m_vecRequiredItemSets;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Wars
|
|
//-----------------------------------------------------------------------------
|
|
class CWarDefinition
|
|
{
|
|
public:
|
|
|
|
CWarDefinition();
|
|
|
|
bool BInitFromKV( KeyValues *pKV, CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
struct CWarSideDefinition_t
|
|
{
|
|
CWarSideDefinition_t()
|
|
: m_pszLeaderboardName( NULL )
|
|
, m_pszLocalizedName( NULL )
|
|
, m_nSideIndex( INVALID_WAR_SIDE )
|
|
{}
|
|
|
|
bool BInitFromKV( const char* pszContainingWarName, KeyValues *pKVSide, CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
const char* m_pszLocalizedName;
|
|
const char* m_pszLeaderboardName;
|
|
war_side_t m_nSideIndex;
|
|
};
|
|
typedef CUtlMap< war_side_t, CWarSideDefinition_t > SidesMap_t;
|
|
|
|
const SidesMap_t& GetSides() const { return m_mapSides; }
|
|
const CWarSideDefinition_t* GetSide( war_side_t nSide ) const;
|
|
war_definition_index_t GetDefIndex() const { return m_nDefIndex; }
|
|
const char* GetDefName() const { return m_pszDefName; }
|
|
bool IsActive() const;
|
|
bool IsValidSide( war_side_t nSide ) const;
|
|
RTime32 GetStartDate() const { return m_rtTimeStart; }
|
|
RTime32 GetEndDate() const { return m_rtTimeEnd; }
|
|
private:
|
|
|
|
const char* m_pszLocalizedWarname;
|
|
const char* m_pszDefName;
|
|
SidesMap_t m_mapSides;
|
|
RTime32 m_rtTimeStart;
|
|
RTime32 m_rtTimeEnd;
|
|
war_definition_index_t m_nDefIndex;
|
|
};
|
|
typedef CUtlMap< war_definition_index_t, CWarDefinition* > WarDefinitionMap_t;
|
|
|
|
const char *GetPlayerClassName( int iClass );
|
|
const char *GetPlayerClassLocalizationKey( int iClass );
|
|
itemid_t GetAssociatedQuestItemID( const IEconItemInterface *pEconItem );
|
|
|
|
class CTFItemDefinition : public CEconItemDefinition
|
|
{
|
|
public:
|
|
|
|
CTFItemDefinition()
|
|
{
|
|
InternalInitialize();
|
|
}
|
|
|
|
~CTFItemDefinition()
|
|
{
|
|
if ( m_pTauntData )
|
|
{
|
|
delete m_pTauntData;
|
|
m_pTauntData = NULL;
|
|
}
|
|
}
|
|
|
|
// CEconItemDefinition interface.
|
|
virtual bool BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors = NULL ) OVERRIDE;
|
|
#if defined(CLIENT_DLL) || defined(GAME_DLL)
|
|
virtual bool BInitFromTestItemKVs( int iNewDefIndex, KeyValues *pKVItem, CUtlVector<CUtlString>* pVecErrors = NULL ) OVERRIDE;
|
|
virtual void CopyPolymorphic( const CEconItemDefinition *pSourceDef );
|
|
virtual void GeneratePrecacheModelStrings( bool bDynamicLoad, CUtlVector<const char *> *out_pVecModelStrings ) const;
|
|
#endif // defined(CLIENT_DLL) || defined(GAME_DLL)
|
|
|
|
int GetAnimSlot( void ) const { return m_iAnimationSlot; }
|
|
|
|
// Class & Slot handling
|
|
int GetDefaultLoadoutSlot( void ) const { return m_iDefaultLoadoutSlot; }
|
|
int GetAccountLoadoutSlot( void ) const { return m_iDefaultLoadoutSlot; }
|
|
const CBitVec<LOADOUT_COUNT> *GetClassUsability( void ) const { return &m_vbClassUsability; }
|
|
void FilloutSlotUsage( CBitVec<LOADOUT_COUNT> *pBV ) const;
|
|
bool CanBeUsedByClass( int iClass ) const { return iClass == GEconItemSchema().GetAccountIndex() ? m_eEquipType == EQUIP_TYPE_ACCOUNT : m_vbClassUsability.IsBitSet( iClass ); }
|
|
bool CanBeUsedByAllClasses( void ) const;
|
|
EEquipType_t GetEquipType( void ) const { return m_eEquipType; }
|
|
bool CanBePlacedInSlot( int nSlot ) const;
|
|
const char *GetPlayerDisplayModel( int iClass ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_pszPlayerDisplayModel[iClass]; }
|
|
virtual const char *GetPlayerDisplayModelAlt( int iClass = 0 ) const { Assert( iClass >= 0 && iClass < LOADOUT_COUNT ); return m_pszPlayerDisplayModelAlt[iClass]; }
|
|
|
|
int GetLoadoutSlot( int iLoadoutClass ) const;
|
|
#ifndef GC_DLL
|
|
bool IsAWearable() const;
|
|
bool IsContentStreamable() const;
|
|
const char* GetAdTextToken() const { return m_pszAdText; }
|
|
const char* GetAdResFile() const { return m_pszAdResFile; }
|
|
#endif // !GC_DLL
|
|
|
|
CTFTauntInfo *GetTauntData() const { return m_pTauntData; }
|
|
|
|
const CQuestDefinition *GetQuestDef() const { return m_pQuestData; }
|
|
|
|
KeyValues *GetPaintKitWearDefinition( int nWear ) const;
|
|
const char *GetPaintKitName( ) const;
|
|
|
|
#ifdef CLIENT_DLL
|
|
bool HasDetailedIcon() const { return m_bHasDetailedIcon; }
|
|
#endif // CLIENT_DLL
|
|
|
|
private:
|
|
void InternalInitialize();
|
|
|
|
// The load-out slot that this item can be placed into.
|
|
int m_iDefaultLoadoutSlot;
|
|
int m_iAnimationSlot;
|
|
|
|
// taunt item data
|
|
CTFTauntInfo *m_pTauntData;
|
|
|
|
// Quest data
|
|
CQuestDefinition *m_pQuestData;
|
|
|
|
// The .mdl file used for this item when it's being carried by a player.
|
|
const char *m_pszPlayerDisplayModel[LOADOUT_COUNT];
|
|
const char *m_pszPlayerDisplayModelAlt[LOADOUT_COUNT];
|
|
|
|
#ifndef GC_DLL
|
|
const char* m_pszAdText;
|
|
const char* m_pszAdResFile;
|
|
#endif
|
|
|
|
// Specifies which class can use this item.
|
|
CBitVec<LOADOUT_COUNT> m_vbClassUsability;
|
|
int m_iLoadoutSlots[LOADOUT_COUNT]; // Slot that each class places the item into.
|
|
EEquipType_t m_eEquipType;
|
|
|
|
#ifdef CLIENT_DLL
|
|
bool m_bHasDetailedIcon;
|
|
#endif // CLIENT_DLL
|
|
};
|
|
|
|
class CTFStyleInfo : public CEconStyleInfo
|
|
{
|
|
public:
|
|
CTFStyleInfo()
|
|
{
|
|
for ( int i = 0; i < ARRAYSIZE( m_pszPlayerDisplayModel ); i++ )
|
|
{
|
|
for ( int j = 0; j < ARRAYSIZE( m_pszPlayerDisplayModel[i] ); j++ )
|
|
{
|
|
m_pszPlayerDisplayModel[i][j] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
virtual void BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors ) OVERRIDE;
|
|
#if defined(CLIENT_DLL) || defined(GAME_DLL)
|
|
virtual void GeneratePrecacheModelStringsForStyle( CUtlVector<const char *> *out_pVecModelStrings ) const OVERRIDE;
|
|
#endif
|
|
|
|
const char *GetPlayerDisplayModel( int iClass, int iTeam ) const;
|
|
|
|
private:
|
|
// The .mdl file used for this item when it's being carried by a player.
|
|
const char *m_pszPlayerDisplayModel[2][LOADOUT_COUNT];
|
|
};
|
|
|
|
class CTFCraftingRecipeDefinition : public CEconCraftingRecipeDefinition
|
|
{
|
|
public:
|
|
virtual bool ItemListMatchesInputs( CUtlVector<CEconItem*> *vecCraftingItems, KeyValues *out_pkvCraftParams, bool bIgnoreSlop, CUtlVector<uint64> *vecChosenItems ) const OVERRIDE;
|
|
|
|
// A client function for testing to see if the contents of the player's backpack can match against this recipe.
|
|
// Broken out into a separate function so we don't run the risk of its thorny logic introducing bugs into the backend crafting logic.
|
|
bool CanMatchAgainstBackpack( CUtlVector<CEconItem*> *vecAllItems, CUtlVector<CEconItem*> vecItemsByClass[LOADOUT_COUNT], CUtlVector<CEconItem*> vecItemsBySlot[ CLASS_LOADOUT_POSITION_COUNT ], CUtlVector<uint64> *vecChosenItems ) const;
|
|
|
|
private:
|
|
bool CheckSubItemListAgainstBackpack( CUtlVector<CEconItem*> *vecCraftingItems, CUtlVector<uint64> *vecChosenItems ) const;
|
|
};
|
|
|
|
typedef uint32 ObjectiveConditionDefIndex_t;
|
|
const ObjectiveConditionDefIndex_t INVALID_QUEST_OBJECTIVE_CONDITIONS_INDEX = ObjectiveConditionDefIndex_t(-1);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CTFQuestObjectiveConditionsDefinition
|
|
// These contain the actual logic that can be used by multiple objectives.
|
|
//-----------------------------------------------------------------------------
|
|
class CTFQuestObjectiveConditionsDefinition
|
|
{
|
|
public:
|
|
CTFQuestObjectiveConditionsDefinition( void );
|
|
virtual ~CTFQuestObjectiveConditionsDefinition( void );
|
|
|
|
virtual bool BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
bool BPostInit( CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
|
|
ObjectiveConditionDefIndex_t GetDefIndex() const { return m_nDefIndex; }
|
|
#ifndef GC_DLL
|
|
KeyValues *GetKeyValues() const { return m_pConditionsKey; }
|
|
#endif
|
|
|
|
const CUtlVector< CTFRequiredQuestItemsSet >& GetRequiredItemSets() const { return m_vecRequiredItemSets; }
|
|
|
|
private:
|
|
ObjectiveConditionDefIndex_t m_nDefIndex;
|
|
#ifndef GC_DLL
|
|
KeyValues *m_pConditionsKey;
|
|
#endif
|
|
|
|
CUtlVector< CTFRequiredQuestItemsSet > m_vecRequiredItemSets;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CQuestObjectiveDefinition
|
|
//-----------------------------------------------------------------------------
|
|
class CTFQuestObjectiveDefinition : public CQuestObjectiveDefinition
|
|
{
|
|
public:
|
|
|
|
CTFQuestObjectiveDefinition( void );
|
|
virtual ~CTFQuestObjectiveDefinition( void );
|
|
|
|
virtual bool BInitFromKV( KeyValues *pKVItem, CUtlVector<CUtlString> *pVecErrors = NULL ) OVERRIDE;
|
|
|
|
#ifndef GC_DLL
|
|
KeyValues *GetConditionsKeyValues() const;
|
|
#endif
|
|
const CTFQuestObjectiveConditionsDefinition* GetConditions() const;
|
|
|
|
private:
|
|
ObjectiveConditionDefIndex_t m_nConditionDefIndex;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MvMMap_t
|
|
//-----------------------------------------------------------------------------
|
|
struct MvMMap_t
|
|
{
|
|
CUtlConstString m_sMap; // name of the map file
|
|
CUtlConstString m_sDisplayName; // Localization tag starting with '#'
|
|
CUtlVector<int> m_vecMissions; // indexes into the schema's challenge list
|
|
};
|
|
|
|
enum EMvMChallengeDifficulty
|
|
{
|
|
k_EMvMChallengeDifficulty_Invalid = -1,
|
|
k_EMvMChallengeDifficulty_Normal = 1,
|
|
k_EMvMChallengeDifficulty_Intermediate = 2,
|
|
k_EMvMChallengeDifficulty_Advanced = 3,
|
|
k_EMvMChallengeDifficulty_Expert = 4,
|
|
k_EMvMChallengeDifficulty_Haunted = 5,
|
|
|
|
k_EMvMChallengeDifficultyFirstValid = k_EMvMChallengeDifficulty_Normal,
|
|
k_EMvMChallengeDifficultyLastValid = k_EMvMChallengeDifficulty_Haunted
|
|
};
|
|
|
|
extern EMvMChallengeDifficulty GetMvMChallengeDifficultyByInternalName( const char *pszEnglishID );
|
|
extern const char *GetMvMChallengeDifficultyLocName( EMvMChallengeDifficulty eDifficulty );
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MvMMission_t
|
|
//-----------------------------------------------------------------------------
|
|
struct MvMMission_t
|
|
{
|
|
int m_iDisplayMapIndex; // Index into the schema's map list, for UI purposes
|
|
CUtlConstString m_sPop; // name of the pop file
|
|
CUtlConstString m_sDisplayName; // Localization tag starting with '#'
|
|
CUtlConstString m_sMode; // Localization tag starting with '#'
|
|
CUtlConstString m_sMapNameActual; // name of the map file to really load
|
|
EMvMChallengeDifficulty m_eDifficulty;
|
|
uint32 m_unMannUpPoints; // points for completing mission
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MvMTour_t
|
|
//-----------------------------------------------------------------------------
|
|
struct MvMTourMission_t
|
|
{
|
|
int m_iMissionIndex; // index to the schema's challenge list
|
|
int m_iBadgeSlot; // *index* (0...31) of the slot on the badge. -1 if not assigned a slot. (No bragging rights for this challenge.)
|
|
};
|
|
|
|
struct MvMTour_t
|
|
{
|
|
CUtlConstString m_sTourInternalName;
|
|
CUtlConstString m_sTourNameLocalizationToken; // Localization tag starting with '#', shown to clients
|
|
CUtlConstString m_sLootImageName;
|
|
const CEconItemDefinition *m_pBadgeItemDef; // can be NULL if there is no badge reward. Implies all badge slots will be -1. Only really valid for practice tours.
|
|
#ifdef GC
|
|
const CEconLootListDefinition *m_pMissionCompleteLootList; // can be NULL, but really only makes sense if there is no badge reward.
|
|
const CEconLootListDefinition *m_pTourCompleteLootList; // can be NULL, but really only makes sense if there is no badge reward.
|
|
#endif
|
|
CCopyableUtlVector<MvMTourMission_t> m_vecMissions; // indexes into the schema's challenge list
|
|
uint32 m_nAllChallengesBits;
|
|
EMvMChallengeDifficulty m_eDifficulty;
|
|
bool m_bIsNew;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Maps
|
|
//-----------------------------------------------------------------------------
|
|
|
|
enum EGameCategory
|
|
{
|
|
kGameCategory_Escort = 0,
|
|
kGameCategory_CTF,
|
|
kGameCategory_AttackDefense,
|
|
kGameCategory_Koth,
|
|
kGameCategory_CP,
|
|
kGameCategory_EscortRace,
|
|
kGameCategory_EventMix,
|
|
kGameCategory_SD,
|
|
kGameCategory_Quickplay,
|
|
kGameCategory_Event247,
|
|
kGameCategory_Arena,
|
|
kGameCategory_RobotDestruction,
|
|
kGameCategory_Powerup,
|
|
kGameCategory_Featured,
|
|
kGameCategory_Passtime,
|
|
kGameCategory_Community_Update,
|
|
kGameCategory_Misc,
|
|
kGameCategory_Competitive_6v6,
|
|
kGameCategory_Other,
|
|
kGameCategory_Halloween,
|
|
|
|
// Note: Don't reorder this list. Only add to the end
|
|
|
|
eNumGameCategories,
|
|
};
|
|
|
|
typedef uint32 map_identifier_t;
|
|
|
|
enum eQuickplayMatchType
|
|
{
|
|
kQuickplay_AdvancedUsersOnly,
|
|
kQuickplay_AllUsers, // everyone
|
|
kQuickplay_Disabled, // no-one
|
|
|
|
kQuickplayTypeCount
|
|
};
|
|
|
|
enum EMatchmakingGroupType
|
|
{
|
|
kMatchmakingType_None = -1,
|
|
|
|
kMatchmakingType_SpecialEvents,
|
|
kMatchmakingType_Core,
|
|
kMatchmakingType_Alternative,
|
|
kMatchmakingType_Competitive_6v6,
|
|
|
|
kMatchmakingTypeCount
|
|
};
|
|
|
|
enum EMatchmakingGameModeRestrictionType
|
|
{
|
|
kMatchmakingGameModeRestrictionType_None = -1,
|
|
|
|
kMatchmakingGameModeRestrictionType_Holiday,
|
|
kMatchmakingGameModeRestrictionType_Operation,
|
|
|
|
kMatchmakingGameModeRestrictionTypeCount
|
|
};
|
|
|
|
typedef uint32 MapDefIndex_t;
|
|
|
|
struct MapDef_t
|
|
{
|
|
MapDef_t( const char* pszMapStampDefName )
|
|
: mapStampDef( pszMapStampDefName )
|
|
, m_nStatsIdentifier( (MapDefIndex_t)-1 )
|
|
{}
|
|
|
|
CSchemaItemDefHandle mapStampDef;
|
|
MapDefIndex_t m_nDefIndex;
|
|
const char* pszMapName;
|
|
const char* pszMapNameLocKey;
|
|
const char* pszAuthorsLocKey; // if set, will be considered a community map in the UI
|
|
const char* pszStrangePrefixLocKey;
|
|
|
|
// The m_nStatsIdentifier field is used when looking up a map in a user's gamestats.
|
|
// It's a relic from the quickplay days and how the maps were defined in the schema back then.
|
|
// We've since switched to using a map defindex, which is easier to read and manage, but this
|
|
// field still needs to be used to lookup map gamestats because millions of customers
|
|
// have these maps identified by those numbers in their gamestats. The old numbers for existing
|
|
// maps is already defined in _maps.txt newly defined maps don't need to specify a "statsidentifier"
|
|
// field, because they will generate their own unique identifier.
|
|
map_identifier_t m_nStatsIdentifier;
|
|
map_identifier_t GetStatsIdentifier() const { return m_nStatsIdentifier == -1 ? (m_nDefIndex << 16) : m_nStatsIdentifier; }
|
|
bool IsCommunityMap() const { return pszAuthorsLocKey != NULL; }
|
|
CUtlVector< EGameCategory > m_vecAssociatedGameCategories;
|
|
CUtlVector<econ_tag_handle_t> vecTags;
|
|
// The rolling match tags for this map. When a rolling match vote happens, only allow voting on
|
|
// maps that have at least one matching tag with this map.
|
|
struct WeightedNextMapCandidates_t
|
|
{
|
|
MapDefIndex_t m_nDefIndex;
|
|
float m_flWeight;
|
|
};
|
|
CUtlVector< WeightedNextMapCandidates_t > m_vecRollingMatchMaps;
|
|
void AddMapAsTargetWithWeight( const WeightedNextMapCandidates_t& target )
|
|
{
|
|
FOR_EACH_VEC( m_vecRollingMatchMaps, i )
|
|
{
|
|
if ( m_vecRollingMatchMaps[ i ].m_nDefIndex == target.m_nDefIndex )
|
|
{
|
|
m_vecRollingMatchMaps[ i ].m_flWeight = Max( m_vecRollingMatchMaps[ i ].m_flWeight, target.m_flWeight );
|
|
return;
|
|
}
|
|
}
|
|
|
|
m_vecRollingMatchMaps.AddToTail( target );
|
|
}
|
|
|
|
CUtlVector< econ_tag_handle_t > m_vecRollingMatchTags;
|
|
bool BHasRollingMatchTag( econ_tag_handle_t tag ) const
|
|
{
|
|
FOR_EACH_VEC( m_vecRollingMatchTags, i )
|
|
{
|
|
if ( m_vecRollingMatchTags[ i ] == tag )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
struct WeightedNextMapTargets_t
|
|
{
|
|
econ_tag_handle_t m_tag;
|
|
float m_flWeight;
|
|
};
|
|
CUtlVector< WeightedNextMapTargets_t > m_vecRollingMatchTargets;
|
|
|
|
};
|
|
|
|
struct SchemaMMGameModeRestriction_t
|
|
{
|
|
SchemaMMGameModeRestriction_t()
|
|
{
|
|
m_eType = kMatchmakingGameModeRestrictionType_None;
|
|
m_nValue = -1;
|
|
}
|
|
|
|
EMatchmakingGameModeRestrictionType m_eType;
|
|
int m_nValue;
|
|
CUtlString m_strValue;
|
|
};
|
|
|
|
struct SchemaMMGroup_t;
|
|
struct SchemaGameCategory_t
|
|
{
|
|
SchemaGameCategory_t()
|
|
: m_eGameCategory( eNumGameCategories )
|
|
, m_pszLocalizedName( NULL )
|
|
, m_pMMGroup( NULL )
|
|
, m_pszLocalizedDesc( NULL )
|
|
, m_pszListImage( NULL )
|
|
{}
|
|
|
|
SchemaGameCategory_t( const SchemaGameCategory_t& other )
|
|
{
|
|
m_eGameCategory = other.m_eGameCategory;
|
|
m_pMMGroup = other.m_pMMGroup;
|
|
m_pszLocalizedName = other.m_pszLocalizedName;
|
|
m_pszLocalizedDesc = other.m_pszLocalizedDesc;
|
|
m_pszListImage = other.m_pszListImage;
|
|
m_vecMaps.Purge();
|
|
m_vecMaps.CopyArray( other.m_vecMaps.Base(), other.m_vecMaps.Count() );
|
|
m_vecRestrictions.Purge();
|
|
m_vecRestrictions.CopyArray( other.m_vecRestrictions.Base(), other.m_vecRestrictions.Count() );
|
|
}
|
|
|
|
~SchemaGameCategory_t()
|
|
{}
|
|
|
|
void AddMap( const MapDef_t *pMap, bool bEnabled )
|
|
{
|
|
if ( !pMap )
|
|
return;
|
|
|
|
m_vecMaps.AddToTail( pMap );
|
|
|
|
if ( bEnabled )
|
|
{
|
|
m_vecEnabledMaps.AddToTail( pMap );
|
|
}
|
|
}
|
|
|
|
const MapDef_t *GetRandomMap( void ) const
|
|
{
|
|
Assert( m_vecEnabledMaps.Count() );
|
|
return m_vecEnabledMaps[RandomInt( 0, m_vecEnabledMaps.Count() - 1 )];
|
|
}
|
|
|
|
bool PassesRestrictions() const;
|
|
|
|
//void SerializeToKVs( KeyValues* pKV );
|
|
|
|
EGameCategory m_eGameCategory;
|
|
const SchemaMMGroup_t* m_pMMGroup;
|
|
const char* m_pszName;
|
|
const char* m_pszLocalizedName;
|
|
const char* m_pszLocalizedDesc;
|
|
const char* m_pszListImage;
|
|
const char* m_pszMMType;
|
|
CUtlVector< const MapDef_t* > m_vecEnabledMaps;
|
|
CUtlVector< SchemaMMGameModeRestriction_t > m_vecRestrictions;
|
|
CUtlVector< const MapDef_t* > m_vecMaps;
|
|
};
|
|
typedef CUtlMap< EGameCategory, SchemaGameCategory_t* > GameCategoryMap_t;
|
|
|
|
struct SchemaMMGroup_t
|
|
{
|
|
SchemaMMGroup_t()
|
|
: m_eMMGroup( kMatchmakingType_None )
|
|
, m_pszLocalizedName( NULL )
|
|
, m_nMaxExcludes( 0 )
|
|
{}
|
|
|
|
SchemaMMGroup_t( const SchemaMMGroup_t& other )
|
|
{
|
|
m_eMMGroup = other.m_eMMGroup;
|
|
m_pszLocalizedName = other.m_pszLocalizedName;
|
|
m_nMaxExcludes = other.m_nMaxExcludes;
|
|
m_vecModes.Purge();
|
|
m_vecModes.CopyArray( other.m_vecModes.Base(), other.m_vecModes.Count() );
|
|
}
|
|
|
|
bool IsCategoryValid() const;
|
|
|
|
~SchemaMMGroup_t()
|
|
{}
|
|
|
|
EMatchmakingGroupType m_eMMGroup;
|
|
const char* m_pszName;
|
|
const char* m_pszLocalizedName;
|
|
int m_nMaxExcludes;
|
|
CBitVec<k_nMatchGroup_Count> m_bitsValidMMGroups;
|
|
CUtlVector< const SchemaGameCategory_t* > m_vecModes;
|
|
};
|
|
typedef CUtlMap< EMatchmakingGroupType, SchemaMMGroup_t* > MMGroupMap_t;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// CTFItemSchema
|
|
//-----------------------------------------------------------------------------
|
|
class CTFItemSchema : public CEconItemSchema
|
|
{
|
|
public:
|
|
CTFItemSchema();
|
|
|
|
virtual void Reset();
|
|
|
|
CTFItemDefinition *GetTFItemDefinition( int iItemIndex )
|
|
{
|
|
return (CTFItemDefinition *)GetItemDefinition( iItemIndex );
|
|
}
|
|
|
|
CTFCraftingRecipeDefinition *GetTFCraftingRecipeDefinition( int iRecipeIndex )
|
|
{
|
|
return (CTFCraftingRecipeDefinition *)GetRecipeDefinition( iRecipeIndex );
|
|
}
|
|
|
|
const CQuestThemeDefinition *GetQuestThemeByName( const char *pszDefName ) const;
|
|
const CUtlMap<const char*, CQuestThemeDefinition*, int >& GetQuestThemes() const { return m_mapQuestThemes; }
|
|
const CTFQuestObjectiveConditionsDefinition* GetQuestObjectiveConditionByDefIndex( ObjectiveConditionDefIndex_t nDefIndex );
|
|
|
|
const CWarDefinition *GetWarDefinitionByIndex( war_definition_index_t nDefIndex ) const;
|
|
const CWarDefinition *GetWarDefinitionByName( const char* pszDefName ) const;
|
|
const WarDefinitionMap_t& GetWarDefinitions() const { return m_mapWars; }
|
|
|
|
const CUtlVector<const char *>& GetClassUsabilityStrings() const { return m_vecClassUsabilityStrings; }
|
|
const CUtlVector<const char *>& GetLoadoutStrings( EEquipType_t eType ) const { return eType == EQUIP_TYPE_CLASS ? m_vecClassLoadoutStrings : m_vecAccountLoadoutStrings; }
|
|
const CUtlVector<const char *>& GetLoadoutStringsForDisplay( EEquipType_t eType ) const { return eType == EQUIP_TYPE_CLASS ? m_vecClassLoadoutStringsForDisplay : m_vecAccountLoadoutStringsForDisplay; }
|
|
const CUtlVector<const char *>& GetWeaponTypeSubstrings() const { return m_vecWeaponTypeSubstrings; }
|
|
|
|
static const char k_rchOverrideItemLevelDescStringAttribName[];
|
|
|
|
static const char k_rchMvMTicketItemDefName[];
|
|
static const char k_rchMvMSquadSurplusVoucherItemDefName[];
|
|
static const char k_rchMvMPowerupBottleItemDefName[];
|
|
static const char k_rchMvMChallengeCompletedMaskAttribName[];
|
|
static const char k_rchLadderPassItemDefName[];
|
|
|
|
static const char *GetMvMBadgeContractPointsAttributeName( EMvMChallengeDifficulty difficulty );
|
|
static const char *GetMvMBadgeContractLevelAttributeName( EMvMChallengeDifficulty difficulty );
|
|
|
|
const CUtlVector<MvMMap_t>& GetMvmMaps() const { return m_vecMvMMaps; }
|
|
const CUtlVector<MvMMission_t>& GetMvmMissions() const { return m_vecMvMMissions; }
|
|
const CUtlVector<MvMTour_t>& GetMvmTours() const { return m_vecMvMTours; }
|
|
//
|
|
/// Return index into mission list, or one of these special values:
|
|
/// k_iMvmMissionIndex_Any if empty string is passed
|
|
/// k_iMvmMissionIndex_NotInSchema if not found
|
|
///
|
|
/// Input is the full pop filename, but without the directory or extension
|
|
int FindMvmMissionByName( const char *pszChallengeName ) const;
|
|
|
|
/// Get pop filename (without extension) given the challenge index.
|
|
/// Handles k_iMvmMissionIndex_Any and k_iMvmMissionIndex_NotInSchema
|
|
const char *GetMvmMissionName( int iChallengeIndex ) const;
|
|
|
|
/// Return index into tour list, or one of these special values:
|
|
/// k_iMvmTourIndex_Any if empty string is passed
|
|
/// k_iMvmTourIndex_NotInSchema if not found
|
|
///
|
|
/// Input is the value of MvMTour_t::m_sTourInternalName
|
|
int FindMvmTourByName( const char *pszTourName ) const;
|
|
|
|
/// Find mission within a particular tour, and return index into MvMTour_t::m_vecMissions.
|
|
/// Returns -1 if invalid tour index or mission is not part of the tour
|
|
int FindMvmMissionInTour( int idxTour, int idxMissionInSchema ) const;
|
|
|
|
/// Get badge slot corresponding to particular mission, for a given tour.
|
|
/// Returns bit index MvMTourMission_t::m_iBadgeSlot (NOT BITMASK), or -1 if
|
|
/// invalid tour index of mission is not part of the tour
|
|
int GetMvmMissionBadgeSlotForTour( int idxTour, int idxMissionInSchema ) const;
|
|
|
|
int GetMapCount() const { return m_vecMasterListOfMaps.Count(); }
|
|
const MapDef_t *GetMasterMapDefByName( const char *pszSearchName ) const;
|
|
const MapDef_t *GetMasterMapDefByIndex( MapDefIndex_t unIndex ) const;
|
|
const CUtlVector<MapDef_t*>& GetMasterMapsList() const { return m_vecMasterListOfMaps; }
|
|
const GameCategoryMap_t& GetGameCategoryMap() const { return m_mapGameCategories; }
|
|
const SchemaGameCategory_t* GetGameCategory( EGameCategory eType ) const;
|
|
const MMGroupMap_t& GetMMGroupMap() const { return m_mapMMGroups; }
|
|
const SchemaMMGroup_t* GetMMGroup( EMatchmakingGroupType eCat ) const;
|
|
|
|
public:
|
|
// CEconItemSchema interface.
|
|
virtual CEconItemDefinition *CreateEconItemDefinition() { return new CTFItemDefinition; }
|
|
virtual CEconCraftingRecipeDefinition *CreateCraftingRecipeDefinition() { return new CTFCraftingRecipeDefinition; }
|
|
virtual CEconStyleInfo *CreateEconStyleInfo() { return new CTFStyleInfo; }
|
|
virtual CQuestObjectiveDefinition *CreateQuestDefinition() { return new CTFQuestObjectiveDefinition; }
|
|
|
|
virtual bool BCanStrangeFilterApplyToStrangeSlotInItem( uint32 /*strange_event_restriction_t*/ unRestrictionType, uint32 unRestrictionValue, const IEconItemInterface *pItem, int iStrangeSlot, uint32 *out_pOptionalScoreType ) const;
|
|
|
|
virtual IEconTool *CreateEconToolImpl( const char *pszToolType, const char *pszUseString, const char *pszUsageRestriction, item_capabilities_t unCapabilities, KeyValues *pUsageKV ) OVERRIDE;
|
|
|
|
virtual bool BInitSchema( KeyValues *pKVRawDefinition, CUtlVector<CUtlString> *pVecErrors = NULL );
|
|
|
|
virtual RTime32 GetCustomExpirationDate( const char *pszExpirationDate ) const OVERRIDE;
|
|
|
|
protected:
|
|
#ifdef TF_CLIENT_DLL
|
|
virtual int CalculateNumberOfConcreteItems( const CEconItemDefinition *pItemDef );
|
|
#endif // TF_CLIENT_DLL
|
|
|
|
private:
|
|
void InitializeStringTable( const char **ppStringTable, unsigned int unStringCount, CUtlVector<const char *> *out_pvecStringTable );
|
|
|
|
bool BInitMvmMissions( KeyValues *pKVMvmMaps, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitMvmTours( KeyValues *pKVMvmTours, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitGameModes( KeyValues *pKVMaps, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitMaps( KeyValues *pKVMaps, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitMMCategories( KeyValues *pKVCategories, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitQuestThemes( KeyValues *pKVThemes, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitQuestObjectiveConditions( KeyValues *pKVConditionsBlock, CUtlVector<CUtlString> *pVecErrors );
|
|
bool BObjectiveConditionsPostInit( CUtlVector<CUtlString> *pVecErrors );
|
|
bool BInitWarDefs( KeyValues *pKVWarDefs, CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
bool BPostInitMaps( CUtlVector<CUtlString> *pVecErrors );
|
|
|
|
CUtlVector<const char *> m_vecClassUsabilityStrings;
|
|
CUtlVector<const char *> m_vecClassLoadoutStrings;
|
|
CUtlVector<const char *> m_vecClassLoadoutStringsForDisplay;
|
|
CUtlVector<const char *> m_vecAccountLoadoutStrings;
|
|
CUtlVector<const char *> m_vecAccountLoadoutStringsForDisplay;
|
|
CUtlVector<const char *> m_vecWeaponTypeSubstrings;
|
|
|
|
CUtlVector<MvMMap_t> m_vecMvMMaps;
|
|
CUtlVector<MvMMission_t> m_vecMvMMissions;
|
|
CUtlVector<MvMTour_t> m_vecMvMTours;
|
|
// Contains the list of the quest themes
|
|
CUtlMap<const char*, CQuestThemeDefinition*, int > m_mapQuestThemes;
|
|
CUtlMap< ObjectiveConditionDefIndex_t, CTFQuestObjectiveConditionsDefinition* > m_mapQuestObjectiveConditions;
|
|
|
|
CUtlVector<MapDef_t*> m_vecMasterListOfMaps;
|
|
GameCategoryMap_t m_mapGameCategories;
|
|
MMGroupMap_t m_mapMMGroups;
|
|
WarDefinitionMap_t m_mapWars;
|
|
};
|
|
|
|
#endif // TFITEMSCHEMA_H
|