|
|
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
|
// |
|
|
// Purpose: |
|
|
// |
|
|
// $NoKeywords: $ |
|
|
//=============================================================================// |
|
|
|
|
|
|
|
|
#include "ModInfo.h" |
|
|
#include "KeyValues.h" |
|
|
#include "vgui_controls/Controls.h" |
|
|
#include "filesystem.h" |
|
|
#include "EngineInterface.h" |
|
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
|
#include <tier0/memdbgon.h> |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: singleton accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
CModInfo &ModInfo() |
|
|
{ |
|
|
static CModInfo s_ModInfo; |
|
|
return s_ModInfo; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: Constructor |
|
|
//----------------------------------------------------------------------------- |
|
|
CModInfo::CModInfo() |
|
|
{ |
|
|
m_pModData = new KeyValues("ModData"); |
|
|
m_wcsGameTitle[0] = 0; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: Destructor |
|
|
//----------------------------------------------------------------------------- |
|
|
CModInfo::~CModInfo() |
|
|
{ |
|
|
FreeModInfo(); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: |
|
|
//----------------------------------------------------------------------------- |
|
|
void CModInfo::FreeModInfo() |
|
|
{ |
|
|
if (m_pModData) |
|
|
{ |
|
|
m_pModData->deleteThis(); |
|
|
m_pModData = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::IsMultiplayerOnly() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("type", ""), "multiplayer_only") == 0); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::IsSinglePlayerOnly() |
|
|
{ |
|
|
#ifndef _XBOX |
|
|
return (stricmp(m_pModData->GetString("type", ""), "singleplayer_only") == 0); |
|
|
#else |
|
|
// xboxissue - no support for disparate mounted content |
|
|
return true; |
|
|
#endif |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
const char *CModInfo::GetFallbackDir() |
|
|
{ |
|
|
return m_pModData->GetString("fallback_dir", ""); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
const wchar_t *CModInfo::GetGameTitle() |
|
|
{ |
|
|
if (!m_wcsGameTitle[0]) |
|
|
{ |
|
|
// for some reason, the standard ILocalize::ConvertANSIToUnicode() strips off |
|
|
// the '<EFBFBD>' character in 'HALF-LIFE<EFBFBD>' - so just do a straight upconvert to unicode |
|
|
const char *title = m_pModData->GetString("title", ""); |
|
|
int i = 0; |
|
|
for (; title[i] != 0; ++i) |
|
|
{ |
|
|
m_wcsGameTitle[i] = (wchar_t)title[i]; |
|
|
} |
|
|
m_wcsGameTitle[i] = 0; |
|
|
} |
|
|
|
|
|
return m_wcsGameTitle; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
const wchar_t *CModInfo::GetGameTitle2() |
|
|
{ |
|
|
if (!m_wcsGameTitle2[0]) |
|
|
{ |
|
|
// for some reason, the standard ILocalize::ConvertANSIToUnicode() strips off |
|
|
// the '<EFBFBD>' character in 'HALF-LIFE<EFBFBD>' - so just do a straight upconvert to unicode |
|
|
const char *title2 = m_pModData->GetString("title2", ""); |
|
|
int i = 0; |
|
|
for (; title2[i] != 0; ++i) |
|
|
{ |
|
|
m_wcsGameTitle2[i] = (wchar_t)title2[i]; |
|
|
} |
|
|
m_wcsGameTitle2[i] = 0; |
|
|
} |
|
|
|
|
|
return m_wcsGameTitle2; |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
const char *CModInfo::GetGameName() |
|
|
{ |
|
|
return m_pModData->GetString("game", ""); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
KeyValues *CModInfo::GetHiddenMaps() |
|
|
{ |
|
|
return m_pModData->FindKey( "hidden_maps" ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::HasPortals() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("hasportals", "0"), "1") == 0); |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::HasHDContent() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("hashdcontent", "0"), "1") == 0); |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::NoDifficulty() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("nodifficulty", "0"), "1") == 0); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::NoModels() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("nomodels", "0"), "1") == 0); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::NoHiModel() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("nohimodel", "0"), "1") == 0); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::NoCrosshair() |
|
|
{ |
|
|
return (stricmp(m_pModData->GetString("nocrosshair", "1"), "1") == 0); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::AdvCrosshair() |
|
|
{ |
|
|
return ( m_pModData->GetInt( "advcrosshair" ) > 0 ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
int CModInfo::AdvCrosshairLevel() |
|
|
{ |
|
|
return m_pModData->GetInt( "advcrosshair" ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: |
|
|
//----------------------------------------------------------------------------- |
|
|
void CModInfo::LoadCurrentGameInfo() |
|
|
{ |
|
|
// Load up gameinfo for the current mod |
|
|
char const *filename = "gameinfo.txt"; |
|
|
m_pModData->LoadFromFile( g_pFullFileSystem, filename ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: loads file from null-terminated buffer |
|
|
//----------------------------------------------------------------------------- |
|
|
void CModInfo::LoadGameInfoFromBuffer( const char *buffer ) |
|
|
{ |
|
|
// Load up gameinfo.txt for the current mod |
|
|
m_pModData->LoadFromBuffer( "", buffer ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::UseGameLogo() |
|
|
{ |
|
|
return ( Q_stricmp( m_pModData->GetString( "gamelogo", "0" ), "1" ) == 0 ); |
|
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::UseBots() |
|
|
{ |
|
|
return ( Q_stricmp( m_pModData->GetString( "bots", "0" ), "1" ) == 0 ); |
|
|
} |
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
|
// Purpose: data accessor |
|
|
//----------------------------------------------------------------------------- |
|
|
bool CModInfo::SupportsVR() |
|
|
{ |
|
|
return (m_pModData->GetInt( "supportsvr" ) > 0); |
|
|
}
|
|
|
|