//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef GAMECONFIG_H
#define GAMECONFIG_H
#ifdef _WIN32
#pragma once
#endif

#pragma warning(push, 1)
#pragma warning(disable:4701 4702 4530)
#include <fstream>
#pragma warning(pop)
#include "fgdlib/HelperInfo.h"
#include "TokenReader.h"
#include "fgdlib/gamedata.h"
#include "GamePalette.h"
#include "IEditorTexture.h"
#include "utlvector.h"


class MDkeyvalue;
class KeyValues;


#define MAX_DIRECTORY_SIZE	32


enum MAPFORMAT
{
	mfQuake = 0,
	mfHexen2,
	mfQuake2,
	mfHalfLife,
	mfHalfLife2,
};

struct MatExlcusions_s
{
	char szDirectory[MAX_PATH];		// Where we store the material exclusion directories
	bool bUserGenerated;			// If the user specified this ( default:  false -- FGD defined )
};

class CGameConfig
{
public:

	CGameConfig();

		static CGameConfig *GetActiveGame(void);
		static void SetActiveGame(CGameConfig *pGame);

	inline TEXTUREFORMAT GetTextureFormat(void);
	inline void SetTextureFormat(TEXTUREFORMAT eFormat);

	inline float GetDefaultTextureScale(void);
	inline void SetDefaultTextureScale(float fScale);

	inline int GetDefaultLightmapScale(void);
	inline void SetDefaultLightmapScale(int nScale);

	inline const char *GetCordonTexture(void);
	inline void SetCordonTexture(const char *szCordonTexture);

		inline void GetSteamExe(CString &str);
		inline void GetSteamDir(CString &str);
		inline void GetSteamUserDir(CString &str);
		inline void GetSteamAppID(CString &str);

		inline MAPFORMAT GetMapFormat();

	CUtlVector< MatExlcusions_s > m_MaterialExclusions;

	DWORD dwID;	// assigned on load

	char szName[128];
	int nGDFiles;
	MAPFORMAT mapformat;

	char szExecutable[128];
	char szDefaultPoint[128];
	char szDefaultSolid[128];
	char szBSP[128];
	char szLIGHT[128];
	char szVIS[128];
	char m_szGameExeDir[128];
	char szMapDir[128];
	char szBSPDir[128];
	char m_szModDir[128];
	int	 m_MaterialExcludeCount;

	CStringArray GDFiles;
	GameData GD;	// gamedata files loaded
	CGamePalette Palette;

	BOOL Import(std::fstream &, float fVersion);

	bool Load(KeyValues *pkv);
	bool Save(KeyValues *pkv);

	void Save(std::fstream &);
	bool Save(const char *pszFileName, const char *pszSection);
	void CopyFrom(CGameConfig *pConfig);
	void LoadGDFiles(void);

	void ParseGameInfo();

	// Accessor methods to get at the mod + the game (*not* full paths)
	const char *GetMod();
	const char *GetGame();

protected:
	TEXTUREFORMAT textureformat;
	float m_fDefaultTextureScale;
	int m_nDefaultLightmapScale;
	char m_szCordonTexture[MAX_PATH];

		// These settings are loaded from GameInfo.txt:
		char m_szSteamDir[MAX_PATH];			// The full path to steam.exe
		char m_szSteamUserDir[MAX_PATH];		// The full path to the users's directory under SteamApps
		char m_szSteamAppID[32];				// The app id to add to the command line when launching the game via Steam.
};

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
MAPFORMAT CGameConfig::GetMapFormat()
{
	return mapformat;
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
TEXTUREFORMAT CGameConfig::GetTextureFormat(void)
{
	return(textureformat);
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CGameConfig::SetTextureFormat(TEXTUREFORMAT eFormat)
{
	textureformat = eFormat;
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
const char *CGameConfig::GetCordonTexture(void)
{
	return(m_szCordonTexture);
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CGameConfig::SetCordonTexture(const char *szCordonTexture)
{
	Q_strncpy( m_szCordonTexture, szCordonTexture, sizeof( m_szCordonTexture ) );
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
int CGameConfig::GetDefaultLightmapScale(void)
{
	return(m_nDefaultLightmapScale);
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CGameConfig::SetDefaultLightmapScale(int nScale)
{
	m_nDefaultLightmapScale = nScale;
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
float CGameConfig::GetDefaultTextureScale(void)
{
	return(m_fDefaultTextureScale);
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CGameConfig::SetDefaultTextureScale(float fScale)
{
	m_fDefaultTextureScale = fScale;
}


//-----------------------------------------------------------------------------
// Purpose: Returns the full path to steam.exe, found by searching up from
//			whatever directory hammer is in.
//-----------------------------------------------------------------------------
void CGameConfig::GetSteamDir(CString &str)
{
	str = m_szSteamDir;
}


//-----------------------------------------------------------------------------
// Purpose: Returns the full path to steam.exe, found by searching up from
//			whatever directory hammer is in.
//-----------------------------------------------------------------------------
void CGameConfig::GetSteamExe(CString &str)
{
	GetSteamDir(str);
	str += "\\steam.exe";
}


//-----------------------------------------------------------------------------
// Purpose: Returns the full path to steam.exe, found by searching up from
//			whatever directory hammer is in.
//-----------------------------------------------------------------------------
void CGameConfig::GetSteamUserDir(CString &str)
{
	str = m_szSteamUserDir;
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CGameConfig::GetSteamAppID(CString &str)
{
	str = m_szSteamAppID;
} 


extern GameData *pGD;
extern CGameConfig *g_pGameConfig;
extern float g_MAX_MAP_COORD;
extern float g_MIN_MAP_COORD;


#endif // GAMECONFIG_H