summaryrefslogtreecommitdiff
path: root/hammer/prefabs.h
blob: 0afb1fd53a36a1d99244b31e1694982c4574bafa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
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