|
|
|
|
//========= 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);
|
|
|
|
|
}
|