summaryrefslogtreecommitdiff
path: root/hammer/prefabs.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/prefabs.h')
-rw-r--r--hammer/prefabs.h238
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