|
|
//========= 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
|