Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

121 lines
3.2 KiB

#include "asw_key_values_database.h"
#include "asw_system.h"
#include "KeyValues.h"
#include "vgui/ILocalize.h"
#include "tier3/tier3.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
bool CASW_KeyValuesDatabase::m_bLoadedLocalization = false;
CASW_KeyValuesDatabase::CASW_KeyValuesDatabase()
{
}
void CASW_KeyValuesDatabase::LoadFiles( const char *pFolderName )
{
if ( !m_bLoadedLocalization )
{
g_pVGuiLocalize->AddFile( "tilegen/missions_%language%.txt" );
m_bLoadedLocalization = true;
}
m_Files.RemoveAll();
Q_strncpy( m_RootFolder, pFolderName, sizeof( m_RootFolder ) );
int nStrLen = Q_strlen( m_RootFolder );
nStrLen;
Assert( nStrLen > 0 && ( m_RootFolder[nStrLen - 1] == '/' || m_RootFolder[nStrLen - 1] == '\\' ) );
LoadFilesInFolder( m_RootFolder );
}
void CASW_KeyValuesDatabase::LoadFilesInFolder( const char *pPath )
{
FileFindHandle_t tagsfind = FILESYSTEM_INVALID_FIND_HANDLE;
// Search the directory structure.
char mapwild[MAX_PATH];
Q_snprintf( mapwild, sizeof( mapwild ), "%s*", pPath );
char const *filename;
filename = Sys_FindFirst( tagsfind, mapwild, NULL, 0 );
while (filename)
{
if ( g_pFullFileSystem->FindIsDirectory( tagsfind ) )
{
if ( Q_strcmp( filename, "." ) && Q_strcmp( filename, ".." ) )
{
char subfolder[MAX_PATH];
Q_snprintf( subfolder, sizeof( subfolder ), "%s%s/", pPath, filename );
LoadFilesInFolder( subfolder );
}
}
else
{
const char *pExt = Q_GetFileExtension( filename );
if ( pExt && !Q_stricmp( pExt, "txt" ) )
{
// load the mission spec
char fullFileName[256];
Q_snprintf(fullFileName, sizeof(fullFileName), "%s%s", pPath, filename);
KeyValues *pKeyValues = new KeyValues( filename );
if (pKeyValues->LoadFromFile(g_pFullFileSystem, fullFileName, "GAME"))
{
AddFile( pKeyValues, fullFileName );
}
else
{
Msg( "Error: failed to load file: %s\n", fullFileName );
}
}
}
filename = Sys_FindNext(tagsfind, NULL, 0);
}
Sys_FindClose( tagsfind );
}
KeyValues* CASW_KeyValuesDatabase::GetFileByName( const char *pFilename )
{
for ( int i = 0; i < m_Files.Count(); i++ )
{
if ( Q_stricmp( pFilename, m_Files[i].m_Filename ) == 0 )
return m_Files[i].m_pKeyValues;
}
return NULL;
}
KeyValues *CASW_KeyValuesDatabase::ReloadFile( const char *pFilename )
{
for ( int i = 0; i < m_Files.Count(); i++ )
{
if ( !Q_stricmp( pFilename, m_Files[i].m_Filename ) )
{
KeyValues *pKeyValues = new KeyValues( pFilename );
if ( pKeyValues->LoadFromFile( g_pFullFileSystem, pFilename, "GAME" ) )
{
m_Files[i].m_pKeyValues->deleteThis();
m_Files[i].m_pKeyValues = pKeyValues;
return pKeyValues;
}
else
{
Warning( "Error: failed to reload file: %s\n", pFilename );
break;
}
}
}
return NULL;
}
void CASW_KeyValuesDatabase::AddFile( KeyValues *pKeyValues, const char *pFilename )
{
m_Files.AddToTail();
FileEntry_t *pFileEntry = &m_Files[m_Files.Count() - 1];
Q_strncpy( pFileEntry->m_Filename, pFilename, MAX_PATH );
Q_FixSlashes( pFileEntry->m_Filename );
pFileEntry->m_pKeyValues = pKeyValues;
pKeyValues->SetString( "Filename", pFileEntry->m_Filename + Q_strlen( m_RootFolder ) );
}