diff options
Diffstat (limited to 'sdklauncher/CreateModWizard.cpp')
| -rw-r--r-- | sdklauncher/CreateModWizard.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/sdklauncher/CreateModWizard.cpp b/sdklauncher/CreateModWizard.cpp new file mode 100644 index 0000000..68d4ef6 --- /dev/null +++ b/sdklauncher/CreateModWizard.cpp @@ -0,0 +1,210 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include <windows.h> +#include "CreateModWizard.h" +#include "sdklauncher_main.h" +#include "filesystem_tools.h" +#include "sdklauncherdialog.h" +#include "configs.h" +#include <vgui_controls/WizardSubPanel.h> +#include <vgui_controls/DirectorySelectDialog.h> +#include <vgui/ivgui.h> +#include <vgui/iinput.h> +#include <ctype.h> +#include <io.h> +#include <direct.h> +#include "ModWizard_Intro.h" +#include "ModWizard_GetModInfo.h" +#include "ModWizard_CopyFiles.h" +#include "ModWizard_Finished.h" +#include "ModWizard_TemplateOptions.h" + +extern char g_engineDir[50]; +using namespace vgui; + + +// Set to true when the mod wizard completes successfully. +bool g_bModWizardFinished = false; + + +bool CreateFullDirectory( const char *pDirName ) +{ + CUtlVector<char*> dirs; + const char *separators[2] = {"\\", "/"}; + Q_SplitString2( pDirName, separators, ARRAYSIZE( separators ), dirs ); + + if ( dirs.Count() == 0 ) + return false; + + char dirName[512]; + Q_strncpy( dirName, dirs[0], sizeof( dirName ) ); + for ( int i=1; i < dirs.Count(); i++ ) + { + Q_AppendSlash( dirName, sizeof( dirName ) ); + Q_strncat( dirName, dirs[i], sizeof( dirName ), COPY_ALL_CHARACTERS ); + if ( _access( dirName, 0 ) != 0 ) + if ( _mkdir( dirName ) != 0 ) + return false; + } + dirs.PurgeAndDeleteElements(); + return true; +} + + +bool CreateSubdirectory( const char *pDirName, const char *pSubdirName ) +{ + char str[512]; + Q_strncpy( str, pDirName, sizeof( str ) ); + Q_AppendSlash( str, sizeof( str ) ); + Q_strncat( str, pSubdirName, sizeof( str ), COPY_ALL_CHARACTERS ); + return CreateFullDirectory( str ); +} + + +void RunCreateModWizard( bool bRunFromCommandLine ) +{ + CCreateModWizard *pWizard = new CCreateModWizard( g_pMainFrame, "CreateModWizard", NULL, bRunFromCommandLine ); + pWizard->Run(); +} + + +bool DoCopyFile( const char *pInputFilename, const char *pOutputFilename ) +{ + return CopyWithReplacements( pInputFilename, NULL, 0, "%s", pOutputFilename ); +} + + +void SetModWizardStatusCode( unsigned long inputCode ) +{ + DWORD code = inputCode; + HKEY hKey; + // Changed to HKEY_CURRENT_USER from HKEY_LOCAL_MACHINE + if ( RegCreateKeyEx( HKEY_CURRENT_USER, "Software\\Valve\\SourceSDK", 0, 0, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL ) == ERROR_SUCCESS ) + { + RegSetValueEx( hKey, "ModWizard_StatusCode", 0, REG_DWORD, (unsigned char*)&code, sizeof( code ) ); + RegCloseKey( hKey ); + } +} + + +void NoteModWizardFinished() +{ + g_bModWizardFinished = true; +} + + +// --------------------------------------------------------------------------------------------------------------------- // +// CFinalStatusWindow +// --------------------------------------------------------------------------------------------------------------------- // +class CFinalStatusWindow : public vgui::Frame +{ +public: + typedef vgui::Frame BaseClass; + + CFinalStatusWindow( vgui::Panel *parent, const char *pName, const char *pOutputDirName, const char *pOutputModGamedirName ) + : BaseClass( parent, pName ) + { + m_pLabel = new vgui::Label( this, "MessageLabel", "" ); + + LoadControlSettings( "FinalStatusWindow.res" ); + + char msg[512]; + Q_snprintf( msg, sizeof( msg ), "Files copied successfully!\n\n" + "- The source code is in '%ssrc'.\n" + "- You can run the base mod by running '%srunmod.bat'.\n" + "- You can run the HL2 mod by running '%srunhl2.bat'.\n" + "- There is also a new item in your game list." + , pOutputDirName, pOutputDirName, pOutputDirName ); + m_pLabel->SetText( msg ); + } + +private: + vgui::Label *m_pLabel; +}; + + +// --------------------------------------------------------------------------------------------------------------------- // +// CreateModWizard implementation. +// --------------------------------------------------------------------------------------------------------------------- // + +CCreateModWizard::CCreateModWizard( vgui::Panel *parent, const char *name, KeyValues *pKeyValues, bool bRunFromCommandLine ) + : BaseClass( parent, name ) +{ + m_bRunFromCommandLine = bRunFromCommandLine; + m_pKeyValues = pKeyValues; + SetBounds(0, 0, 480, 360); + + WizardSubPanel *subPanel = new CModWizardSubPanel_Intro( this, "CModWizardSubPanel_Intro" ); + subPanel->SetVisible( false ); + + subPanel = new CModWizardSubPanel_GetModInfo( this, "CModWizardSubPanel_GetModInfo" ); + subPanel->SetVisible( false ); + + subPanel = new CModWizardSubPanel_TemplateOptions( this, "CModWizardSubPanel_TemplateOptions" ); + subPanel->SetVisible( false ); + + + // Tell the config manager which games to put in the config by default + if ( !V_strcmp( g_engineDir, "orangebox" ) ) + { + subPanel = new CModWizardSubPanel_CopyFiles_Source2009( this, "CModWizardSubPanel_CopyFiles" ); + } + else if ( !V_strcmp( g_engineDir, "source2007" ) ) + { + subPanel = new CModWizardSubPanel_CopyFiles_Source2007( this, "CModWizardSubPanel_CopyFiles" ); + } + else + { + subPanel = new CModWizardSubPanel_CopyFiles_Source2006( this, "CModWizardSubPanel_CopyFiles" ); + } + + subPanel->SetVisible( false ); + + subPanel = new CModWizardSubPanel_Finished( this, "CModWizardSubPanel_Finished" ); + subPanel->SetVisible( false ); +} + +CCreateModWizard::~CCreateModWizard() +{ + if ( m_bRunFromCommandLine ) + { + g_bAppQuit = true; + + if ( g_bModWizardFinished ) + SetModWizardStatusCode( 2 ); + else + SetModWizardStatusCode( 3 ); + } +} + + +void CCreateModWizard::Run() +{ + // Set the CompletionCode in the registry to say that we've started. + g_bModWizardFinished = false; + SetModWizardStatusCode( 1 ); + + CModWizardSubPanel_Intro *pIntro = (CModWizardSubPanel_Intro*)FindChildByName( "CModWizardSubPanel_Intro" ); + if ( !pIntro ) + Error( "Missing CModWizardSubPanel_Intro panel." ); + + if ( g_bAutoHL2Mod ) + { + pIntro->m_pModHL2Button->SetSelected( true ); + BaseClass::Run( dynamic_cast<WizardSubPanel *>( FindChildByName( "CModWizardSubPanel_GetModInfo" ) ) ); + } + else + { + BaseClass::Run( dynamic_cast<WizardSubPanel *>(pIntro) ); + } + + MoveToCenterOfScreen(); + Activate(); + + vgui::input()->SetAppModalSurface( GetVPanel() ); +} + |