//========= Copyright © 1996-2005, 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 //----------------------------------------------------------------------------- // 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); }