diff options
Diffstat (limited to 'hammer/prefabs.h')
| -rw-r--r-- | hammer/prefabs.h | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/hammer/prefabs.h b/hammer/prefabs.h new file mode 100644 index 0000000..0afb1fd --- /dev/null +++ b/hammer/prefabs.h @@ -0,0 +1,238 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PREFABS_H +#define PREFABS_H +#pragma once + + +#include <afxtempl.h> +#pragma warning(push, 1) +#pragma warning(disable:4701 4702 4530) +#include <fstream> +#pragma warning(pop) + + +class BoundBox; +class CMapClass; +class CPrefab; +class CPrefabLibrary; + + +const POSITION ENUM_START = POSITION(1); +const int MAX_NOTES = 501; + + +enum +{ + pt3D, +}; + + +enum LibraryType_t +{ + LibType_None, + LibType_HalfLife, + LibType_HalfLife2, +}; + + +typedef CTypedPtrList<CPtrList, CPrefab*> CPrefabList; +typedef CTypedPtrList<CPtrList, CPrefabLibrary*> CPrefabLibraryList; + + +class CPrefab +{ +public: + + CPrefab(void); + virtual ~CPrefab(void); + + // load/save flags: + enum + { + lsRMF = 0x00, // default + lsMAP = 0x01, + lsRaw = 0x02, + lsUpdateFilePos = 0x04 + }; + + virtual int Save(LPCTSTR pszFilename, DWORD = 0) = 0; + virtual int Load(DWORD = 0) = 0; + + // set info: + void SetName(LPCTSTR pszName) + { strcpy(szName, pszName); } + void SetNotes(LPCTSTR pszNotes) + { strcpy(szNotes, pszNotes); } + + // get info: + LPCTSTR GetName() { return szName; } + LPCTSTR GetNotes() { return szNotes; } + + // unique id assigned at creation time: + DWORD GetID() { return dwID; } + + DWORD GetLibraryID() { return dwLibID; } + + // common interface: + virtual CMapClass *CreateInBox(BoundBox *pBox) = 0; + virtual int GetType() = 0; + virtual void FreeData() = 0; + virtual bool IsLoaded() = 0; + + // filetype determination: + typedef enum + { + pftUnknown, + pftRMF, + pftMAP, + pftScript + } pfiletype_t; + + // static misc stuff: + static pfiletype_t CheckFileType(LPCTSTR pszFilename); + static CPrefab* FindID(DWORD dwID); + + // caching: + static void AddMRU(CPrefab *pPrefab); + static void EnableCaching(BOOL = TRUE); + static void FreeAllData(); // free ALL objects' data + +protected: + + char szName[31]; + char szNotes[MAX_NOTES]; + DWORD dwID; + DWORD dwLibID; // library id + + DWORD dwFileOffset; + DWORD dwFileSize; // size in file - for copying purposes + + static CPrefabList PrefabList; + static CPrefabList MRU; + static BOOL bCacheEnabled; + +friend class CPrefabLibrary; +friend class CPrefabLibraryRMF; +friend class CPrefabLibraryVMF; +}; + + +// +// A collection of prefabs. +// +class CPrefabLibrary +{ +public: + CPrefabLibrary(); + ~CPrefabLibrary(); + + virtual int Load(LPCTSTR pszFilename) = 0; + virtual bool DeleteFile(void) = 0; + virtual int Save(LPCTSTR pszFilename = NULL, BOOL bIndexOnly = FALSE) = 0; + virtual bool IsFile(const char *szFile) = 0; + + void SetNameFromFilename(LPCTSTR pszFilename); + virtual int SetName(const char *pszName) = 0; + void SetNotes(LPCTSTR pszNotes) + { + strcpy(szNotes, pszNotes); + } + + // get info: + LPCTSTR GetName() { return m_szName; } + LPCTSTR GetNotes() { return szNotes; } + inline bool IsType(LibraryType_t eType); + + // unique id assigned at creation time: + DWORD GetID() { return dwID; } + + CPrefab * EnumPrefabs(POSITION& p); + void Add(CPrefab *pPrefab); + void Remove(CPrefab *pPrefab); + void Sort(); + + static CPrefabLibrary *FindID(DWORD dwID); + static CPrefabLibrary *EnumLibraries(POSITION &p, LibraryType_t eType = LibType_None); + static void LoadAllLibraries(void); + static void FreeAllLibraries(void); + static CPrefabLibrary *FindOpenLibrary(LPCTSTR pszFilename); + +protected: + + void FreePrefabs(); + + static CPrefabLibraryList PrefabLibraryList; + + CPrefabList Prefabs; + char m_szName[31]; + char szNotes[MAX_NOTES]; + DWORD dwID; + LibraryType_t m_eType; // HalfLife or HalfLife2 library? + +friend class CPrefab; +friend class CPrefabRMF; +friend class CPrefabVMF; +}; + + +class CPrefabLibraryRMF : public CPrefabLibrary +{ +public: + CPrefabLibraryRMF(); + ~CPrefabLibraryRMF(); + + bool IsFile(const char *szFile); + int Load(LPCTSTR pszFilename); + bool DeleteFile(void); + int Save(LPCTSTR pszFilename = NULL, BOOL bIndexOnly = FALSE); + int SetName(const char *pszName); + + std::fstream m_file; + +protected: + + DWORD m_dwDirOffset; // dir offset in open file + CString m_strOpenFileName; // open file name + +friend class CPrefab; +}; + + +class CPrefabLibraryVMF : public CPrefabLibrary +{ +public: + CPrefabLibraryVMF(); + ~CPrefabLibraryVMF(); + + bool IsFile(const char *szFile); + int Load(LPCTSTR pszFilename); + bool DeleteFile(void); + int Save(LPCTSTR pszFilename = NULL, BOOL bIndexOnly = FALSE); + int SetName(const char *pszName); + +protected: + + char m_szFolderName[MAX_PATH]; + +friend class CPrefab; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Returns whether this library is of a given type. Half-Life used +// .ol files to represent prefab libraries, Half-Life 2 uses a folder +// of VMF files. +//----------------------------------------------------------------------------- +bool CPrefabLibrary::IsType(LibraryType_t eType) +{ + return(m_eType == eType); +} + + +#endif // PREFABS_H |