/* * Descent 3 * Copyright (C) 2024 Parallax Software * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . --- HISTORICAL COMMENTS FOLLOW --- * $Logfile: /DescentIII/Main/editor/ScriptMassCompile.cpp $ * $Revision: 1.1.1.1 $ * $Date: 2003-08-26 03:57:39 $ * $Author: kevinb $ * * Implementation of mass script compile dialog * * $Log: not supported by cvs2svn $ * * 9 4/03/99 1:36a Jeff * added no-check out option for mass compiler * * 8 2/25/99 12:34p Jeff * don't display message if someone has a file checked out during mass * compile * * 7 2/21/99 8:05p Jeff * better handling of out-of-sync scripts * * 6 1/11/99 3:34p Jeff * added checks for when going editor->game to see if scripts are out of * date, if so give the option of breaking out. Add some options to mass * script compiler, along with a toolbar shortcut. * * 5 12/30/98 4:39p Jeff * selectable to what scripts to display (checked out, non-checked out or * both) * * 4 12/20/98 9:57p Jeff * finished mass compile dialog * * 3 12/18/98 12:36p Jeff * created a function to determine a script's type and hooked it in * * 2 12/18/98 12:11p Jeff * added mass script compile dialog * * $NoKeywords: $ */ // ScriptMassCompile.cpp : implementation file // #include "stdafx.h" #include "editor.h" #include "ScriptMassCompile.h" #include "cfile.h" #include "gamefile.h" #include "gamefilepage.h" #include "AppDatabase.h" #include "Descent.h" #include "mono.h" #include "ddio.h" #include "ScriptCompilerAPI.h" #include #include #include "mem.h" #include "pserror.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CScriptMassCompile dialog CString MassScriptEditContent; CEdit *MassScriptEdit; void writeline(char *format, ... ); CScriptMassCompile::CScriptMassCompile(CWnd* pParent /*=NULL*/) : CDialog(CScriptMassCompile::IDD, pParent) { //{{AFX_DATA_INIT(CScriptMassCompile) m_AutoCheckIn = FALSE; m_DisplayType = 2; m_NoCheckout = FALSE; //}}AFX_DATA_INIT } void CScriptMassCompile::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CScriptMassCompile) DDX_Control(pDX, IDC_LIST, m_ScriptList); DDX_Check(pDX, IDC_AUTOCHECKIN, m_AutoCheckIn); DDX_Radio(pDX, IDC_LOCKED, m_DisplayType); DDX_Check(pDX, IDC_NOCHECKOUT, m_NoCheckout); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CScriptMassCompile, CDialog) //{{AFX_MSG_MAP(CScriptMassCompile) ON_BN_CLICKED(IDC_BUILD, OnBuild) ON_BN_CLICKED(IDC_LOCKED, OnLocked) ON_BN_CLICKED(IDC_NOTLOCKED, OnNotlocked) ON_BN_CLICKED(IDC_BOTH, OnBoth) ON_BN_CLICKED(IDC_SELECTALL, OnSelectall) ON_BN_CLICKED(IDC_OODSCRIPTS, OnOodscripts) ON_BN_CLICKED(IDC_OOSSCRIPTS, OnOosscripts) ON_BN_CLICKED(IDC_NOCHECKOUT, OnNocheckout) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CScriptMassCompile message handlers void CScriptMassCompile::OnBuild() { UpdateData(true); MassScriptEditContent = ""; writeline("Starting Mass Build."); int i,list_size,listbox_size,index; int *index_map = NULL; CCheckListBox *list; char tempbuffer[_MAX_PATH]; CWnd *wnd; list = (CCheckListBox *)GetDlgItem(IDC_LIST); listbox_size = list->GetCount(); list_size = 0; for(i=0;iGetCheck(i)){ list_size++; } } if(list_size==0) return; index_map = (int *)mem_malloc(list_size*sizeof(int)); if(!index_map) return; index = 0; for(i=0;iGetCheck(i)){ index_map[index] = i; index++; } } wnd = (CWnd *)GetDlgItem(IDC_FILENAME); bool ret1,ret2,ret3,ret4; for(i=0;iGetText(index,tempbuffer); wnd->SetWindowText(tempbuffer); writeline("------------------------------- %s --------------------------",tempbuffer); Descent->defer(); ret1 = Step1(tempbuffer); Descent->defer(); ret2 = Step2(tempbuffer); Descent->defer(); ret3 = Step3(tempbuffer,ret2); Descent->defer(); if(ret1){ ret4 = Step4(tempbuffer); Descent->defer(); }else{ SetStepText(4,"Skipping due to results of Step 1"); writeline("Step 4: Skipped due to result of Step 1 (maybe already checked out)"); ret4 = true; } } OutrageMessageBox("Mass Compile Complete"); mem_free(index_map); } void CScriptMassCompile::OnOK() { UpdateData(true); Database->write("EditorScriptAutoCheckin",m_AutoCheckIn); CDialog::OnOK(); } void writeline(char *format, ... ) { char buffer[2048]; va_list marker; va_start(marker,format); vsprintf(buffer,format,marker); va_end(marker); MassScriptEditContent += buffer; MassScriptEditContent += "\r\n"; MassScriptEdit->SetWindowText(MassScriptEditContent.GetBuffer(0)); Descent->defer(); int total_lines = MassScriptEdit->GetLineCount(); int curr_index = MassScriptEdit->GetFirstVisibleLine(); if( (total_lines-curr_index)>16 ){ //we need to scroll down a line MassScriptEdit->LineScroll((total_lines-curr_index)-16); } } ubyte DetermineScriptType(char *filename) { CFILE *file; file = cfopen(filename,"rt"); if(!file){ return 255; } char buffer[4096]; bool done = false; ubyte script_type = ST_GAME; cf_ReadString(buffer,4096,file); while(!(cfeof(file) || done)){ if(strstr(buffer,"GetTriggerScriptID")){ //we found it! script_type = ST_LEVEL; done = true; } cf_ReadString(buffer,4096,file); } cfclose(file); return script_type; } void CScriptMassCompile::BuildList(void) { CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST); if(!list) return; list->ResetContent(); char buffer[_MAX_PATH]; int length; for (int i=0;i4 && !stricmp(&Gamefiles[i].name[length-4],".cpp")){ switch(m_DisplayType){ case 0: //checked out only { if(mng_FindTrackLock(Gamefiles[i].name,PAGETYPE_GAMEFILE)!=-1){ strcpy(buffer,Gamefiles[i].name); buffer[length-4] = '\0'; list->AddString(buffer); } }break; case 1: //non-check out only { if(mng_FindTrackLock(Gamefiles[i].name,PAGETYPE_GAMEFILE)==-1){ strcpy(buffer,Gamefiles[i].name); buffer[length-4] = '\0'; list->AddString(buffer); } }break; case 2: //both { strcpy(buffer,Gamefiles[i].name); buffer[length-4] = '\0'; list->AddString(buffer); }break; }; } } } } BOOL CScriptMassCompile::OnInitDialog() { CDialog::OnInitDialog(); bool bval; if(Database->read("EditorScriptAutoCheckin",&bval)) m_AutoCheckIn = bval; else m_AutoCheckIn = true; UpdateData(false); MassScriptEditContent = ""; MassScriptEdit = (CEdit *)GetDlgItem(IDC_OUTPUT); writeline("System Initialized."); if(!Network_up){ writeline("WARNING: You did not say yes to the data update, therefore, your work will not be saved for the scripts that you don't currently have checked out."); } writeline("------------------------------------------------------------------------------------------------------------------------------------------------"); BuildList(); return TRUE; } void CScriptMassCompile::SetStepText(int step,char *format,...) { if(step<1 || step>4) return; char buffer[1024]; va_list marker; va_start(marker,format); vsprintf(buffer,format,marker); va_end(marker); CWnd *wnd; int msg_to; switch(step){ case 1: wnd = (CWnd *)GetDlgItem(IDC_STEP1); msg_to = IDC_STEP1; break; case 2: wnd = (CWnd *)GetDlgItem(IDC_STEP2); msg_to = IDC_STEP2; break; case 3: wnd = (CWnd *)GetDlgItem(IDC_STEP3); msg_to = IDC_STEP3; break; case 4: wnd = (CWnd *)GetDlgItem(IDC_STEP4); msg_to = IDC_STEP4; break; }; wnd->SetWindowText(buffer); SendDlgItemMessage( msg_to, WM_PAINT,0,0); Descent->defer(); } //return true if the file was checked out for this step bool CheckOutGamefile(char *tempbuffer,bool show_ok_confirmation,bool report_who_has_locked); bool CScriptMassCompile::Step1(char *filename) { if(!Network_up){ SetStepText(1,"Skipping, Network 'Down'"); writeline("Step 1: Skipping, Due to the NO on data update"); return false; } if(m_NoCheckout){ SetStepText(1,"Skipping, 'no checkout' option checked"); writeline("Step 1: Skipping, 'no checkout' option checked"); return false; } char source_filename[_MAX_PATH],compiled_filename[_MAX_PATH]; //make the locker if (!mng_MakeLocker()){ SetStepText(1,"Unable to create locker, can't check out"); writeline("Step 1: Can't make locker file, skipping check out"); return false; } //make real filenames strcpy(source_filename,filename); strcpy(compiled_filename,filename); strcat(source_filename,".cpp"); strcat(compiled_filename,".dll"); bool found_script = false,found_compiled = false; int i; //make sure the compiled script is in the gamefiles for(i=0;iSetWindowText(MassScriptEditContent.GetBuffer(0)); int total_lines = MassScriptEdit->GetLineCount(); int curr_index = MassScriptEdit->GetFirstVisibleLine(); if( (total_lines-curr_index)>16 ){ //we need to scroll down a line MassScriptEdit->LineScroll((total_lines-curr_index)-16); } Descent->defer(); } bool CScriptMassCompile::Step3(char *filename,bool islevel) { tCompilerInfo ci; ci.callback = masscompilercallback; ci.script_type = (islevel)?ST_LEVEL:ST_GAME; strcpy(ci.source_filename,filename); strcat(ci.source_filename,".cpp"); char compiled_filename[_MAX_PATH],full_path[_MAX_PATH]; strcpy(compiled_filename,filename); strcat(compiled_filename,".dll"); ddio_MakePath(full_path,LocalScriptDir,compiled_filename,NULL); if(cfexist(full_path)){ ddio_DeleteFile (full_path); } writeline("===START COMPILE==="); ScriptCompile(&ci); writeline(""); writeline("===END COMPILE==="); bool ret; if(cfexist(full_path)){ writeline("Step 3: DLL Created"); SetStepText(3,"DLL Created"); ret = true; }else{ writeline("Step 3: DLL Not Created"); SetStepText(3,"DLL NOT Created"); ret = false; } return ret; } bool CheckInGamefile(char *tempbuffer,bool giveok); bool AddNewGameFile(char *fullpath,char *directory); bool CScriptMassCompile::Step4(char *filename) { if(!Network_up){ SetStepText(4,"Skipping, Network 'Down'"); writeline("Step 4: Skipping, Due to the NO on data update"); return false; } if(!m_AutoCheckIn){ SetStepText(4,"Skipping, Auto Checkin box not set"); writeline("Step 4: Skipping, Auto Checkin box not set"); return false; } char source_filename[_MAX_PATH],compiled_filename[_MAX_PATH]; //make the locker if (!mng_MakeLocker()){ SetStepText(4,"Unable to create locker, can't check in"); writeline("Step 4: Can't make locker file, skipping check in"); return false; } //make real filenames strcpy(source_filename,filename); strcpy(compiled_filename,filename); strcat(source_filename,".cpp"); strcat(compiled_filename,".dll"); bool ntci_source = false,ntci_compiled = false; int i; for(i=0;i=MAX_GAMEFILES){ //compiled file doesn't exist, we'll need to add it writeline("Step 4: Attempting to add %s to manage system",compiled_filename); char fullpath[_MAX_PATH]; ddio_MakePath(fullpath,LocalScriptDir,compiled_filename,NULL); bool ret = AddNewGameFile(fullpath,"scripts"); if(!ret){ writeline("Step 4: Unable to add %s to manage system",compiled_filename); writeline("Step 4: Aborting"); SetStepText(4,"Aborted"); mng_EraseLocker(); return false; }else ntci_compiled = true; } } //we have at least 1 file to check in bool sret = true,cret = true; if(ntci_source){ sret = CheckInGamefile(source_filename,false); if(!sret){ writeline("Step 4: Unable to check in source file"); } } if(ntci_compiled){ cret = CheckInGamefile(compiled_filename,false); if(!cret){ writeline("Step 4: Unable to check in compiled file"); } } if( !sret || !cret ){ SetStepText(4,"There were errors checking in files"); writeline("Step 4: Errors had occurred"); }else{ SetStepText(4,"Success"); writeline("Step 4: Success"); } mng_EraseLocker(); return (sret||cret); } void CScriptMassCompile::OnLocked() { UpdateData(true); BuildList(); } void CScriptMassCompile::OnNotlocked() { UpdateData(true); BuildList(); } void CScriptMassCompile::OnBoth() { UpdateData(true); BuildList(); } void CScriptMassCompile::OnSelectall() { CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST); if(!list) return; int count = list->GetCount(); for(int i=0;iSetCheck(i,1); list->SetSel(i,TRUE); } } bool IsScriptOutofDate(char *name); void CScriptMassCompile::OnOodscripts() { CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST); if(!list) return; char old_dir[_MAX_PATH]; ddio_GetWorkingDir(old_dir,_MAX_PATH); ddio_SetWorkingDir(LocalScriptDir); char filename[_MAX_PATH]; int count = list->GetCount(); for(int i=0;iGetText(i,filename); strcat(filename,".cpp"); if(IsScriptOutofDate(filename)){ list->SetCheck(i,1); list->SetSel(i,TRUE); }else{ list->SetCheck(i,0); list->SetSel(i,FALSE); } } ddio_SetWorkingDir(old_dir); } bool IsScriptOutofSync(char *name); void CScriptMassCompile::OnOosscripts() { CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST); if(!list) return; char filename[_MAX_PATH]; int count = list->GetCount(); for(int i=0;iGetText(i,filename); strcat(filename,".cpp"); if(IsScriptOutofSync(filename)){ list->SetCheck(i,1); list->SetSel(i,TRUE); }else{ list->SetCheck(i,0); list->SetSel(i,FALSE); } } } void CScriptMassCompile::OnNocheckout() { // TODO: Add your control notification handler code here }