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.
839 lines
22 KiB
839 lines
22 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "stdafx.h" |
|
#include <shlobj.h> |
|
#include "GameConfig.h" |
|
#include "EditGameConfigs.h" |
|
#include "hammer.h" |
|
#include "OPTConfigs.h" |
|
#include "ConfigManager.h" |
|
#include "process.h" |
|
#include "Options.h" |
|
#include "TextureBrowser.h" |
|
|
|
#include "tier2/vconfig.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
|
|
IMPLEMENT_DYNCREATE(COPTConfigs, CPropertyPage) |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns the string value of a registry key |
|
// Input : *pName - name of the subKey to read |
|
// *pReturn - string buffer to receive read string |
|
// size - size of specified buffer |
|
//----------------------------------------------------------------------------- |
|
bool GetPersistentEnvironmentVariable( const char *pName, char *pReturn, int size ) |
|
{ |
|
// Open the key |
|
HKEY hregkey; |
|
// Changed to HKEY_CURRENT_USER from HKEY_LOCAL_MACHINE |
|
if ( RegOpenKeyEx( HKEY_CURRENT_USER, VPROJECT_REG_KEY, 0, KEY_QUERY_VALUE, &hregkey ) != ERROR_SUCCESS ) |
|
return false; |
|
|
|
// Get the value |
|
DWORD dwSize = size; |
|
if ( RegQueryValueEx( hregkey, pName, NULL, NULL,(LPBYTE) pReturn, &dwSize ) != ERROR_SUCCESS ) |
|
return false; |
|
|
|
// Close the key |
|
RegCloseKey( hregkey ); |
|
|
|
return true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Set the registry entry to a string value, under the given subKey |
|
// Input : *pName - name of the subKey to set |
|
// *pValue - string value |
|
//----------------------------------------------------------------------------- |
|
void SetPersistentEnvironmentVariable( const char *pName, const char *pValue ) |
|
{ |
|
HKEY hregkey; |
|
DWORD dwReturnValue = 0; |
|
|
|
// Changed from HKEY_LOCAL_MACHINE to HKEY_CURRENT_USER |
|
if ( RegOpenKeyEx( HKEY_CURRENT_USER, VPROJECT_REG_KEY, 0, KEY_ALL_ACCESS, &hregkey ) != ERROR_SUCCESS ) |
|
return; |
|
|
|
// Set the value to the string passed in |
|
RegSetValueEx( hregkey, pName, 0, REG_SZ, (const unsigned char *)pValue, (int) strlen(pValue) ); |
|
|
|
// Propagate changes so that environment variables takes immediate effect! |
|
SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue ); |
|
|
|
// Close the key |
|
RegCloseKey( hregkey ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Converts a Steam path prefix to %STEAM% and back. |
|
//----------------------------------------------------------------------------- |
|
void EditorUtil_ConvertPath(CString &str, bool bExpand) |
|
{ |
|
CString strSteamDir; |
|
g_pGameConfig->GetSteamDir(strSteamDir); |
|
|
|
CString strSteamUserDir; |
|
g_pGameConfig->GetSteamUserDir(strSteamUserDir); |
|
|
|
if (!strSteamDir.GetLength() && !strSteamUserDir.GetLength()) |
|
{ |
|
// Can't do the token replacement. |
|
return; |
|
} |
|
|
|
const char *szSteamDirToken = "$SteamDir"; |
|
const char *szSteamUserDirToken = "$SteamUserDir"; |
|
|
|
char szPathOut[MAX_PATH]; |
|
|
|
if (bExpand) |
|
{ |
|
// Replace the tokens with the full strings |
|
if (Q_StrSubst(str, szSteamUserDirToken, strSteamUserDir, szPathOut, sizeof(szPathOut))) |
|
{ |
|
str = szPathOut; |
|
} |
|
|
|
if (Q_StrSubst(str, szSteamDirToken, strSteamDir, szPathOut, sizeof(szPathOut))) |
|
{ |
|
str = szPathOut; |
|
} |
|
} |
|
else |
|
{ |
|
// Replace the full strings with the tokens |
|
// Go from longest paths to shortest paths to insure the most brief expression. |
|
if (Q_StrSubst(str, strSteamUserDir, szSteamUserDirToken, szPathOut, sizeof(szPathOut))) |
|
{ |
|
str = szPathOut; |
|
} |
|
|
|
if (Q_StrSubst(str, strSteamDir, szSteamDirToken, szPathOut, sizeof(szPathOut))) |
|
{ |
|
str = szPathOut; |
|
} |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Exchanges path data between a CString and an edit control, converting |
|
// the Steam path to %STEAM% and back. |
|
//----------------------------------------------------------------------------- |
|
void EditorUtil_TransferPath(CDialog *pDlg, int nIDC, char *szDest, bool bExpand) |
|
{ |
|
CWnd *pwnd = pDlg->GetDlgItem(nIDC); |
|
if (!pwnd) |
|
return; |
|
|
|
CString str; |
|
|
|
if (bExpand) |
|
{ |
|
pwnd->GetWindowText(str); |
|
EditorUtil_ConvertPath(str, true); |
|
strcpy(szDest, str); |
|
} |
|
else |
|
{ |
|
str = szDest; |
|
EditorUtil_ConvertPath(str, false); |
|
pwnd->SetWindowText(str); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor. |
|
//----------------------------------------------------------------------------- |
|
COPTConfigs::COPTConfigs(void) : CPropertyPage(COPTConfigs::IDD) |
|
{ |
|
//{{AFX_DATA_INIT(COPTConfigs) |
|
//}}AFX_DATA_INIT |
|
|
|
m_pLastSelConfig = NULL; |
|
m_pInitialSelectedConfig = NULL; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor. |
|
//----------------------------------------------------------------------------- |
|
COPTConfigs::~COPTConfigs(void) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : pDX - |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::DoDataExchange(CDataExchange* pDX) |
|
{ |
|
CPropertyPage::DoDataExchange(pDX); |
|
//{{AFX_DATA_MAP(COPTConfigs) |
|
DDX_Control(pDX, IDC_MAPDIR, m_cMapDir); |
|
DDX_Control(pDX, IDC_GAMEEXEDIR, m_cGameExeDir); |
|
DDX_Control(pDX, IDC_MODDIR, m_cModDir); |
|
DDX_Control(pDX, IDC_MAPFORMAT, m_cMapFormat); |
|
DDX_Control(pDX, IDC_CORDON_TEXTURE, m_cCordonTexture); |
|
DDX_Control(pDX, IDC_TEXTUREFORMAT, m_cTextureFormat); |
|
DDX_Control(pDX, IDC_DEFAULTPOINT, m_cDefaultPoint); |
|
DDX_Control(pDX, IDC_DEFAULTENTITY, m_cDefaultSolid); |
|
DDX_Control(pDX, IDC_DATAFILES, m_cGDFiles); |
|
DDX_Control(pDX, IDC_CONFIGURATIONS, m_cConfigs); |
|
DDX_Control(pDX, IDC_DEFAULT_TEXTURE_SCALE, m_cDefaultTextureScale); |
|
//}}AFX_DATA_MAP |
|
} |
|
|
|
|
|
BEGIN_MESSAGE_MAP(COPTConfigs, CPropertyPage) |
|
//{{AFX_MSG_MAP(COPTConfigs) |
|
ON_BN_CLICKED(IDC_EDITCONFIGS, OnEditconfigs) |
|
ON_BN_CLICKED(IDC_GDFILE_ADD, OnGdfileAdd) |
|
ON_BN_CLICKED(IDC_GDFILE_EDIT, OnGdfileEdit) |
|
ON_BN_CLICKED(IDC_GDFILE_REMOVE, OnGdfileRemove) |
|
ON_CBN_SELCHANGE(IDC_CONFIGURATIONS, OnSelchangeConfigurations) |
|
ON_BN_CLICKED(IDC_BROWSEMAPDIR, OnBrowsemapdir) |
|
ON_BN_CLICKED(IDC_BROWSEGAMEEXEDIR, OnBrowseGameExeDir) |
|
ON_BN_CLICKED(IDC_BROWSEMODDIR, OnBrowseModDir) |
|
ON_BN_CLICKED(IDC_BROWSE_CORDON_TEXTURE, OnBrowseCordonTexture) |
|
ON_MESSAGE( WM_SETTINGCHANGE, OnSettingChange ) |
|
//}}AFX_MSG_MAP |
|
END_MESSAGE_MAP() |
|
|
|
|
|
void COPTConfigs::OnEditconfigs(void) |
|
{ |
|
SaveInfo(m_pLastSelConfig); |
|
|
|
CEditGameConfigs dlg; |
|
dlg.DoModal(); |
|
UpdateConfigList(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnGdfileAdd(void) |
|
{ |
|
if (m_pLastSelConfig == NULL) |
|
return; |
|
|
|
char szAppDir[MAX_PATH]; |
|
APP()->GetDirectory(DIR_PROGRAM, szAppDir); |
|
|
|
// browse for .FGD files |
|
CFileDialog dlg(TRUE, ".fgd", NULL, OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_FILEMUSTEXIST, "Game Data Files (*.fgd)|*.fgd||"); |
|
dlg.m_ofn.lpstrInitialDir = szAppDir; |
|
if (dlg.DoModal() != IDOK) |
|
return; |
|
|
|
CString str = dlg.GetPathName(); |
|
EditorUtil_ConvertPath(str, false); |
|
m_cGDFiles.AddString(str); |
|
|
|
SaveInfo(m_pLastSelConfig); |
|
m_pLastSelConfig->LoadGDFiles(); |
|
UpdateEntityLists(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnGdfileEdit(void) |
|
{ |
|
if(m_pLastSelConfig == NULL) |
|
return; |
|
|
|
// edit the selected FGD file |
|
int iCurSel = m_cGDFiles.GetCurSel(); |
|
if(iCurSel == LB_ERR) |
|
return; |
|
|
|
CString str; |
|
m_cGDFiles.GetText(iCurSel, str); |
|
EditorUtil_ConvertPath(str, true); |
|
|
|
// call editor (notepad!) |
|
char szBuf[MAX_PATH]; |
|
GetWindowsDirectory(szBuf, MAX_PATH); |
|
strcat(szBuf, "\\notepad.exe"); |
|
_spawnl(_P_WAIT, szBuf, szBuf, str, NULL); |
|
|
|
m_pLastSelConfig->LoadGDFiles(); |
|
UpdateEntityLists(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnGdfileRemove(void) |
|
{ |
|
if(m_pLastSelConfig == NULL) |
|
return; |
|
|
|
int iCurSel = m_cGDFiles.GetCurSel(); |
|
if(iCurSel == LB_ERR) |
|
return; |
|
|
|
m_cGDFiles.DeleteString(iCurSel); |
|
|
|
SaveInfo(m_pLastSelConfig); |
|
m_pLastSelConfig->LoadGDFiles(); |
|
UpdateEntityLists(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pConfig - |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::SaveInfo(CGameConfig *pConfig) |
|
{ |
|
if (pConfig == NULL) |
|
{ |
|
return; |
|
} |
|
|
|
// game data files |
|
pConfig->nGDFiles = 0; |
|
pConfig->GDFiles.RemoveAll(); |
|
int iSize = m_cGDFiles.GetCount(); |
|
for(int i = 0; i < iSize; i++) |
|
{ |
|
CString str; |
|
m_cGDFiles.GetText(i, str); |
|
|
|
EditorUtil_ConvertPath(str, true); |
|
|
|
pConfig->GDFiles.Add(str); |
|
++pConfig->nGDFiles; |
|
} |
|
|
|
// |
|
// Map file type. |
|
// |
|
int nIndex = m_cMapFormat.GetCurSel(); |
|
if (nIndex != CB_ERR) |
|
{ |
|
pConfig->mapformat = (MAPFORMAT)m_cMapFormat.GetItemData(nIndex); |
|
} |
|
else |
|
{ |
|
pConfig->mapformat = mfHalfLife2; |
|
} |
|
|
|
// |
|
// WAD file type. |
|
// |
|
nIndex = m_cTextureFormat.GetCurSel(); |
|
if (nIndex != CB_ERR) |
|
{ |
|
pConfig->SetTextureFormat((TEXTUREFORMAT)m_cTextureFormat.GetItemData(nIndex)); |
|
} |
|
else |
|
{ |
|
pConfig->SetTextureFormat(tfVMT); |
|
} |
|
|
|
m_cDefaultSolid.GetWindowText(pConfig->szDefaultSolid, sizeof pConfig->szDefaultSolid); |
|
m_cDefaultPoint.GetWindowText(pConfig->szDefaultPoint, sizeof pConfig->szDefaultPoint); |
|
|
|
EditorUtil_TransferPath(this, IDC_GAMEEXEDIR, pConfig->m_szGameExeDir, true); |
|
EditorUtil_TransferPath(this, IDC_MODDIR, pConfig->m_szModDir, true); |
|
EditorUtil_TransferPath(this, IDC_MAPDIR, pConfig->szMapDir, true); |
|
|
|
char szCordonTexture[MAX_PATH]; |
|
m_cCordonTexture.GetWindowText(szCordonTexture, sizeof(szCordonTexture)); |
|
pConfig->SetCordonTexture(szCordonTexture); |
|
|
|
// |
|
// Default texture scale. |
|
// |
|
char szText[100]; |
|
m_cDefaultTextureScale.GetWindowText(szText, sizeof(szText)); |
|
float fScale = (float)atof(szText); |
|
if (fScale == 0) |
|
{ |
|
fScale = 1; |
|
} |
|
pConfig->SetDefaultTextureScale(fScale); |
|
|
|
// |
|
// Default lightmap scale. |
|
// |
|
int nLightmapScale = GetDlgItemInt(IDC_DEFAULT_LIGHTMAP_SCALE, NULL, FALSE); |
|
pConfig->SetDefaultLightmapScale(nLightmapScale); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnSelchangeConfigurations(void) |
|
{ |
|
// save info from controls into last selected config |
|
SaveInfo(m_pLastSelConfig); |
|
|
|
m_pLastSelConfig = NULL; |
|
|
|
// load info from newly selected config into controls |
|
int iCurSel = m_cConfigs.GetCurSel(); |
|
CGameConfig *pConfig = Options.configs.FindConfig(m_cConfigs.GetItemData(iCurSel)); |
|
|
|
BOOL bKillFields = FALSE; |
|
if (pConfig == NULL) |
|
{ |
|
bKillFields = TRUE; |
|
} |
|
|
|
m_cGDFiles.EnableWindow(!bKillFields); |
|
m_cDefaultPoint.EnableWindow(!bKillFields); |
|
m_cDefaultSolid.EnableWindow(!bKillFields); |
|
m_cTextureFormat.EnableWindow(!bKillFields); |
|
m_cMapFormat.EnableWindow(!bKillFields); |
|
m_cGameExeDir.EnableWindow(!bKillFields); |
|
m_cModDir.EnableWindow(!bKillFields); |
|
m_cMapDir.EnableWindow(!bKillFields); |
|
m_cCordonTexture.EnableWindow(!bKillFields); |
|
|
|
if (pConfig == NULL) |
|
{ |
|
return; |
|
} |
|
|
|
m_pLastSelConfig = pConfig; |
|
|
|
// load game data files |
|
m_cGDFiles.ResetContent(); |
|
for (int i = 0; i < pConfig->nGDFiles; i++) |
|
{ |
|
CString str(pConfig->GDFiles[i]); |
|
EditorUtil_ConvertPath(str, false); |
|
m_cGDFiles.AddString(str); |
|
} |
|
|
|
// |
|
// Select the correct map format. |
|
// |
|
m_cMapFormat.SetCurSel(0); |
|
int nItems = m_cMapFormat.GetCount(); |
|
for (int i = 0; i < nItems; i++) |
|
{ |
|
if (pConfig->mapformat == (MAPFORMAT)m_cMapFormat.GetItemData(i)) |
|
{ |
|
m_cMapFormat.SetCurSel(i); |
|
break; |
|
} |
|
} |
|
|
|
// |
|
// Select the correct texture format. |
|
// |
|
m_cTextureFormat.SetCurSel(0); |
|
nItems = m_cTextureFormat.GetCount(); |
|
for (int i = 0; i < nItems; i++) |
|
{ |
|
if (pConfig->GetTextureFormat() == (TEXTUREFORMAT)m_cTextureFormat.GetItemData(i)) |
|
{ |
|
m_cTextureFormat.SetCurSel(i); |
|
break; |
|
} |
|
} |
|
|
|
EditorUtil_TransferPath(this, IDC_GAMEEXEDIR, pConfig->m_szGameExeDir, false); |
|
EditorUtil_TransferPath(this, IDC_MODDIR, pConfig->m_szModDir, false); |
|
EditorUtil_TransferPath(this, IDC_MAPDIR, pConfig->szMapDir, false); |
|
|
|
m_cCordonTexture.SetWindowText(pConfig->GetCordonTexture()); |
|
|
|
char szText[100]; |
|
sprintf(szText, "%g", pConfig->GetDefaultTextureScale()); |
|
m_cDefaultTextureScale.SetWindowText(szText); |
|
|
|
SetDlgItemInt(IDC_DEFAULT_LIGHTMAP_SCALE, pConfig->GetDefaultLightmapScale(), FALSE); |
|
|
|
// load entity type comboboxes and set strings |
|
UpdateEntityLists(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::UpdateEntityLists(void) |
|
{ |
|
if(m_pLastSelConfig == NULL) |
|
return; |
|
|
|
m_cDefaultPoint.ResetContent(); |
|
m_cDefaultSolid.ResetContent(); |
|
|
|
CGameConfig *pConfig = m_pLastSelConfig; |
|
|
|
int nCount = pConfig->GD.GetClassCount(); |
|
for (int i = 0; i < nCount; i++) |
|
{ |
|
GDclass *pClass = pConfig->GD.GetClass(i); |
|
if (pClass->IsBaseClass()) |
|
{ |
|
continue; |
|
} |
|
else if (pClass->IsSolidClass()) |
|
{ |
|
m_cDefaultSolid.AddString(pClass->GetName()); |
|
} |
|
else |
|
{ |
|
m_cDefaultPoint.AddString(pClass->GetName()); |
|
} |
|
} |
|
|
|
if (pConfig->szDefaultSolid[0] != '\0') |
|
{ |
|
m_cDefaultSolid.SetWindowText(pConfig->szDefaultSolid); |
|
} |
|
else |
|
{ |
|
m_cDefaultSolid.SetCurSel(0); |
|
} |
|
|
|
|
|
if (pConfig->szDefaultPoint[0] != '\0') |
|
{ |
|
m_cDefaultPoint.SetWindowText(pConfig->szDefaultPoint); |
|
} |
|
else |
|
{ |
|
m_cDefaultPoint.SetCurSel(0); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Fills the combo box with the list of configs. Tries to select the |
|
// config that was selected before coming in or, failing that, the |
|
// currently active config. |
|
//----------------------------------------------------------------------------- |
|
void UpdateConfigList(CComboBox &combo) |
|
{ |
|
int iCurSel = combo.GetCurSel(); |
|
DWORD dwSelID = 0xffffffff; |
|
if (iCurSel != CB_ERR) |
|
{ |
|
dwSelID = combo.GetItemData(iCurSel); |
|
} |
|
|
|
combo.ResetContent(); |
|
|
|
// add configs to the combo box |
|
for (int i = 0; i < Options.configs.nConfigs; i++) |
|
{ |
|
CGameConfig *pConfig = Options.configs.Configs[i]; |
|
|
|
int iIndex = combo.AddString(pConfig->szName); |
|
combo.SetItemData(iIndex, pConfig->dwID); |
|
} |
|
|
|
if (dwSelID == 0xffffffff) |
|
{ |
|
dwSelID = g_pGameConfig->dwID; |
|
} |
|
|
|
// Find the item with the given ID. |
|
int nSelIndex = -1; |
|
for (int i = 0; i < Options.configs.nConfigs; i++) |
|
{ |
|
DWORD dwData = combo.GetItemData(i); |
|
if (dwData == dwSelID) |
|
{ |
|
nSelIndex = i; |
|
} |
|
} |
|
|
|
combo.SetCurSel(nSelIndex == -1 ? 0 : nSelIndex); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void SelectActiveConfig(CComboBox &combo) |
|
{ |
|
char szGameDir[MAX_PATH]; |
|
if (GetPersistentEnvironmentVariable(GAMEDIR_TOKEN, szGameDir, sizeof(szGameDir))) |
|
{ |
|
CGameConfig *pConfig = Options.configs.FindConfigForGame(szGameDir); |
|
if (pConfig) |
|
{ |
|
// Find the item with the given ID. |
|
int nSelIndex = -1; |
|
int nCount = combo.GetCount(); |
|
for (int i = 0; i < nCount; i++) |
|
{ |
|
DWORD dwData = combo.GetItemData(i); |
|
if (pConfig->dwID == dwData) |
|
{ |
|
nSelIndex = i; |
|
break; |
|
} |
|
} |
|
|
|
if (nSelIndex != -1) |
|
{ |
|
combo.SetCurSel(nSelIndex); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::UpdateConfigList() |
|
{ |
|
m_pLastSelConfig = NULL; |
|
|
|
::UpdateConfigList(m_cConfigs); |
|
::SelectActiveConfig(m_cConfigs); |
|
|
|
OnSelchangeConfigurations(); |
|
SetModified(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Populates the combo boxes with the map formats and WAD formats, and |
|
// the list of game configurations. |
|
//----------------------------------------------------------------------------- |
|
BOOL COPTConfigs::OnInitDialog(void) |
|
{ |
|
CPropertyPage::OnInitDialog(); |
|
|
|
int nIndex; |
|
|
|
// |
|
// Add map formats. |
|
// |
|
nIndex = m_cMapFormat.AddString("Half-Life 2"); |
|
m_cMapFormat.SetItemData(nIndex, mfHalfLife2); |
|
|
|
nIndex = m_cMapFormat.AddString("Half-Life / TFC"); |
|
m_cMapFormat.SetItemData(nIndex, mfHalfLife); |
|
|
|
// |
|
// Add texture formats. |
|
// |
|
nIndex = m_cTextureFormat.AddString("Materials (Half-Life 2)"); |
|
m_cTextureFormat.SetItemData(nIndex, tfVMT); |
|
|
|
nIndex = m_cTextureFormat.AddString("WAD3 (Half-Life / TFC)"); |
|
m_cTextureFormat.SetItemData(nIndex, tfWAD3); |
|
|
|
UpdateConfigList(); |
|
|
|
int nCurSel = m_cConfigs.GetCurSel(); |
|
m_pInitialSelectedConfig = Options.configs.FindConfig(m_cConfigs.GetItemData(nCurSel)); |
|
|
|
m_strInitialGameDir.Empty(); |
|
if (m_pInitialSelectedConfig) |
|
{ |
|
m_strInitialGameDir = m_pInitialSelectedConfig->m_szModDir; |
|
} |
|
|
|
return TRUE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns true if the given config is different from the one set when |
|
// OnInitDialog was called. |
|
//----------------------------------------------------------------------------- |
|
bool COPTConfigs::ConfigChanged(CGameConfig *pConfig) |
|
{ |
|
if (m_pInitialSelectedConfig != pConfig) |
|
return true; |
|
|
|
if (pConfig && m_pInitialSelectedConfig) |
|
{ |
|
if (m_pInitialSelectedConfig->dwID != pConfig->dwID) |
|
return true; |
|
|
|
if (m_strInitialGameDir.CompareNoCase(pConfig->m_szModDir)) |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : Returns TRUE on success, FALSE on failure. |
|
//----------------------------------------------------------------------------- |
|
BOOL COPTConfigs::OnApply(void) |
|
{ |
|
SaveInfo(m_pLastSelConfig); |
|
|
|
int nCurSel = m_cConfigs.GetCurSel(); |
|
CGameConfig *pConfig = Options.configs.FindConfig(m_cConfigs.GetItemData(nCurSel)); |
|
|
|
if ( pConfig != NULL && ConfigChanged( pConfig ) ) |
|
{ |
|
SetPersistentEnvironmentVariable("vproject", pConfig->m_szModDir); |
|
AfxMessageBox("Your changes to the active configuration will not take effect until the next time you run Hammer."); |
|
} |
|
|
|
Options.PerformChanges(COptions::secConfigs); |
|
|
|
return CPropertyPage::OnApply(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pszTitle - |
|
// *pszDirectory - |
|
// Output : Returns TRUE on success, FALSE on failure. |
|
//----------------------------------------------------------------------------- |
|
BOOL COPTConfigs::BrowseForFolder(char *pszTitle, char *pszDirectory) |
|
{ |
|
char szTmp[MAX_PATH]; |
|
|
|
BROWSEINFO bi; |
|
memset(&bi, 0, sizeof bi); |
|
bi.hwndOwner = m_hWnd; |
|
bi.pszDisplayName = szTmp; |
|
bi.lpszTitle = pszTitle; |
|
bi.ulFlags = BIF_RETURNONLYFSDIRS; |
|
|
|
LPITEMIDLIST idl = SHBrowseForFolder(&bi); |
|
|
|
if(idl == NULL) |
|
return FALSE; |
|
|
|
SHGetPathFromIDList(idl, pszDirectory); |
|
CoTaskMemFree(idl); |
|
|
|
return TRUE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnBrowseCordonTexture(void) |
|
{ |
|
CTextureBrowser *pBrowser = new CTextureBrowser(this); |
|
if (pBrowser != NULL) |
|
{ |
|
// |
|
// Use the currently selected texture format for browsing. |
|
// |
|
TEXTUREFORMAT eTextureFormat = tfVMT; |
|
int nIndex = m_cTextureFormat.GetCurSel(); |
|
if (nIndex != LB_ERR) |
|
{ |
|
eTextureFormat = (TEXTUREFORMAT)m_cTextureFormat.GetItemData(nIndex); |
|
} |
|
pBrowser->SetTextureFormat(eTextureFormat); |
|
|
|
// |
|
// Select the current cordon texture in the texture browser. |
|
// |
|
CString strTex; |
|
m_cCordonTexture.GetWindowText(strTex); |
|
pBrowser->SetInitialTexture(strTex); |
|
|
|
if (pBrowser->DoModal() == IDOK) |
|
{ |
|
m_cCordonTexture.SetWindowText(pBrowser->m_cTextureWindow.szCurTexture); |
|
} |
|
|
|
delete pBrowser; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnBrowseGameExeDir(void) |
|
{ |
|
char szTmp[MAX_PATH]; |
|
if (!BrowseForFolder("Select Game Executable Directory", szTmp)) |
|
{ |
|
return; |
|
} |
|
|
|
CString str(szTmp); |
|
EditorUtil_ConvertPath(str, false); |
|
m_cGameExeDir.SetWindowText(str); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnBrowseModDir(void) |
|
{ |
|
char szTmp[MAX_PATH]; |
|
if (!BrowseForFolder("Select Mod Directory", szTmp)) |
|
{ |
|
return; |
|
} |
|
|
|
CString str(szTmp); |
|
EditorUtil_ConvertPath(str, false); |
|
m_cModDir.SetWindowText(str); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void COPTConfigs::OnBrowsemapdir(void) |
|
{ |
|
char szTmp[MAX_PATH]; |
|
if (!BrowseForFolder("Select Map Directory", szTmp)) |
|
{ |
|
return; |
|
} |
|
|
|
CString str(szTmp); |
|
EditorUtil_ConvertPath(str, false); |
|
m_cMapDir.SetWindowText(str); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Handles the notification from the VCONFIG that the active config has changed. |
|
//----------------------------------------------------------------------------- |
|
LRESULT COPTConfigs::OnSettingChange(WPARAM wParam, LPARAM lParam) |
|
{ |
|
const char *changedSection = (const char *)lParam; |
|
if ( Q_stricmp( changedSection, "Environment" ) == 0 ) |
|
{ |
|
UpdateConfigList(); |
|
//SelectActiveConfig(); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
|