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.
140 lines
3.1 KiB
140 lines
3.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Utility function for creating HalfLife1-style prefab libraries from |
|
// a directory full of RMF and MAP files. |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "stdafx.h" |
|
#include "hammer.h" |
|
#include "Prefabs.h" |
|
#include "Prefab3d.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: One function - gets all the .rmf and .map files in the current dir, |
|
// merges them with same-name .txt files, and creates a prefab library |
|
// as specified in pszName. |
|
// Input : pszName - |
|
//----------------------------------------------------------------------------- |
|
void MakePrefabLibrary(LPCTSTR pszName) |
|
{ |
|
CPrefabLibrary *pLibrary = new CPrefabLibraryRMF; |
|
int nPrefabs = 0; |
|
|
|
printf("Making prefab library %s.ol\n", pszName); |
|
|
|
pLibrary->SetName(pszName); |
|
|
|
// disable caching of prefabs |
|
CPrefab::EnableCaching(FALSE); |
|
|
|
// get files |
|
static BOOL bFirst = TRUE; |
|
Again: |
|
WIN32_FIND_DATA fd; |
|
HANDLE hnd = FindFirstFile(bFirst ? "*.rmf" : "*.map", &fd); |
|
|
|
if(hnd != INVALID_HANDLE_VALUE) do |
|
{ |
|
// check file type |
|
CPrefab *pPrefab = NULL; |
|
int iLoadResult = -1; |
|
|
|
switch (CPrefab::CheckFileType(fd.cFileName)) |
|
{ |
|
case CPrefab::pftUnknown: |
|
{ |
|
continue; |
|
} |
|
|
|
case CPrefab::pftRMF: |
|
{ |
|
CPrefabRMF *pNew = new CPrefabRMF; |
|
iLoadResult = pNew->Init(fd.cFileName, TRUE, CPrefab::lsRMF); |
|
pPrefab = (CPrefab *)pNew; |
|
break; |
|
} |
|
|
|
case CPrefab::pftMAP: |
|
{ |
|
CPrefabRMF *pNew = new CPrefabRMF; |
|
iLoadResult = pNew->Init(fd.cFileName, TRUE, CPrefab::lsMAP); |
|
pPrefab = (CPrefab *)pNew; |
|
break; |
|
} |
|
|
|
case CPrefab::pftScript: |
|
{ |
|
Assert(0); // not supported yet |
|
break; |
|
} |
|
} |
|
|
|
if(iLoadResult == -1) |
|
{ |
|
// pPrefab might be null but delete doesn't care |
|
delete pPrefab; |
|
pPrefab = NULL; |
|
} |
|
|
|
if(!pPrefab) |
|
continue; |
|
|
|
printf(" including %s\n", fd.cFileName); |
|
++nPrefabs; |
|
|
|
// find text file - set info with it |
|
CString strTextFile = fd.cFileName; |
|
int iPos = strTextFile.Find('.'); |
|
strTextFile.GetBuffer(0)[iPos] = 0; |
|
strTextFile.ReleaseBuffer(); |
|
strTextFile += ".txt"; |
|
|
|
if(GetFileAttributes(strTextFile) != 0xFFFFFFFF) |
|
{ |
|
std::ifstream tfile(strTextFile); |
|
char szBuffer[1024], szBuffer2[1024]; |
|
memset(szBuffer, 0, sizeof szBuffer); |
|
// read file |
|
tfile.read(szBuffer, 1023); |
|
// get rid of \r and \n chars |
|
char *p1 = szBuffer, *p2 = szBuffer2; |
|
while(p1[0]) |
|
{ |
|
if(p1[0] != '\n' && p1[0] != '\r') |
|
{ |
|
p2[0] = p1[0]; |
|
++p2; |
|
} |
|
++p1; |
|
} |
|
p2[0] = 0; |
|
// set the prefab's info |
|
pPrefab->SetNotes(szBuffer2); |
|
} |
|
|
|
// add to new library |
|
pLibrary->Add(pPrefab); |
|
|
|
} while(FindNextFile(hnd, &fd)); |
|
|
|
if(bFirst) |
|
{ |
|
bFirst = FALSE; |
|
goto Again; |
|
} |
|
|
|
// now rewrite library |
|
pLibrary->Save(); |
|
|
|
CPrefab::FreeAllData(); // free memory |
|
// re-enable prefab caching |
|
CPrefab::EnableCaching(TRUE); |
|
|
|
printf("%d prefabs in library.\n", nPrefabs); |
|
} |
|
|
|
|