summaryrefslogtreecommitdiff
path: root/sdklauncher/ModWizard_CopyFiles.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sdklauncher/ModWizard_CopyFiles.cpp')
-rw-r--r--sdklauncher/ModWizard_CopyFiles.cpp1357
1 files changed, 1357 insertions, 0 deletions
diff --git a/sdklauncher/ModWizard_CopyFiles.cpp b/sdklauncher/ModWizard_CopyFiles.cpp
new file mode 100644
index 0000000..21da209
--- /dev/null
+++ b/sdklauncher/ModWizard_CopyFiles.cpp
@@ -0,0 +1,1357 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "ModWizard_Intro.h"
+#include "ModWizard_TemplateOptions.h"
+#include "ModWizard_CopyFiles.h"
+#include "ModWizard_Finished.h"
+#include "CreateModWizard.h"
+#include "configs.h"
+#include "filesystem_tools.h"
+#include "sdklauncher_main.h"
+#include "SDKLauncherDialog.h"
+#include <vgui_controls/WizardPanel.h>
+#include <vgui/ivgui.h>
+#include "SourceAppInfo.h"
+
+using namespace vgui;
+
+extern bool IsGameSubscribed( int nSteamAppId );
+extern char g_engineDir[50];
+
+class CTempDirectory
+{
+public:
+ char m_FullName[MAX_PATH];
+ char m_FullOutName[MAX_PATH];
+};
+
+
+CModWizardSubPanel_CopyFiles::CModWizardSubPanel_CopyFiles( Panel *parent, const char *panelName )
+ : BaseClass( parent, panelName )
+{
+ m_pLabel = new Label( this, "MessageLabel", "" );
+ m_pFinishedLabel = new Label( this, "FinishedLabel", "" );
+ m_pProgressBar = new ProgressBar( this, "CopyProgressBar" );
+ m_pProgressBar->SetProgress( 0 );
+
+ LoadControlSettings( "ModWizardSubPanel_CopyFiles.res");
+}
+
+void CModWizardSubPanel_CopyFiles::OnDisplayAsNext()
+{
+ GetWizardPanel()->SetTitle( "#ModWizard_CopyFiles_Title", true );
+
+ m_iCurCopyFile = -1;
+
+ // All buttons are disabled until we're done.
+ GetWizardPanel()->SetCancelButtonEnabled( false );
+ GetWizardPanel()->SetFinishButtonEnabled( false );
+ GetWizardPanel()->SetPrevButtonEnabled( false );
+ GetWizardPanel()->SetNextButtonEnabled( false );
+
+ ivgui()->AddTickSignal( GetVPanel() );
+}
+
+WizardSubPanel *CModWizardSubPanel_CopyFiles::GetNextSubPanel()
+{
+ return dynamic_cast<WizardSubPanel *>(GetWizardPanel()->FindChildByName("CModWizardSubPanel_Finished"));
+}
+
+void CModWizardSubPanel_CopyFiles::GetReady( const char *pOutputDirName, const char *pOutputModGamedirName, const char *modName )
+{
+ Q_strncpy( m_OutputDirName, pOutputDirName, sizeof( m_OutputDirName ) );
+ Q_strncpy( m_OutModGamedirName, pOutputModGamedirName, sizeof( m_OutModGamedirName ) );
+ Q_strncpy( m_ModName, modName, sizeof( m_ModName ) );
+}
+
+
+// Creates the directory structure and builds a list of files to copy.
+bool CModWizardSubPanel_CopyFiles::BuildCopyFiles_R( const char *pSourceDir, const char *pMask, const char *pOutputDirName )
+{
+ char mask[512];
+ Q_snprintf( mask, sizeof( mask ), "%s%c%s", pSourceDir, CORRECT_PATH_SEPARATOR, pMask );
+
+ // Steam only allows 5 Find handles open at one time, and
+ // we actually will hit the limit if we recurse into directories while looping through the files.
+ CUtlVector<CTempDirectory> directories;
+
+ FileFindHandle_t findHandle;
+ const char *pFilename = g_pFullFileSystem->FindFirstEx( mask, 0, &findHandle );
+ while ( pFilename )
+ {
+ // Skip the "." and ".." directories.
+ if ( pFilename[0] != '.' )
+ {
+ char fullName[MAX_PATH];
+ Q_snprintf( fullName, sizeof( fullName ), "%s%c%s", pSourceDir, CORRECT_PATH_SEPARATOR, pFilename );
+
+ char fullOutName[MAX_PATH];
+ Q_snprintf( fullOutName, sizeof( fullOutName ), "%s%c%s", pOutputDirName, CORRECT_PATH_SEPARATOR, pFilename );
+
+ // We were doing this for Linux but disabled it.
+ //Q_strlower( fullOutName );
+
+ // Recurse into other directories.
+ if ( g_pFullFileSystem->FindIsDirectory( findHandle ) )
+ {
+ CTempDirectory *pBlah = &directories[directories.AddToTail()];
+ Q_strncpy( pBlah->m_FullName, fullName, sizeof( pBlah->m_FullName ) );
+ Q_strncpy( pBlah->m_FullOutName, fullOutName, sizeof( pBlah->m_FullOutName ) );
+ }
+ else
+ {
+ // Don't copy .dsp files.
+ const char *pIgnoreExtension = ".dsp";
+
+ char ext[512];
+ Q_StrRight( pFilename, strlen(pIgnoreExtension), ext, sizeof( ext ) );
+ if ( Q_stricmp( ext, pIgnoreExtension ) != 0 )
+ {
+ CFileCopyInfo info( fullName, fullOutName );
+ m_FileCopyInfos.AddToTail( info );
+ }
+ }
+ }
+
+ pFilename = g_pFullFileSystem->FindNext( findHandle );
+ }
+
+ g_pFullFileSystem->FindClose( findHandle );
+
+
+ // See the definition of directories for why we do this.
+ for ( int i=0; i < directories.Count(); i++ )
+ {
+ // Make sure the directory exists.
+ CTempDirectory *pDir = &directories[i];
+ if ( !CreateFullDirectory( pDir->m_FullOutName ) )
+ {
+ VGUIMessageBox( this, "Error", "Can't create directory: %s", pDir->m_FullOutName );
+ return false;
+ }
+
+ if ( !BuildCopyFiles_R( pDir->m_FullName, pMask, pDir->m_FullOutName ) )
+ return false;
+ }
+
+ return true;
+}
+
+
+
+bool CModWizardSubPanel_CopyFiles::BuildCopyFilesForMappings( char **pMappings, int nMappings )
+{
+ for ( int iDir=0; iDir < nMappings; iDir+=3 )
+ {
+ if ( !BuildCopyFiles_R( pMappings[iDir+0], pMappings[iDir+1], pMappings[iDir+2] ) )
+ {
+ vgui::ivgui()->RemoveTickSignal( GetVPanel() );
+ GetWizardPanel()->SetCancelButtonEnabled( true );
+ return false;
+ }
+ }
+ return true;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2006::BuildCopyFilesForMod_HL2()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\ep1", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2\\hl2","lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2\\hl2","detail.vbsp", outputGamedirNameNoSlash,
+ "hl2\\scripts", "*.*", outputScriptsDir,
+ "hl2\\resource\\ui","*.*", outputUIDir,
+ "hl2\\resource", "clientscheme.res", outputResourceDir,
+ "hl2\\resource", "combinepanelscheme.res", outputResourceDir,
+ "hl2\\resource", "gameevents.res", outputResourceDir,
+ "hl2\\resource", "gamemenu.res", outputResourceDir,
+ "hl2\\resource", "hl2_*.txt", outputResourceDir,
+ "hl2\\resource", "serverevents.res", outputResourceDir,
+ "hl2\\resource", "sourcescheme.res", outputResourceDir,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements("CreateModFiles\\hl2\\gameinfo_ep1.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::BuildCopyFilesForMod_HL2()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH], outputCFGDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+ Q_snprintf( outputCFGDir, sizeof( outputCFGDir ), "%scfg", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\source2009", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2\\hl2","lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2\\hl2","detail.vbsp", outputGamedirNameNoSlash,
+ "CreateModFiles\\source2009\\singleplayer\\scripts", "*.*", outputScriptsDir,
+ "CreateModFiles\\source2009\\singleplayer\\cfg", "*.*", outputCFGDir,
+ "CreateModFiles\\source2009\\singleplayer\\resource", "clientscheme.res", outputResourceDir,
+ "CreateModFiles\\source2009\\singleplayer\\resource", "HL2EP2.ttf", outputResourceDir,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements("CreateModFiles\\source2009\\gameinfo_sp.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::BuildCopyFilesForMod_HL2()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH], outputCFGDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+ Q_snprintf( outputCFGDir, sizeof( outputCFGDir ), "%scfg", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\orangebox", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2\\hl2","lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2\\hl2","detail.vbsp", outputGamedirNameNoSlash,
+ "CreateModFiles\\orangebox\\singleplayer\\scripts", "*.*", outputScriptsDir,
+ "CreateModFiles\\orangebox\\singleplayer\\cfg", "*.*", outputCFGDir,
+ "CreateModFiles\\orangebox\\singleplayer\\resource", "clientscheme.res", outputResourceDir,
+ "CreateModFiles\\orangebox\\singleplayer\\resource", "HL2EP2.ttf", outputResourceDir,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements("CreateModFiles\\orangebox\\gameinfo_sp.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2006::BuildCopyFilesForMod_FromScratch()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ // These go into c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\ep1", "*.*", outputSrcDirName,
+ "sampleapp_sources", "*.*", m_OutputDirName
+ };
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ char *content_mappings[] =
+ {
+ "sampleapp", "*.*", m_OutModGamedirName,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\base\\gameinfo_ep1.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::BuildCopyFilesForMod_FromScratch()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ // These go into c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\source2009", "*.*", outputSrcDirName,
+ "sampleapp_sources", "*.*", m_OutputDirName
+ };
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ char *content_mappings[] =
+ {
+ "CreateModFiles\\source2009\\template", "*.*", m_OutModGamedirName,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\source2009\\gameinfo_template.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+
+ return retVal;
+}
+
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::BuildCopyFilesForMod_FromScratch()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ // These go into c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\orangebox", "*.*", outputSrcDirName,
+ "sampleapp_sources", "*.*", m_OutputDirName
+ };
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ char *content_mappings[] =
+ {
+ "CreateModFiles\\orangebox\\template", "*.*", m_OutModGamedirName,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\orangebox\\gameinfo_template.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2006::BuildCopyFilesForMod_HL2MP()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\ep1", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2 deathmatch\\hl2mp", "lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2 deathmatch\\hl2mp", "detail.vbsp", outputGamedirNameNoSlash,
+ "CreateModFiles\\hl2mp\\scripts", "*.*", outputScriptsDir,
+ "CreateModFiles\\hl2mp\\resource", "*.*", outputResourceDir,
+ "CreateModFiles\\hl2mp\\resource\\ui", "*.*", outputUIDir
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\hl2mp\\gameinfo_ep1.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::BuildCopyFilesForMod_HL2MP()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\source2009", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2 deathmatch\\hl2mp", "lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2 deathmatch\\hl2mp", "detail.vbsp", outputGamedirNameNoSlash,
+ "CreateModFiles\\source2009\\multiplayer", "*.*", m_OutModGamedirName,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\source2009\\gameinfo_mp.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::BuildCopyFilesForMod_HL2MP()
+{
+ bool retVal = false;
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s%s", m_OutputDirName, "src" );
+
+ char outputUIDir[MAX_PATH], outputResourceDir[MAX_PATH], outputScriptsDir[MAX_PATH];
+ Q_snprintf( outputUIDir, sizeof( outputUIDir ), "%sResource%cUI", m_OutModGamedirName, CORRECT_PATH_SEPARATOR );
+ Q_snprintf( outputResourceDir, sizeof( outputResourceDir ), "%sresource", m_OutModGamedirName );
+ Q_snprintf( outputScriptsDir, sizeof( outputScriptsDir ), "%sscripts", m_OutModGamedirName );
+
+ // Also, create the mapsrc/modelsrc/materialsrc directories now because they may not be there yet.
+ CreateSubdirectory( m_OutputDirName, "modelsrc" );
+ CreateSubdirectory( m_OutputDirName, "materialsrc" );
+ CreateSubdirectory( m_OutputDirName, "mapsrc" );
+
+ // These go in c:\mymod
+ char *sources_mappings[] =
+ {
+ "src_mod\\orangebox", "*.*", outputSrcDirName
+ };
+
+ char outputGamedirNameNoSlash[MAX_PATH];
+ Q_strncpy( outputGamedirNameNoSlash, m_OutModGamedirName, sizeof( outputGamedirNameNoSlash ) );
+ if ( strlen( outputGamedirNameNoSlash ) > 0 )
+ outputGamedirNameNoSlash[strlen(outputGamedirNameNoSlash)-1] = 0;
+
+ // These go in c:\steam\steamapps\sourcemods\modname
+ char *content_mappings[] =
+ {
+ "game_content\\half-life 2 deathmatch\\hl2mp", "lights.rad", outputGamedirNameNoSlash,
+ "game_content\\half-life 2 deathmatch\\hl2mp", "detail.vbsp", outputGamedirNameNoSlash,
+ "CreateModFiles\\orangebox\\multiplayer", "*.*", m_OutModGamedirName,
+ };
+
+ // Copy gameinfo.txt
+ const char *replacements[] =
+ {
+ "%modname%", m_ModName
+ };
+
+ retVal = CopyWithReplacements( "CreateModFiles\\orangebox\\gameinfo_mp.txt", replacements, ARRAYSIZE( replacements ), "%s%s", m_OutModGamedirName, "gameinfo.txt" );
+
+ if ( retVal &&
+ BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) ) &&
+ BuildCopyFilesForMappings( content_mappings, ARRAYSIZE( content_mappings ) ) )
+ {
+ retVal = true;
+ }
+ else
+ {
+ retVal = false;
+ }
+
+ return retVal;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2006::BuildCopyFilesForMod_SourceCodeOnly()
+{
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s", m_OutputDirName );
+ int len = strlen( outputSrcDirName );
+ if ( len > 0 && PATHSEPARATOR( outputSrcDirName[len-1] ) )
+ outputSrcDirName[len-1] = 0;
+
+ char *sources_mappings[] =
+ {
+ "src_mod\\ep1", "*.*", outputSrcDirName
+ };
+
+ return BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) );
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::BuildCopyFilesForMod_SourceCodeOnly()
+{
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s", m_OutputDirName );
+ int len = strlen( outputSrcDirName );
+ if ( len > 0 && PATHSEPARATOR( outputSrcDirName[len-1] ) )
+ outputSrcDirName[len-1] = 0;
+
+ char *sources_mappings[] =
+ {
+ "src_mod\\source2009", "*.*", outputSrcDirName
+ };
+
+ return BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) );
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::BuildCopyFilesForMod_SourceCodeOnly()
+{
+ char outputSrcDirName[MAX_PATH];
+ Q_snprintf( outputSrcDirName, sizeof( outputSrcDirName ), "%s", m_OutputDirName );
+ int len = strlen( outputSrcDirName );
+ if ( len > 0 && PATHSEPARATOR( outputSrcDirName[len-1] ) )
+ outputSrcDirName[len-1] = 0;
+
+ char *sources_mappings[] =
+ {
+ "src_mod\\orangebox", "*.*", outputSrcDirName
+ };
+
+ return BuildCopyFilesForMappings( sources_mappings, ARRAYSIZE( sources_mappings ) );
+}
+
+
+void CModWizardSubPanel_CopyFiles::OnTick()
+{
+ if ( m_iCurCopyFile == -1 )
+ {
+ // Figure out if we're an hl2 mod or not.
+ m_ModType = ModType_HL2;
+ CModWizardSubPanel_Intro *pIntro = dynamic_cast<CModWizardSubPanel_Intro*>(GetWizardPanel()->FindChildByName("CModWizardSubPanel_Intro"));
+ if ( pIntro )
+ m_ModType = pIntro->GetModType();
+
+
+ if ( m_ModType == ModType_HL2 )
+ {
+ if ( !BuildCopyFilesForMod_HL2() )
+ return;
+ }
+ else if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ if ( !BuildCopyFilesForMod_HL2MP() )
+ return;
+ }
+ else if ( m_ModType == ModType_SourceCodeOnly )
+ {
+ if ( !BuildCopyFilesForMod_SourceCodeOnly() )
+ return;
+ }
+ else
+ {
+ if ( !BuildCopyFilesForMod_FromScratch() )
+ return;
+ }
+
+
+ // Prepare the lists of files to copy.
+ m_iCurCopyFile = 0;
+
+ // Get the output dir name sans the slash at the end.
+ if ( m_ModType != ModType_SourceCodeOnly )
+ {
+ char outModGamedirNameNoSlash[MAX_PATH];
+ Assert( m_OutModGamedirName[strlen(m_OutModGamedirName)-1] == CORRECT_PATH_SEPARATOR );
+ Q_StrSlice( m_OutModGamedirName, 0, -1, outModGamedirNameNoSlash, sizeof( outModGamedirNameNoSlash ) );
+
+ // Figure out the steam directory. Starting with gamedir, which is
+ //
+ char steamdir[MAX_PATH];
+ Q_strncpy( steamdir, gamedir, sizeof( steamdir ) ); // c:\valve\steam\steamapps\name\sourcesdk\launcher
+ Q_StripLastDir( steamdir, sizeof( steamdir ) ); // c:\valve\steam\steamapps\name\sourcesdk
+ Q_StripLastDir( steamdir, sizeof( steamdir ) ); // c:\valve\steam\steamapps\name
+ Q_StripLastDir( steamdir, sizeof( steamdir ) ); // c:\valve\steam\steamapps
+ Q_StripLastDir( steamdir, sizeof( steamdir ) ); // c:\valve\steam
+ Q_AppendSlash( steamdir, sizeof( steamdir ) );
+
+
+ // Setup the path to their hl2 game folder.
+ char hl2dir[MAX_PATH];
+ Q_strncpy( hl2dir, gamedir, sizeof( hl2dir ) ); // c:\valve\steam\steamapps\name\sourcesdk\launcher
+ Q_StripLastDir( hl2dir, sizeof( hl2dir ) ); // c:\valve\steam\steamapps\name\sourcesdk
+ Q_StripLastDir( hl2dir, sizeof( hl2dir ) ); // c:\valve\steam\steamapps\name
+ Q_AppendSlash( hl2dir, sizeof( hl2dir ) );
+ V_strncat( hl2dir, "source sdk base", sizeof( hl2dir ), COPY_ALL_CHARACTERS );
+
+ // If the engine version is 'orange box' then use the new 'source sdk base 2009' to launch the mods
+ if ( !V_strcmp( g_engineDir, "orangebox" ) )
+ {
+ V_strncat( hl2dir, " 2009", sizeof( hl2dir ), COPY_ALL_CHARACTERS );
+ }
+ // If the engine version isn't 'source2007' then use the new 'source sdk base 2007' to launch the mods
+ else if ( !V_strcmp( g_engineDir, "source2007" ) )
+ {
+ V_strncat( hl2dir, " 2007", sizeof( hl2dir ), COPY_ALL_CHARACTERS );
+ }
+
+ char szAppID[10];
+
+ // DoD only people need to run their mod via DoD
+ if ( IsGameSubscribed( GetAppSteamAppId( k_App_DODS ) ) && !IsGameSubscribed( GetAppSteamAppId( k_App_HL2 ) ) && !IsGameSubscribed( GetAppSteamAppId( k_App_HL2MP ) ) )
+ {
+ _itoa_s(GetAppSteamAppId( k_App_DODS ), szAppID, sizeof(szAppID), 10);
+ }
+ else
+ {
+ // Otherwise use Source SDK Base
+ _itoa_s(GetAppSteamAppId( k_App_SDK_BASE ), szAppID, sizeof(szAppID), 10);
+ }
+
+ // Copy the batch files.
+ const char *replacements[] =
+ {
+ "%steamdir%", steamdir,
+ "%appid%", szAppID,
+ "%hl2dir%", hl2dir,
+ "%moddir%", outModGamedirNameNoSlash,
+ "%bindir%", GetSDKToolsBinDirectory()
+ };
+ const char *filenames[] =
+ {
+ "run_mod.bat",
+ "run_hlmv.bat",
+ "run_studiomdl.bat",
+ "run_hammer.bat"
+ };
+ for ( int iFilename=0; iFilename < ARRAYSIZE( filenames ); iFilename++ )
+ {
+ char srcFilename[MAX_PATH];
+ Q_snprintf( srcFilename, sizeof( srcFilename ), "CreateModFiles\\%s", filenames[iFilename] );
+ if ( !CopyWithReplacements(
+ srcFilename, replacements, ARRAYSIZE( replacements ),
+ "%s%s", m_OutputDirName, filenames[iFilename] ) )
+ {
+ vgui::ivgui()->RemoveTickSignal( GetVPanel() );
+ GetWizardPanel()->SetCancelButtonEnabled( true );
+ return;
+ }
+ }
+ }
+ }
+ else
+ {
+ bool bFinished = false;
+
+ // File copying has begun. Copy N more files and update our label.
+ int nCopied = 0;
+ while ( nCopied < 10 )
+ {
+ if ( m_iCurCopyFile >= m_FileCopyInfos.Count() )
+ {
+ // Also, add a game configuration.
+ char modGamedirNoSlash[MAX_PATH];
+ Q_strncpy( modGamedirNoSlash, m_OutModGamedirName, sizeof( modGamedirNoSlash ) );
+ if ( strlen( modGamedirNoSlash ) > 0 )
+ {
+ if ( modGamedirNoSlash[strlen(modGamedirNoSlash)-1] == '/' || modGamedirNoSlash[strlen(modGamedirNoSlash)-1] == '\\' )
+ modGamedirNoSlash[strlen(modGamedirNoSlash)-1] = 0;
+ }
+
+ if ( m_ModType != ModType_SourceCodeOnly )
+ AddConfig( m_ModName, modGamedirNoSlash, m_ModType );
+
+ // Setup the next panel.
+ CModWizardSubPanel_Finished *pNextPanel = dynamic_cast<CModWizardSubPanel_Finished*>(GetWizardPanel()->FindChildByName("CModWizardSubPanel_Finished"));
+ if ( !pNextPanel )
+ {
+ VGUIMessageBox( this, "Error", "Can't find CModWizardSubPanel_Finished panel." );
+ GetWizardPanel()->SetCancelButtonEnabled( true );
+ return;
+ }
+
+ pNextPanel->GetReady( m_OutputDirName );
+
+ // Direct them out..
+ GetWizardPanel()->SetNextButtonEnabled( true );
+
+ m_pFinishedLabel->SetVisible( true );
+ m_pProgressBar->SetProgress( 1 );
+ bFinished = true;
+
+ vgui::ivgui()->RemoveTickSignal( GetVPanel() );
+ break;
+ }
+
+ // Copy another file.
+ bool bRet= false;
+ CFileCopyInfo *pInfo = &m_FileCopyInfos[m_iCurCopyFile++];
+
+ if ( !HandleSpecialFileCopy( pInfo, bRet ) )
+ {
+ bRet = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ if ( !bRet )
+ {
+ vgui::ivgui()->RemoveTickSignal( GetVPanel() );
+ GetWizardPanel()->SetCancelButtonEnabled( true );
+ break;
+ }
+ ++nCopied;
+ }
+
+ // Update our label.
+ if ( !bFinished )
+ {
+ unsigned int iNum = min( m_iCurCopyFile, m_FileCopyInfos.Count()-1 );
+ if ( iNum < (unsigned int)m_FileCopyInfos.Count() )
+ {
+ char msg[512];
+ Q_snprintf( msg, sizeof( msg ), "%s", m_FileCopyInfos[iNum].m_InFilename );
+ m_pLabel->SetText( msg );
+
+ m_pProgressBar->SetProgress( (float)iNum / m_FileCopyInfos.Count() );
+ }
+ }
+ }
+ BaseClass::OnTick();
+}
+
+
+bool IsVCProjFile( const char *pFilename )
+{
+ char ext[512];
+ Q_StrRight( pFilename, 7, ext, sizeof( ext ) );
+ return ( Q_stricmp( ext, ".vcproj" ) == 0 );
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::HandleReplacements_GameProjectFiles( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ // Speed up the copy process a bit, if it's not a vcproj, get out.
+ if ( !IsVCProjFile( pInfo->m_InFilename ) )
+ return false;
+
+ char replaceWith[MAX_PATH] = {0};
+ const char *replacements[] =
+ {
+ "..\\..\\game\\template\\", replaceWith,
+ "..\\..\\game\\sdksample\\", replaceWith,
+ "..\\..\\game\\hl2\\", replaceWith,
+ "..\\..\\game\\hl2mp\\", replaceWith,
+ "..\\game\\bin", "..\\bin"
+ };
+
+ // No 'dx8' shaders in orange box, at least any time soon, just keeping it cleaned up.
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\materialsystem\\stdshaders\\stdshader_dx9-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\client\\client_scratch-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\server\\server_scratch-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ // removed 'hl2' projects as they're not needed in orange box anymore.
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\client\\client_episodic-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\server\\server_episodic-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\client\\client_hl2mp-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\server\\server_hl2mp-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::HandleReplacements_GameProjectFiles( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ // Speed up the copy process a bit, if it's not a vcproj, get out.
+ if ( !IsVCProjFile( pInfo->m_InFilename ) )
+ return false;
+
+ char replaceWith[MAX_PATH] = {0};
+ const char *replacements[] =
+ {
+ "..\\..\\game\\template\\", replaceWith,
+ "..\\..\\game\\sdksample\\", replaceWith,
+ "..\\..\\game\\hl2\\", replaceWith,
+ "..\\..\\game\\hl2mp\\", replaceWith,
+ "..\\game\\bin", "..\\bin"
+ };
+
+ // No 'dx8' shaders in orange box, at least any time soon, just keeping it cleaned up.
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\materialsystem\\stdshaders\\stdshader_dx9-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\client\\client_scratch-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\server\\server_scratch-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ // removed 'hl2' projects as they're not needed in orange box anymore.
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\client\\client_episodic-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\server\\server_episodic-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\client\\client_hl2mp-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\server\\server_hl2mp-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool CModWizardSubPanel_CopyFiles_Source2006::HandleReplacements_GameProjectFiles( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ // Speed up the copy process a bit, if it's not a vcproj, get out.
+ if ( !IsVCProjFile( pInfo->m_InFilename ) )
+ return false;
+
+ char replaceWith[MAX_PATH] = {0};
+ const char *replacements[] =
+ {
+ "..\\..\\game\\sdksample\\", replaceWith,
+ "..\\..\\game\\hl2\\", replaceWith,
+ "..\\..\\game\\hl2mp\\", replaceWith,
+ "..\\game\\bin", "..\\bin"
+ };
+
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\materialsystem\\stdshaders\\stdshader_dx8-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\materialsystem\\stdshaders\\stdshader_dx8-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\materialsystem\\stdshaders\\stdshader_dx9-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\materialsystem\\stdshaders\\stdshader_dx9-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_scratch-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_scratch-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_scratch-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_scratch-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_hl2-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_hl2-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_hl2-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_hl2-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_hl2mp-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\cl_dll\\client_hl2mp-2005.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_hl2mp-2003.vcproj" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\dlls\\server_hl2mp-2005.vcproj" ) == 0 )
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ Q_snprintf( replaceWith, sizeof( replaceWith ), "%s", m_OutModGamedirName );
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles::HandleReplacements_GenericVCProj( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ if ( IsVCProjFile( pInfo->m_InFilename ) )
+ {
+ // This code is for all the tools. Internally, Valve uses <base dir>\game\bin, and externally,
+ // they're using <game dir>\bin to store tools.
+ const char *vcprojReplacements[] =
+ {
+ "..\\game\\bin", "..\\bin"
+ };
+
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, vcprojReplacements, ARRAYSIZE( vcprojReplacements ), "%s", pInfo->m_OutFilename );
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2006::HandleReplacements_Solution( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_scratch-2003.sln" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_scratch-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_hl2-2003.sln" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_hl2-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_hl2mp-2003.sln" ) == 0 ||
+ Q_stricmp( pInfo->m_InFilename, "src_mod\\ep1\\game_hl2mp-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2009::HandleReplacements_Solution( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game_scratch-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+
+ return true;
+ }
+ // Episodic now, not 'hl2'!!
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game_episodic-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game_hl2mp-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::HandleReplacements_Solution( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game_scratch-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_FromScratch )
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+
+ return true;
+ }
+ // Episodic now, not 'hl2'!!
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game_episodic-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2 || m_ModType == ModType_SourceCodeOnly )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+ else if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game_hl2mp-2005.sln" ) == 0)
+ {
+ bErrorStatus = true;
+ if ( m_ModType == ModType_HL2_Multiplayer )
+ {
+ bErrorStatus = DoCopyFile( pInfo->m_InFilename, pInfo->m_OutFilename );
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool CModWizardSubPanel_CopyFiles_Source2009::HandleReplacements_TemplateOptions( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ // Copy over the sdk_shareddefs.h with replacements for the defines.
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\source2009\\game\\shared\\sdk\\sdk_shareddefs.h" ) == 0 )
+ {
+ // If the panel can't be found, get out.
+ CModWizardSubPanel_TemplateOptions *pTemplate = dynamic_cast<CModWizardSubPanel_TemplateOptions*>(GetWizardPanel()->FindChildByName("CModWizardSubPanel_TemplateOptions"));
+ if ( !pTemplate )
+ return false;
+
+ const char *replacements[] =
+ {
+ "%TemplateOptionTeams%", pTemplate->GetOption(TPOPTION_TEAMS),
+ "%TemplateOptionClasses%", pTemplate->GetOption(TPOPTION_CLASSES),
+ "%TemplateOptionStamina%", pTemplate->GetOption(TPOPTION_STAMINA),
+ "%TemplateOptionSprinting%", pTemplate->GetOption(TPOPTION_SPRINTING),
+ "%TemplateOptionProne%", pTemplate->GetOption(TPOPTION_PRONE),
+ "%TemplateOptionShootWhileSprinting%", pTemplate->GetOption(TPOPTION_SHOOTSPRINTING),
+ "%TemplateOptionShootOnLadders%", pTemplate->GetOption(TPOPTION_SHOOTLADDERS),
+ "%TemplateOptionShootWhileJumping%", pTemplate->GetOption(TPOPTION_SHOOTJUMPING)
+ };
+
+ bErrorStatus = true;
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+
+ return true;
+ }
+
+ return false;
+}
+
+
+bool CModWizardSubPanel_CopyFiles_Source2007::HandleReplacements_TemplateOptions( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ // Copy over the sdk_shareddefs.h with replacements for the defines.
+ if ( Q_stricmp( pInfo->m_InFilename, "src_mod\\orangebox\\game\\shared\\sdk\\sdk_shareddefs.h" ) == 0 )
+ {
+ // If the panel can't be found, get out.
+ CModWizardSubPanel_TemplateOptions *pTemplate = dynamic_cast<CModWizardSubPanel_TemplateOptions*>(GetWizardPanel()->FindChildByName("CModWizardSubPanel_TemplateOptions"));
+ if ( !pTemplate )
+ return false;
+
+ const char *replacements[] =
+ {
+ "%TemplateOptionTeams%", pTemplate->GetOption(TPOPTION_TEAMS),
+ "%TemplateOptionClasses%", pTemplate->GetOption(TPOPTION_CLASSES),
+ "%TemplateOptionStamina%", pTemplate->GetOption(TPOPTION_STAMINA),
+ "%TemplateOptionSprinting%", pTemplate->GetOption(TPOPTION_SPRINTING),
+ "%TemplateOptionProne%", pTemplate->GetOption(TPOPTION_PRONE),
+ "%TemplateOptionShootWhileSprinting%", pTemplate->GetOption(TPOPTION_SHOOTSPRINTING),
+ "%TemplateOptionShootOnLadders%", pTemplate->GetOption(TPOPTION_SHOOTLADDERS),
+ "%TemplateOptionShootWhileJumping%", pTemplate->GetOption(TPOPTION_SHOOTJUMPING)
+ };
+
+ bErrorStatus = true;
+ bErrorStatus = CopyWithReplacements( pInfo->m_InFilename, replacements, ARRAYSIZE( replacements ), "%s", pInfo->m_OutFilename );
+
+ return true;
+ }
+
+ return false;
+}
+
+bool CModWizardSubPanel_CopyFiles::HandleSpecialFileCopy( CFileCopyInfo *pInfo, bool &bErrorStatus )
+{
+ if ( HandleReplacements_TemplateOptions( pInfo, bErrorStatus ) )
+ return true;
+
+ if ( HandleReplacements_GameProjectFiles( pInfo, bErrorStatus ) )
+ return true;
+
+ if ( HandleReplacements_GenericVCProj( pInfo, bErrorStatus ) )
+ return true;
+
+ if ( HandleReplacements_Solution( pInfo, bErrorStatus ) )
+ return true;
+
+ return false;
+}
+
+CModWizardSubPanel_CopyFiles_Source2006::CModWizardSubPanel_CopyFiles_Source2006( Panel *parent, const char *panelName ) : CModWizardSubPanel_CopyFiles( parent, panelName )
+{
+}
+
+CModWizardSubPanel_CopyFiles_Source2007::CModWizardSubPanel_CopyFiles_Source2007( Panel *parent, const char *panelName ) : CModWizardSubPanel_CopyFiles( parent, panelName )
+{
+}
+
+CModWizardSubPanel_CopyFiles_Source2009::CModWizardSubPanel_CopyFiles_Source2009( Panel *parent, const char *panelName ) : CModWizardSubPanel_CopyFiles( parent, panelName )
+{
+}