summaryrefslogtreecommitdiff
path: root/gameui/CreateMultiplayerGameGameplayPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/CreateMultiplayerGameGameplayPage.cpp')
-rw-r--r--gameui/CreateMultiplayerGameGameplayPage.cpp475
1 files changed, 475 insertions, 0 deletions
diff --git a/gameui/CreateMultiplayerGameGameplayPage.cpp b/gameui/CreateMultiplayerGameGameplayPage.cpp
new file mode 100644
index 0000000..4c8e06a
--- /dev/null
+++ b/gameui/CreateMultiplayerGameGameplayPage.cpp
@@ -0,0 +1,475 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+
+#include <stdio.h>
+#include <time.h>
+
+#include "CreateMultiplayerGameGameplayPage.h"
+
+using namespace vgui;
+
+#include <KeyValues.h>
+#include <vgui/ILocalize.h>
+#include <vgui_controls/ComboBox.h>
+#include <vgui_controls/CheckButton.h>
+#include <vgui_controls/Label.h>
+#include <vgui_controls/TextEntry.h>
+
+#include "filesystem.h"
+#include "PanelListPanel.h"
+#include "scriptobject.h"
+#include <tier0/vcrmode.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+#define OPTIONS_DIR "cfg"
+#define DEFAULT_OPTIONS_FILE OPTIONS_DIR "/settings_default.scr"
+#define OPTIONS_FILE OPTIONS_DIR "/settings.scr"
+
+//-----------------------------------------------------------------------------
+// Purpose: class for loading/saving server config file
+//-----------------------------------------------------------------------------
+class CServerDescription : public CDescription
+{
+public:
+ CServerDescription( void );
+
+ void WriteScriptHeader( FileHandle_t fp );
+ void WriteFileHeader( FileHandle_t fp );
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCreateMultiplayerGameGameplayPage::CCreateMultiplayerGameGameplayPage(vgui::Panel *parent, const char *name) : PropertyPage(parent, name)
+{
+ SetSize( 10, 10 ); // Quiet "parent not sized yet" spew
+ m_pOptionsList = new CPanelListPanel(this, "GameOptions");
+
+ m_pDescription = new CServerDescription();
+ m_pDescription->InitFromFile( DEFAULT_OPTIONS_FILE );
+ m_pDescription->InitFromFile( OPTIONS_FILE );
+ m_pList = NULL;
+
+ LoadControlSettings("Resource/CreateMultiplayerGameGameplayPage.res");
+
+ LoadGameOptionsList();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CCreateMultiplayerGameGameplayPage::~CCreateMultiplayerGameGameplayPage()
+{
+ delete m_pDescription;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CCreateMultiplayerGameGameplayPage::GetMaxPlayers()
+{
+ return atoi(GetValue("maxplayers", "32"));
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+const char *CCreateMultiplayerGameGameplayPage::GetPassword()
+{
+ return GetValue("sv_password", "");
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+const char *CCreateMultiplayerGameGameplayPage::GetHostName()
+{
+ return GetValue("hostname", "Half-Life");
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+const char *CCreateMultiplayerGameGameplayPage::GetValue(const char *cvarName, const char *defaultValue)
+{
+ for (mpcontrol_t *mp = m_pList; mp != NULL; mp = mp->next)
+ {
+ Panel *control = mp->pControl;
+ if (control && !stricmp(mp->GetName(), cvarName))
+ {
+ KeyValues *data = new KeyValues("GetText");
+ static char buf[128];
+ if (control && control->RequestInfo(data))
+ {
+ strncpy(buf, data->GetString("text", defaultValue), sizeof(buf) - 1);
+ }
+ else
+ {
+ // no value found, copy in default text
+ strncpy(buf, defaultValue, sizeof(buf) - 1);
+ }
+
+ // ensure null termination of string
+ buf[sizeof(buf) - 1] = 0;
+
+ // free
+ data->deleteThis();
+ return buf;
+ }
+
+ }
+
+ return defaultValue;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: called to get data from the page
+//-----------------------------------------------------------------------------
+void CCreateMultiplayerGameGameplayPage::OnApplyChanges()
+{
+ // Get the values from the controls
+ GatherCurrentValues();
+
+ // Create the game.cfg file
+ if ( m_pDescription )
+ {
+ FileHandle_t fp;
+
+ // Add settings to config.cfg
+ m_pDescription->WriteToConfig();
+
+ // save out in the settings file
+ g_pFullFileSystem->CreateDirHierarchy( OPTIONS_DIR, "GAME" );
+ fp = g_pFullFileSystem->Open( OPTIONS_FILE, "wb", "GAME" );
+ if ( fp )
+ {
+ m_pDescription->WriteToScriptFile( fp );
+ g_pFullFileSystem->Close( fp );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Creates all the controls in the game options list
+//-----------------------------------------------------------------------------
+void CCreateMultiplayerGameGameplayPage::LoadGameOptionsList()
+{
+ // destroy any existing controls
+ mpcontrol_t *p, *n;
+
+ p = m_pList;
+ while ( p )
+ {
+ n = p->next;
+ //
+ delete p->pControl;
+ delete p->pPrompt;
+ delete p;
+ p = n;
+ }
+
+ m_pList = NULL;
+
+
+ // Go through desciption creating controls
+ CScriptObject *pObj;
+
+ pObj = m_pDescription->pObjList;
+
+ mpcontrol_t *pCtrl;
+
+ CheckButton *pBox;
+ TextEntry *pEdit;
+ ComboBox *pCombo;
+ CScriptListItem *pListItem;
+
+ Panel *objParent = m_pOptionsList;
+
+ while ( pObj )
+ {
+ if ( pObj->type == O_OBSOLETE )
+ {
+ pObj = pObj->pNext;
+ continue;
+ }
+
+ pCtrl = new mpcontrol_t( objParent, pObj->cvarname );
+ pCtrl->type = pObj->type;
+
+ switch ( pCtrl->type )
+ {
+ case O_BOOL:
+ pBox = new CheckButton( pCtrl, "DescCheckButton", pObj->prompt );
+ pBox->SetSelected( pObj->fdefValue != 0.0f ? true : false );
+
+ pCtrl->pControl = (Panel *)pBox;
+ break;
+ case O_STRING:
+ case O_NUMBER:
+ pEdit = new TextEntry( pCtrl, "DescEdit");
+ pEdit->InsertString(pObj->defValue);
+ pCtrl->pControl = (Panel *)pEdit;
+ break;
+ case O_LIST:
+ pCombo = new ComboBox( pCtrl, "DescEdit", 5, false );
+
+ pListItem = pObj->pListItems;
+ while ( pListItem )
+ {
+ pCombo->AddItem(pListItem->szItemText, NULL);
+ pListItem = pListItem->pNext;
+ }
+
+ pCombo->ActivateItemByRow((int)pObj->fdefValue);
+
+ pCtrl->pControl = (Panel *)pCombo;
+ break;
+ default:
+ break;
+ }
+
+ if ( pCtrl->type != O_BOOL )
+ {
+ pCtrl->pPrompt = new vgui::Label( pCtrl, "DescLabel", "" );
+ pCtrl->pPrompt->SetContentAlignment( vgui::Label::a_west );
+ pCtrl->pPrompt->SetTextInset( 5, 0 );
+ pCtrl->pPrompt->SetText( pObj->prompt );
+ }
+
+ pCtrl->pScrObj = pObj;
+ pCtrl->SetSize( 100, 28 );
+ //pCtrl->SetBorder( scheme()->GetBorder(1, "DepressedButtonBorder") );
+ m_pOptionsList->AddItem( pCtrl );
+
+ // Link it in
+ if ( !m_pList )
+ {
+ m_pList = pCtrl;
+ pCtrl->next = NULL;
+ }
+ else
+ {
+ mpcontrol_t *p;
+ p = m_pList;
+ while ( p )
+ {
+ if ( !p->next )
+ {
+ p->next = pCtrl;
+ pCtrl->next = NULL;
+ break;
+ }
+ p = p->next;
+ }
+ }
+
+ pObj = pObj->pNext;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: applies all the values in the page
+//-----------------------------------------------------------------------------
+void CCreateMultiplayerGameGameplayPage::GatherCurrentValues()
+{
+ if ( !m_pDescription )
+ return;
+
+ // OK
+ CheckButton *pBox;
+ TextEntry *pEdit;
+ ComboBox *pCombo;
+
+ mpcontrol_t *pList;
+
+ CScriptObject *pObj;
+ CScriptListItem *pItem;
+
+ char szValue[256];
+ char strValue[256];
+ wchar_t w_szStrValue[256];
+
+ pList = m_pList;
+ while ( pList )
+ {
+ pObj = pList->pScrObj;
+
+ if ( !pList->pControl )
+ {
+ pObj->SetCurValue( pObj->defValue );
+ pList = pList->next;
+ continue;
+ }
+
+ switch ( pObj->type )
+ {
+ case O_BOOL:
+ pBox = (CheckButton *)pList->pControl;
+ Q_snprintf( szValue, sizeof( szValue ), "%s", pBox->IsSelected() ? "1" : "0" );
+ break;
+ case O_NUMBER:
+ pEdit = ( TextEntry * )pList->pControl;
+ pEdit->GetText( strValue, sizeof( strValue ) );
+ Q_snprintf( szValue, sizeof( szValue ), "%s", strValue );
+ break;
+ case O_STRING:
+ pEdit = ( TextEntry * )pList->pControl;
+ pEdit->GetText( strValue, sizeof( strValue ) );
+ Q_snprintf( szValue, sizeof( szValue ), "%s", strValue );
+ break;
+ case O_LIST:
+ pCombo = ( ComboBox *)pList->pControl;
+ pCombo->GetText( w_szStrValue, sizeof( w_szStrValue ) / sizeof( wchar_t ) );
+
+ pItem = pObj->pListItems;
+
+ while ( pItem )
+ {
+ wchar_t *wLocalizedString = NULL;
+ wchar_t w_szStrTemp[256];
+
+ // Localized string?
+ if ( pItem->szItemText[0] == '#' )
+ {
+ wLocalizedString = g_pVGuiLocalize->Find( pItem->szItemText );
+ }
+
+ if ( wLocalizedString )
+ {
+ // Copy the string we found into our temp array
+ V_wcscpy_safe( w_szStrTemp, wLocalizedString );
+ }
+ else
+ {
+ // Just convert what we have to Unicode
+ g_pVGuiLocalize->ConvertANSIToUnicode( pItem->szItemText, w_szStrTemp, sizeof( w_szStrTemp ) );
+ }
+
+ if ( _wcsicmp( w_szStrTemp, w_szStrValue ) == 0 )
+ {
+ // Found a match!
+ break;
+ }
+
+ pItem = pItem->pNext;
+ }
+
+ if ( pItem )
+ {
+ Q_snprintf( szValue, sizeof( szValue ), "%s", pItem->szValue );
+ }
+ else //Couldn't find index
+ {
+ Q_snprintf( szValue, sizeof( szValue ), "%s", pObj->defValue );
+ }
+ break;
+ }
+
+ // Remove double quotes and % characters
+ UTIL_StripInvalidCharacters( szValue, sizeof( szValue ) );
+
+ Q_strncpy( strValue, szValue, sizeof( strValue ) );
+
+ pObj->SetCurValue( strValue );
+
+ pList = pList->next;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor, load/save server settings object
+//-----------------------------------------------------------------------------
+CServerDescription::CServerDescription( void ) : CDescription()
+{
+ setHint( "// NOTE: THIS FILE IS AUTOMATICALLY REGENERATED, \r\n"
+"//DO NOT EDIT THIS HEADER, YOUR COMMENTS WILL BE LOST IF YOU DO\r\n"
+"// Multiplayer options script\r\n"
+"//\r\n"
+"// Format:\r\n"
+"// Version [float]\r\n"
+"// Options description followed by \r\n"
+"// Options defaults\r\n"
+"//\r\n"
+"// Option description syntax:\r\n"
+"//\r\n"
+"// \"cvar\" { \"Prompt\" { type [ type info ] } { default } }\r\n"
+"//\r\n"
+"// type = \r\n"
+"// BOOL (a yes/no toggle)\r\n"
+"// STRING\r\n"
+"// NUMBER\r\n"
+"// LIST\r\n"
+"//\r\n"
+"// type info:\r\n"
+"// BOOL no type info\r\n"
+"// NUMBER min max range, use -1 -1 for no limits\r\n"
+"// STRING no type info\r\n"
+"// LIST "" delimited list of options value pairs\r\n"
+"//\r\n"
+"//\r\n"
+"// default depends on type\r\n"
+"// BOOL is \"0\" or \"1\"\r\n"
+"// NUMBER is \"value\"\r\n"
+"// STRING is \"value\"\r\n"
+"// LIST is \"index\", where index \"0\" is the first element of the list\r\n\r\n\r\n" );
+
+ setDescription ( "SERVER_OPTIONS" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CServerDescription::WriteScriptHeader( FileHandle_t fp )
+{
+ char am_pm[] = "AM";
+ tm newtime;
+ VCRHook_LocalTime( &newtime );
+
+ if( newtime.tm_hour > 12 ) /* Set up extension. */
+ Q_strncpy( am_pm, "PM", sizeof( am_pm ) );
+ if( newtime.tm_hour > 12 ) /* Convert from 24-hour */
+ newtime.tm_hour -= 12; /* to 12-hour clock. */
+ if( newtime.tm_hour == 0 ) /*Set hour to 12 if midnight. */
+ newtime.tm_hour = 12;
+
+ g_pFullFileSystem->FPrintf( fp, (char *)getHint() );
+
+// Write out the comment and Cvar Info:
+ g_pFullFileSystem->FPrintf( fp, "// Half-Life Server Configuration Layout Script (stores last settings chosen, too)\r\n" );
+ g_pFullFileSystem->FPrintf( fp, "// File generated: %.19s %s\r\n", asctime( &newtime ), am_pm );
+ g_pFullFileSystem->FPrintf( fp, "//\r\n//\r\n// Cvar\t-\tSetting\r\n\r\n" );
+
+ g_pFullFileSystem->FPrintf( fp, "VERSION %.1f\r\n\r\n", SCRIPT_VERSION );
+
+ g_pFullFileSystem->FPrintf( fp, "DESCRIPTION SERVER_OPTIONS\r\n{\r\n" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CServerDescription::WriteFileHeader( FileHandle_t fp )
+{
+ char am_pm[] = "AM";
+ tm newtime;
+ VCRHook_LocalTime( &newtime );
+
+ if( newtime.tm_hour > 12 ) /* Set up extension. */
+ Q_strncpy( am_pm, "PM", sizeof( am_pm ) );
+ if( newtime.tm_hour > 12 ) /* Convert from 24-hour */
+ newtime.tm_hour -= 12; /* to 12-hour clock. */
+ if( newtime.tm_hour == 0 ) /*Set hour to 12 if midnight. */
+ newtime.tm_hour = 12;
+
+ g_pFullFileSystem->FPrintf( fp, "// Half-Life Server Configuration Settings\r\n" );
+ g_pFullFileSystem->FPrintf( fp, "// DO NOT EDIT, GENERATED BY HALF-LIFE\r\n" );
+ g_pFullFileSystem->FPrintf( fp, "// File generated: %.19s %s\r\n", asctime( &newtime ), am_pm );
+ g_pFullFileSystem->FPrintf( fp, "//\r\n//\r\n// Cvar\t-\tSetting\r\n\r\n" );
+}