2024-04-20 16:23:08 +00:00
|
|
|
|
/*
|
2024-06-15 18:12:48 +00:00
|
|
|
|
* Descent 3
|
2024-04-20 16:23:08 +00:00
|
|
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
2024-05-06 15:12:44 +00:00
|
|
|
|
--- HISTORICAL COMMENTS FOLLOW ---
|
|
|
|
|
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* $Logfile: /DescentIII/Main/editor/ScriptLevelInterface.cpp $
|
|
|
|
|
* $Revision: 1.1.1.1 $
|
|
|
|
|
* $Date: 2003-08-26 03:57:38 $
|
|
|
|
|
* $Author: kevinb $
|
|
|
|
|
*
|
|
|
|
|
* ScriptLevelInterface.cpp : implementation file
|
|
|
|
|
*
|
|
|
|
|
* $Log: not supported by cvs2svn $
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 24 5/11/99 12:13p Jason
|
|
|
|
|
* added checks for messed up gamefiles
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 23 2/25/99 12:34p Jeff
|
|
|
|
|
* don't display message that someone has a file checked out during mass
|
|
|
|
|
* compile
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 22 2/24/99 9:39p Jeff
|
|
|
|
|
* only sync scripts when needed
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 21 2/23/99 11:52p Jeff
|
|
|
|
|
* new script dll sync dialog
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 20 2/21/99 8:04p Jeff
|
|
|
|
|
* better handling of out-of-sync scripts
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 19 2/18/99 8:29p Nate
|
|
|
|
|
* commented out some manage code
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 18 2/18/99 10:58a Jeff
|
|
|
|
|
* added a 'find in files' for gamefiles manage system
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 17 2/17/99 6:54p Jeff
|
|
|
|
|
* added check box for auto check in/out scripts with levels...fix
|
|
|
|
|
* checksum mprintf bug
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 16 2/09/99 4:43p Jeff
|
|
|
|
|
* fixed resource leak
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 15 2/01/99 11:55a Jeff
|
|
|
|
|
* automatically check in/out .msg and .str files
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 14 1/13/99 5:01p Jeff
|
|
|
|
|
* don't auto-checkin dll if the .cpp doesn't get checked in for a new
|
|
|
|
|
* file
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 13 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.
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 12 1/05/99 4:54p Jeff
|
|
|
|
|
* save the last script edited and set the on init
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 11 1/05/99 4:33p Jeff
|
|
|
|
|
* when "Display non checkout files" is checked, display the .cpp files in
|
|
|
|
|
* the directory...not just whats in the table file
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 10 12/21/98 6:41p Jeff
|
|
|
|
|
* auto-compile, check in and check back out for when new scripts are
|
|
|
|
|
* created. (yes must be said to the data update)
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 9 12/20/98 9:57p Jeff
|
|
|
|
|
* added ability to display scripts not checked out. don't display
|
|
|
|
|
* message on checkin/out
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 8 12/18/98 12:11p Jeff
|
|
|
|
|
* created a function to determine a script's type and hooked it in
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 7 12/18/98 12:11p Jeff
|
|
|
|
|
* added mass script compile dialog
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 6 12/18/98 10:40a Jeff
|
|
|
|
|
* save out settings to registry
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 5 12/13/98 7:50p Jeff
|
|
|
|
|
* automatically add new DLLs that aren't in the manage
|
|
|
|
|
* system...implemented create new script function, even though it's still
|
|
|
|
|
* in infancy.
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 4 12/13/98 3:10a Jeff
|
|
|
|
|
* fixed some bugs. Automatically check in/out/etc .dll when operating
|
|
|
|
|
* with .cpp. Hooked in compiler and compiler configuration. Very
|
|
|
|
|
* complete.
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 3 12/11/98 10:34p Jeff
|
|
|
|
|
* Updated the script/level interface, all manage system integration is
|
|
|
|
|
* complete. External Script Editor loading is setup too.
|
2024-06-15 18:12:48 +00:00
|
|
|
|
*
|
2024-04-19 20:58:24 +00:00
|
|
|
|
* 2 12/11/98 5:50p Jeff
|
|
|
|
|
* implemented and added changes regarding Level&Scripting manage system
|
|
|
|
|
* and compiler interface
|
|
|
|
|
*
|
|
|
|
|
* $NoKeywords: $
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// ScriptLevelInterface.cpp : implementation file
|
|
|
|
|
//
|
|
|
|
|
|
2024-07-19 22:14:36 +00:00
|
|
|
|
#include <filesystem>
|
|
|
|
|
#include <regex>
|
|
|
|
|
|
2024-04-19 20:58:24 +00:00
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "editor.h"
|
|
|
|
|
#include "ScriptLevelInterface.h"
|
|
|
|
|
#include "CreateNewScriptDlg.h"
|
|
|
|
|
#include "VirtualCompilerConfig.h"
|
|
|
|
|
#include "ScriptMassCompile.h"
|
|
|
|
|
#include "gamefile.h"
|
|
|
|
|
#include "gamefilepage.h"
|
|
|
|
|
#include "descent.h"
|
|
|
|
|
#include "mono.h"
|
|
|
|
|
#include "ddio.h"
|
|
|
|
|
#include "pserror.h"
|
|
|
|
|
#include "manage.h"
|
|
|
|
|
#include "mem.h"
|
|
|
|
|
#include "ScriptCompilerAPI.h"
|
|
|
|
|
#include "AppDatabase.h"
|
|
|
|
|
#include "ScriptSyncDialog.h"
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
|
#undef THIS_FILE
|
|
|
|
|
static char THIS_FILE[] = __FILE__;
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool AddNewGameFile(char *fullpath, char *directory);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
bool DeleteGamefile(char *tempbuffer);
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CheckInGamefile(char *tempbuffer, bool giveok);
|
|
|
|
|
bool CheckOutGamefile(char *tempbuffer, bool show_ok_confirmation, bool report_who_has_locked = true);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
|
|
|
|
char LastScriptSelected[256];
|
|
|
|
|
bool Scripts_need_sync = true;
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// CScriptLevelInterface dialog
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
CScriptLevelInterface::CScriptLevelInterface(CWnd *pParent /*=NULL*/) : CDialog(CScriptLevelInterface::IDD, pParent) {
|
|
|
|
|
//{{AFX_DATA_INIT(CScriptLevelInterface)
|
|
|
|
|
m_ViewType = -1;
|
|
|
|
|
m_ScriptType = 0;
|
|
|
|
|
m_ShowNonCheckedOut = FALSE;
|
|
|
|
|
m_AutoCheckScripts = FALSE;
|
|
|
|
|
//}}AFX_DATA_INIT
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
InCritical = false;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::DoDataExchange(CDataExchange *pDX) {
|
|
|
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
|
//{{AFX_DATA_MAP(CScriptLevelInterface)
|
|
|
|
|
DDX_Control(pDX, IDC_LIST_AVAILABLE, m_ListAvailable);
|
|
|
|
|
DDX_Control(pDX, IDC_LIST_CHECKEDOUT, m_ListCheckedOut);
|
|
|
|
|
DDX_Control(pDX, IDC_SELECTED_SCRIPT, m_ScriptToCompile);
|
|
|
|
|
DDX_Radio(pDX, IDC_RADIO_LEVELS, m_ViewType);
|
|
|
|
|
DDX_Radio(pDX, IDC_SCRIPTGAME, m_ScriptType);
|
|
|
|
|
DDX_Check(pDX, IDC_LIST_NONCHECKED_OUT, m_ShowNonCheckedOut);
|
|
|
|
|
DDX_Check(pDX, IDC_AUTOCHECKSCRIPTS, m_AutoCheckScripts);
|
|
|
|
|
//}}AFX_DATA_MAP
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CScriptLevelInterface, CDialog)
|
2024-06-15 18:12:48 +00:00
|
|
|
|
//{{AFX_MSG_MAP(CScriptLevelInterface)
|
|
|
|
|
ON_BN_CLICKED(IDC_CHECKOUT, OnCheckout)
|
|
|
|
|
ON_BN_CLICKED(IDC_CHECKIN, OnCheckin)
|
|
|
|
|
ON_BN_CLICKED(IDC_UNDOCHECKOUT, OnUndocheckout)
|
|
|
|
|
ON_BN_CLICKED(IDC_RADIO_SCRIPTS, OnRadioScripts)
|
|
|
|
|
ON_BN_CLICKED(IDC_RADIO_LEVELS, OnRadioLevels)
|
|
|
|
|
ON_BN_CLICKED(IDC_COMPILE, OnCompile)
|
|
|
|
|
ON_BN_CLICKED(IDC_EDITSCRIPT, OnEditscript)
|
|
|
|
|
ON_CBN_CLOSEUP(IDC_SELECTED_SCRIPT, OnCloseupSelectedScript)
|
|
|
|
|
ON_BN_CLICKED(IDC_ADDNEW, OnAddnew)
|
|
|
|
|
ON_BN_CLICKED(IDC_DELETE, OnDelete)
|
|
|
|
|
ON_BN_CLICKED(IDC_CREATESCRIPT, OnCreatescript)
|
|
|
|
|
ON_WM_CLOSE()
|
|
|
|
|
ON_WM_DESTROY()
|
|
|
|
|
ON_BN_CLICKED(IDC_CONFIGCOMPILER, OnConfigcompiler)
|
|
|
|
|
ON_BN_CLICKED(IDC_MASSCOMPILE, OnMasscompile)
|
|
|
|
|
ON_CBN_SELCHANGE(IDC_SELECTED_SCRIPT, OnSelchangeSelectedScript)
|
|
|
|
|
ON_BN_CLICKED(IDC_LIST_NONCHECKED_OUT, OnListNoncheckedOut)
|
|
|
|
|
//}}AFX_MSG_MAP
|
2024-04-19 20:58:24 +00:00
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// CScriptLevelInterface message handlers
|
|
|
|
|
|
2024-07-19 22:14:36 +00:00
|
|
|
|
void CScriptLevelInterface::SetStatus(const char *str) {
|
2024-06-15 18:12:48 +00:00
|
|
|
|
CWnd *wnd = (CWnd *)GetDlgItem(IDC_STATUS);
|
|
|
|
|
wnd->SetWindowText(str);
|
|
|
|
|
Descent->defer();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnCheckout() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
InCritical = true;
|
|
|
|
|
SetStatus("Checking out files");
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
// we're working with levels & level scripts
|
|
|
|
|
if (CheckOutLevels())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
} else {
|
|
|
|
|
// we're working with game scripts
|
|
|
|
|
if (CheckOutScripts())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
InCritical = false;
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
Scripts_need_sync = true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnCheckin() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
InCritical = true;
|
|
|
|
|
SetStatus("Checking in files");
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
// we're working with levels & level scripts
|
|
|
|
|
if (CheckInLevels())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
} else {
|
|
|
|
|
// we're working with game scripts
|
|
|
|
|
if (CheckInScripts())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
InCritical = false;
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnUndocheckout() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
InCritical = true;
|
|
|
|
|
SetStatus("Undoing Checkout on files");
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
// we're working with levels & level scripts
|
|
|
|
|
if (UndoCheckOutLevels())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
} else {
|
|
|
|
|
// we're working with game scripts
|
|
|
|
|
if (UndoCheckOutScripts())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
InCritical = false;
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
Scripts_need_sync = true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnRadioScripts() { UpdateDialog(); }
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnRadioLevels() { UpdateDialog(); }
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
|
|
|
|
CEdit *CompileOutputWindow;
|
|
|
|
|
CString CompileOutputData;
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CompileOutputCallback(char *str) {
|
|
|
|
|
CompileOutputData += str;
|
|
|
|
|
CompileOutputWindow->SetWindowText(CompileOutputData);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnCompile() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
|
|
|
|
|
SetStatus("Compiling...");
|
|
|
|
|
|
|
|
|
|
bool dll_exist = true;
|
|
|
|
|
|
|
|
|
|
char buffer[_MAX_PATH], filename[_MAX_PATH];
|
|
|
|
|
m_ScriptToCompile.GetLBText(m_ScriptToCompile.GetCurSel(), buffer);
|
|
|
|
|
ddio_SplitPath(buffer, NULL, filename, NULL);
|
|
|
|
|
strcat(filename, ".dll");
|
|
|
|
|
if (!cfexist(filename)) {
|
|
|
|
|
// there isn't a dll yet...lets make sure one isn't in the manage system
|
|
|
|
|
bool found;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
found = false;
|
|
|
|
|
for (i = 0; i < MAX_GAMEFILES; i++) {
|
|
|
|
|
if (Gamefiles[i].used && (!stricmp(filename, Gamefiles[i].name))) {
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!found) {
|
|
|
|
|
// ok there wasn't one in the gamefiles make sure there isn't a tracklocked
|
|
|
|
|
if (mng_FindTrackLock(filename, PAGETYPE_GAMEFILE) == -1) {
|
|
|
|
|
// there isn't one in the track lock...this is our first compile!
|
|
|
|
|
dll_exist = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tCompilerInfo ci;
|
|
|
|
|
ci.callback = CompileOutputCallback;
|
|
|
|
|
ci.script_type = (m_ScriptType == 0) ? ST_GAME : ST_LEVEL;
|
|
|
|
|
strcpy(ci.source_filename, buffer);
|
|
|
|
|
CompileOutputWindow = (CEdit *)GetDlgItem(IDC_COMPILER_OUTPUT);
|
|
|
|
|
CompileOutputData = "";
|
|
|
|
|
|
|
|
|
|
ScriptCompile(&ci);
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
CompileOutputData = ""; // no need for this to hang around
|
|
|
|
|
|
|
|
|
|
if (!dll_exist && cfexist(filename)) {
|
|
|
|
|
// yeah! we created a dll, ask the user if they want to put it into the manage system
|
|
|
|
|
if (Network_up) {
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"Congratulations! It looks like a dll was successfully created. I\ndon't see the DLL in the manage "
|
|
|
|
|
"system, so\nwould you like me to add it into the manage system for you?(HIGHLY recommended)");
|
|
|
|
|
if (MessageBox(buffer, "Congratulations", MB_YESNO) == IDYES) {
|
|
|
|
|
ddio_MakePath(buffer, LocalScriptDir, filename, NULL);
|
|
|
|
|
if (!cfexist(buffer)) {
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"I can't seem to find %s in your data\\scripts directory...Sorry,\nbut I can't automatically add it "
|
|
|
|
|
"for you.\nYou'll have to manually add %s into the manage system.",
|
|
|
|
|
filename, filename);
|
|
|
|
|
MessageBox(buffer, "Uh Oh!", MB_OK);
|
|
|
|
|
} else {
|
|
|
|
|
if (AddNewGameFile(buffer, "scripts")) {
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"%s has been added into the manage system. Don't forget to check it in to make sure it stays in "
|
|
|
|
|
"the\nmanage system!",
|
|
|
|
|
filename);
|
|
|
|
|
MessageBox(buffer, "Success", MB_OK);
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"There was a problem adding %s\ninto the manage system. You'll have\nto do it automatically.",
|
|
|
|
|
filename);
|
|
|
|
|
MessageBox(buffer, "Error", MB_OK);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(buffer, "Doh! Congratulations! You compiled the DLL successfully. However,\nI don't see it in the "
|
|
|
|
|
"manage system. I'd offer to add it\nautomatically for you, but you said NO to the\ndata "
|
|
|
|
|
"update. You'll have to add it manually.");
|
|
|
|
|
MessageBox(buffer, "Doh!", MB_OK);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnEditscript() {
|
|
|
|
|
CComboBox *combo = (CComboBox *)GetDlgItem(IDC_SELECTED_SCRIPT);
|
|
|
|
|
if (!combo)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
char tempbuf[_MAX_PATH], fullpath[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
int index = combo->GetCurSel();
|
|
|
|
|
combo->GetLBText(index, tempbuf);
|
|
|
|
|
|
|
|
|
|
if (m_ShowNonCheckedOut && (mng_FindTrackLock(tempbuf, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// display a warning that this file is not checked out
|
|
|
|
|
MessageBox("This file is NOT checked out, you'll lose all changes on your\nnext data update!", "Warning", MB_OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ddio_MakePath(fullpath, LocalScriptDir, tempbuf, NULL);
|
|
|
|
|
if (!cfexist(fullpath)) {
|
|
|
|
|
sprintf(tempbuf, "Weird, I couldn't find %s to open...", fullpath);
|
|
|
|
|
MessageBox(tempbuf, "Error", MB_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SHELLEXECUTEINFO sei;
|
|
|
|
|
|
|
|
|
|
sei.cbSize = sizeof(sei);
|
|
|
|
|
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
|
|
|
|
|
sei.hwnd = m_hWnd;
|
|
|
|
|
sei.lpVerb = "open";
|
|
|
|
|
sei.lpFile = fullpath;
|
|
|
|
|
sei.lpParameters = NULL;
|
|
|
|
|
sei.lpDirectory = LocalScriptDir;
|
|
|
|
|
sei.nShow = SW_NORMAL;
|
|
|
|
|
|
|
|
|
|
// int res = (int)ShellExecute(m_hWnd,"open",fullpath,NULL,LocalScriptDir,0);
|
|
|
|
|
int res;
|
|
|
|
|
|
|
|
|
|
ShellExecuteEx(&sei);
|
|
|
|
|
res = (int)sei.hInstApp;
|
|
|
|
|
|
|
|
|
|
if (res <= 32) {
|
|
|
|
|
char buffer[256];
|
|
|
|
|
switch (res) {
|
|
|
|
|
case 0:
|
|
|
|
|
strcpy(buffer, "The operating system is out of memory or resources.");
|
|
|
|
|
break;
|
|
|
|
|
case ERROR_FILE_NOT_FOUND:
|
|
|
|
|
strcpy(buffer, "The specified file was not found.");
|
|
|
|
|
break;
|
|
|
|
|
case ERROR_PATH_NOT_FOUND:
|
|
|
|
|
strcpy(buffer, "The specified path was not found.");
|
|
|
|
|
break;
|
|
|
|
|
case ERROR_BAD_FORMAT:
|
|
|
|
|
strcpy(buffer, "The .exe file is invalid (non-Win32<33> .exe or error in .exe image).");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_ACCESSDENIED:
|
|
|
|
|
strcpy(buffer, "The operating system denied access to the specified file.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_ASSOCINCOMPLETE:
|
|
|
|
|
strcpy(buffer, "The file name association is incomplete or invalid.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_DDEBUSY:
|
|
|
|
|
strcpy(buffer, "The DDE transaction could not be completed because other DDE transactions were being processed.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_DDEFAIL:
|
|
|
|
|
strcpy(buffer, "The DDE transaction failed.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_DDETIMEOUT:
|
|
|
|
|
strcpy(buffer, "The DDE transaction could not be completed because the request timed out.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_DLLNOTFOUND:
|
|
|
|
|
strcpy(buffer, "The specified dynamic-link library was not found.");
|
|
|
|
|
break;
|
|
|
|
|
// case SE_ERR_FNF:
|
|
|
|
|
// strcpy(buffer,"The specified file was not found.");
|
|
|
|
|
// break;
|
|
|
|
|
case SE_ERR_NOASSOC:
|
|
|
|
|
strcpy(buffer, "There is no application associated with the given file name extension.\nGet Jeff and he'll fix "
|
|
|
|
|
"this problem for you quickly and easily.");
|
|
|
|
|
break;
|
|
|
|
|
case SE_ERR_OOM:
|
|
|
|
|
strcpy(buffer, "There was not enough memory to complete the operation.");
|
|
|
|
|
break;
|
|
|
|
|
// case SE_ERR_PNF:
|
|
|
|
|
// strcpy(buffer,"The specified path was not found.");
|
|
|
|
|
// break;
|
|
|
|
|
case SE_ERR_SHARE:
|
|
|
|
|
strcpy(buffer, "A sharing violation occurred.");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
strcpy(buffer, "An unknown error occurred");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
MessageBox(buffer, "Error", MB_OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Scripts_need_sync = true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnCloseupSelectedScript() {
|
|
|
|
|
UpdateData(true);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Determining script type...");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int currsel = m_ScriptToCompile.GetCurSel();
|
|
|
|
|
if (currsel >= 0) {
|
|
|
|
|
m_ScriptToCompile.GetLBText(currsel, buffer);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
strcpy(LastScriptSelected, buffer);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
uint8_t type = DetermineScriptType(buffer);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
switch (type) {
|
|
|
|
|
case ST_GAME:
|
|
|
|
|
m_ScriptType = 0;
|
|
|
|
|
break;
|
|
|
|
|
case ST_LEVEL:
|
|
|
|
|
m_ScriptType = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
UpdateData(false);
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnSelchangeSelectedScript() { OnCloseupSelectedScript(); }
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateAvailableWithLevels() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_AVAILABLE);
|
|
|
|
|
if (!list)
|
|
|
|
|
return;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
list->ResetContent();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Updating available levels");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
for (int i = 0; i < MAX_GAMEFILES; i++) {
|
|
|
|
|
if (Gamefiles[i].used) {
|
|
|
|
|
// we're only adding .d3l's to this list
|
|
|
|
|
length = strlen(Gamefiles[i].name);
|
|
|
|
|
if (!stricmp(&Gamefiles[i].name[length - 4], ".d3l") &&
|
|
|
|
|
(mng_FindTrackLock(Gamefiles[i].name, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
strcpy(buffer, Gamefiles[i].name);
|
|
|
|
|
buffer[length - 4] = '\0';
|
|
|
|
|
list->AddString(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateAvailableWithScripts() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_AVAILABLE);
|
|
|
|
|
if (!list)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
list->ResetContent();
|
|
|
|
|
|
|
|
|
|
SetStatus("Updating available scripts");
|
|
|
|
|
|
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_GAMEFILES; i++) {
|
|
|
|
|
if (Gamefiles[i].used) {
|
|
|
|
|
// we're only adding .d3l's to this list
|
|
|
|
|
length = strlen(Gamefiles[i].name);
|
|
|
|
|
if (!stricmp(&Gamefiles[i].name[length - 4], ".cpp") &&
|
|
|
|
|
(mng_FindTrackLock(Gamefiles[i].name, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
strcpy(buffer, Gamefiles[i].name);
|
|
|
|
|
buffer[length - 4] = '\0';
|
|
|
|
|
list->AddString(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateCheckedOutWithLevels() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
if (!list)
|
|
|
|
|
return;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
list->ResetContent();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Updating checked out levels");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
for (int i = 0; i < MAX_TRACKLOCKS; i++) {
|
|
|
|
|
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
length = strlen(GlobalTrackLocks[i].name);
|
|
|
|
|
if (!stricmp(&GlobalTrackLocks[i].name[length - 4], ".d3l")) {
|
|
|
|
|
strcpy(buffer, GlobalTrackLocks[i].name);
|
|
|
|
|
buffer[length - 4] = '\0';
|
|
|
|
|
list->AddString(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateCheckedOutWithScripts() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
if (!list)
|
|
|
|
|
return;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
list->ResetContent();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Updating checked out scripts");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
for (int i = 0; i < MAX_TRACKLOCKS; i++) {
|
|
|
|
|
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
length = strlen(GlobalTrackLocks[i].name);
|
|
|
|
|
if (!stricmp(&GlobalTrackLocks[i].name[length - 4], ".cpp")) {
|
|
|
|
|
strcpy(buffer, GlobalTrackLocks[i].name);
|
|
|
|
|
buffer[length - 4] = '\0';
|
|
|
|
|
list->AddString(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateScriptListWithLevels() {
|
|
|
|
|
CComboBox *combo = (CComboBox *)GetDlgItem(IDC_SELECTED_SCRIPT);
|
|
|
|
|
if (!combo)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
combo->ResetContent();
|
|
|
|
|
|
|
|
|
|
SetStatus("Updating script list of level scripts");
|
|
|
|
|
|
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length, i;
|
|
|
|
|
|
|
|
|
|
if (m_ShowNonCheckedOut) {
|
|
|
|
|
for (i = 0; i < MAX_GAMEFILES; i++) {
|
|
|
|
|
if (Gamefiles[i].used) {
|
|
|
|
|
// look for d3l's
|
2024-07-19 22:14:36 +00:00
|
|
|
|
std::filesystem::path gamefile = std::filesystem::path(Gamefiles[i].name);
|
|
|
|
|
if (gamefile.extension() == ".d3l") {
|
2024-06-15 18:12:48 +00:00
|
|
|
|
// ok we have a d3l, look to see if there is a script available for it
|
2024-07-19 22:14:36 +00:00
|
|
|
|
gamefile.replace_extension(".cpp");
|
|
|
|
|
if (std::filesystem::is_regular_file(std::filesystem::path(LocalScriptDir) / gamefile)) {
|
|
|
|
|
combo->AddString(gamefile.u8string().c_str());
|
2024-06-15 18:12:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_TRACKLOCKS; i++) {
|
|
|
|
|
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
|
|
|
|
|
|
|
|
|
|
// look for checked out d3l's
|
|
|
|
|
length = strlen(GlobalTrackLocks[i].name);
|
|
|
|
|
|
|
|
|
|
if (length > 4 && !stricmp(&GlobalTrackLocks[i].name[length - 4], ".d3l")) {
|
|
|
|
|
strcpy(buffer, GlobalTrackLocks[i].name);
|
|
|
|
|
buffer[length - 4] = '\0';
|
|
|
|
|
strcat(buffer, ".cpp");
|
|
|
|
|
|
|
|
|
|
// ok we have a checked out d3l, look to see if there is a script available for it
|
|
|
|
|
for (int j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if (!stricmp(GlobalTrackLocks[j].name, buffer)) {
|
|
|
|
|
// we found a corresponding script...
|
|
|
|
|
combo->AddString(buffer);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (LastScriptSelected[0] != '\0' && cfexist(LastScriptSelected))
|
|
|
|
|
combo->SetCurSel(combo->FindStringExact(0, LastScriptSelected));
|
|
|
|
|
else
|
|
|
|
|
combo->SetCurSel(0);
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateScriptListWithScripts() {
|
|
|
|
|
CComboBox *combo = (CComboBox *)GetDlgItem(IDC_SELECTED_SCRIPT);
|
|
|
|
|
if (!combo)
|
|
|
|
|
return;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
combo->ResetContent();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Updating script list with scripts");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
int length, i;
|
|
|
|
|
|
|
|
|
|
if (m_ShowNonCheckedOut) {
|
2024-07-19 22:14:36 +00:00
|
|
|
|
ddio_DoForeachFile(std::filesystem::path(LocalScriptDir), std::regex(".+\\.cpp"), [&combo](const std::filesystem::path& path){
|
|
|
|
|
combo->AddString(path.filename().u8string().c_str());
|
|
|
|
|
});
|
2024-06-15 18:12:48 +00:00
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_TRACKLOCKS; i++) {
|
|
|
|
|
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
|
|
|
|
|
|
|
|
|
|
// look for checked out cpp's
|
|
|
|
|
length = strlen(GlobalTrackLocks[i].name);
|
|
|
|
|
|
|
|
|
|
if (length > 4 && !stricmp(&GlobalTrackLocks[i].name[length - 4], ".cpp")) {
|
|
|
|
|
strcpy(buffer, GlobalTrackLocks[i].name);
|
|
|
|
|
combo->AddString(buffer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (LastScriptSelected[0] != '\0' && cfexist(LastScriptSelected))
|
|
|
|
|
combo->SetCurSel(combo->FindStringExact(0, LastScriptSelected));
|
|
|
|
|
else
|
|
|
|
|
combo->SetCurSel(0);
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::UpdateDialog() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
|
|
|
|
|
CWnd *stat1, *stat2;
|
|
|
|
|
stat1 = (CWnd *)GetDlgItem(IDC_AVAILABLE_GRP);
|
|
|
|
|
stat2 = (CWnd *)GetDlgItem(IDC_CHECKEDOUT_GRP);
|
|
|
|
|
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
// we're working with levels & level scripts
|
|
|
|
|
UpdateAvailableWithLevels();
|
|
|
|
|
UpdateCheckedOutWithLevels();
|
|
|
|
|
UpdateScriptListWithLevels();
|
|
|
|
|
stat1->SetWindowText("Levels Available");
|
|
|
|
|
stat2->SetWindowText("Levels CheckedOut");
|
|
|
|
|
} else {
|
|
|
|
|
// we're working with game scripts
|
|
|
|
|
UpdateAvailableWithScripts();
|
|
|
|
|
UpdateCheckedOutWithScripts();
|
|
|
|
|
UpdateScriptListWithScripts();
|
|
|
|
|
stat1->SetWindowText("Scripts Available");
|
|
|
|
|
stat2->SetWindowText("Scripts CheckedOut");
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
BOOL CScriptLevelInterface::OnInitDialog() {
|
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
|
int value;
|
|
|
|
|
bool bvalue;
|
|
|
|
|
|
|
|
|
|
// restore settings
|
|
|
|
|
if (Database->read_int("EditorScriptViewType", &value)) {
|
|
|
|
|
m_ViewType = value;
|
|
|
|
|
} else {
|
|
|
|
|
m_ViewType = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Database->read_int("EditorScriptType", &value)) {
|
|
|
|
|
m_ScriptType = value;
|
|
|
|
|
} else {
|
|
|
|
|
m_ScriptType = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Database->read("EditorScriptShowNonCheckedOut", &bvalue)) {
|
|
|
|
|
m_ShowNonCheckedOut = bvalue;
|
|
|
|
|
} else {
|
|
|
|
|
m_ShowNonCheckedOut = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Database->read("EditorAutoCheckScriptsWithLevels", &bvalue)) {
|
|
|
|
|
m_AutoCheckScripts = bvalue;
|
|
|
|
|
} else {
|
|
|
|
|
m_AutoCheckScripts = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value = 256;
|
|
|
|
|
if (!Database->read("EditorLastScript", LastScriptSelected, &value)) {
|
|
|
|
|
LastScriptSelected[0] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateData(false);
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnAddnew() {
|
|
|
|
|
InCritical = true;
|
|
|
|
|
SetStatus("Adding new files");
|
|
|
|
|
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
// we're working with levels & level scripts
|
|
|
|
|
if (AddNewLevel())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
} else {
|
|
|
|
|
// we're working with game scripts
|
|
|
|
|
if (AddNewScript())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
InCritical = false;
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
Scripts_need_sync = true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnDelete() {
|
|
|
|
|
UpdateData(true);
|
|
|
|
|
InCritical = true;
|
|
|
|
|
SetStatus("Deleting files");
|
|
|
|
|
|
|
|
|
|
if (m_ViewType == 0) {
|
|
|
|
|
if (DeleteLevel())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
} else {
|
|
|
|
|
if (DeleteScript())
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InCritical = false;
|
|
|
|
|
SetStatus("Ready");
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnCreatescript() {
|
|
|
|
|
CCreateNewScriptDlg dlg;
|
|
|
|
|
|
|
|
|
|
if (dlg.DoModal()) {
|
|
|
|
|
int i;
|
|
|
|
|
char filename[_MAX_PATH];
|
|
|
|
|
strcpy(filename, dlg.m_Filename.GetBuffer(0));
|
|
|
|
|
|
|
|
|
|
// see if we should add this to the manage system
|
|
|
|
|
for (i = 0; i < MAX_GAMEFILES; i++) {
|
|
|
|
|
if (Gamefiles[i].used && (!stricmp(Gamefiles[i].name, filename))) {
|
|
|
|
|
// ok we found the file...no need to add it
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool on_network = false;
|
|
|
|
|
|
|
|
|
|
if (i < MAX_GAMEFILES || (mng_FindTrackLock(filename, PAGETYPE_GAMEFILE) != -1)) {
|
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"Just so you know, %s\nalready exists in the manage system, do you still want\nto create a new file of "
|
|
|
|
|
"the same name?",
|
|
|
|
|
filename);
|
|
|
|
|
on_network = true;
|
|
|
|
|
if (MessageBox(buffer, "Warning", MB_YESNO) != IDYES)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ScriptCreateEmptyScript(filename, (dlg.m_ScriptType == 0) ? ST_LEVEL : ST_GAME)) {
|
|
|
|
|
MessageBox("Unable to create file", "Error", MB_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool added_to_network = false;
|
|
|
|
|
|
|
|
|
|
// we never found the file in the manage system
|
|
|
|
|
if (!on_network) {
|
|
|
|
|
if (Network_up) {
|
|
|
|
|
char buffer[_MAX_PATH + 100];
|
|
|
|
|
sprintf(buffer, "Do you want to add\n%s\nto the network?", filename);
|
|
|
|
|
|
|
|
|
|
if (cfexist(filename) && MessageBox(buffer, "Add to Data", MB_YESNO) == IDYES) {
|
|
|
|
|
ddio_MakePath(buffer, LocalScriptDir, filename, NULL);
|
|
|
|
|
AddNewGameFile(buffer, "scripts");
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
added_to_network = true;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// doh! they didn't say yes
|
|
|
|
|
char buffer[_MAX_PATH];
|
|
|
|
|
sprintf(buffer, "I would ask you if you wanted to add the new\nscript to the manage system, but\nsince you "
|
|
|
|
|
"said no to the data update, you'll have\nto add it manually");
|
|
|
|
|
MessageBox(buffer, "Doh!", MB_OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// now auto-compile the DLL
|
|
|
|
|
SetStatus("Initial Compile");
|
|
|
|
|
tCompilerInfo ci;
|
|
|
|
|
ci.callback = CompileOutputCallback;
|
|
|
|
|
ci.script_type = (dlg.m_ScriptType == 0) ? ST_LEVEL : ST_GAME;
|
|
|
|
|
strcpy(ci.source_filename, filename);
|
|
|
|
|
CompileOutputWindow = (CEdit *)GetDlgItem(IDC_COMPILER_OUTPUT);
|
|
|
|
|
CompileOutputData = "";
|
|
|
|
|
ScriptCompile(&ci);
|
|
|
|
|
|
|
|
|
|
if (Network_up) {
|
|
|
|
|
SetStatus("Adding compiled script to manage system");
|
|
|
|
|
char dllname[_MAX_PATH], buffer[_MAX_PATH];
|
|
|
|
|
ddio_SplitPath(filename, NULL, dllname, NULL);
|
|
|
|
|
strcat(dllname, ".dll");
|
|
|
|
|
if (cfexist(dllname) && added_to_network) {
|
|
|
|
|
ddio_MakePath(buffer, LocalScriptDir, dllname, NULL);
|
|
|
|
|
AddNewGameFile(buffer, "scripts");
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetStatus("Auto-Checking in");
|
|
|
|
|
|
|
|
|
|
try_again:
|
|
|
|
|
if (!mng_MakeLocker())
|
|
|
|
|
goto try_again;
|
|
|
|
|
|
|
|
|
|
bool sscr = CheckInGamefile(filename, false);
|
|
|
|
|
bool cscr = CheckInGamefile(dllname, false);
|
|
|
|
|
|
|
|
|
|
SetStatus("Auto-Checking out");
|
|
|
|
|
if (sscr)
|
|
|
|
|
CheckOutGamefile(filename, false);
|
|
|
|
|
if (cscr)
|
|
|
|
|
CheckOutGamefile(dllname, false);
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnConfigcompiler() {
|
|
|
|
|
CVirtualCompilerConfig dlg;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
SetStatus("Configuring Compiler");
|
|
|
|
|
dlg.DoModal();
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnClose() {
|
|
|
|
|
if (InCritical)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CDialog::OnClose();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnDestroy() { CDialog::OnDestroy(); }
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnOK() {
|
|
|
|
|
UpdateData(true);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
// write out settings
|
|
|
|
|
Database->write("EditorScriptViewType", m_ViewType);
|
|
|
|
|
Database->write("EditorScriptType", m_ScriptType);
|
|
|
|
|
Database->write("EditorScriptShowNonCheckedOut", m_ShowNonCheckedOut);
|
|
|
|
|
Database->write("EditorLastScript", LastScriptSelected, strlen(LastScriptSelected) + 1);
|
|
|
|
|
Database->write("EditorAutoCheckScriptsWithLevels", m_AutoCheckScripts);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
CDialog::OnOK();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnMasscompile() {
|
|
|
|
|
CScriptMassCompile dlg;
|
|
|
|
|
SetStatus("Mass compiling scripts...");
|
|
|
|
|
dlg.DoModal();
|
|
|
|
|
UpdateDialog();
|
|
|
|
|
SetStatus("Ready");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
void CScriptLevelInterface::OnListNoncheckedOut() { UpdateDialog(); }
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
|
|
|
|
// ======================File Checkin/Checkout Functions======================
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::AddNewLevel(void) {
|
|
|
|
|
char filename[255];
|
|
|
|
|
|
|
|
|
|
if (!Network_up) {
|
|
|
|
|
OutrageMessageBox("You need to say Yes on the initial data update, in order to\nadd files\n");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
// Get the filename of the representing image
|
|
|
|
|
CString filter = "Descent III Levels (*.d3l)|*.d3l||";
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (!OpenFileDialog(this, (LPCTSTR)filter, filename, Current_files_dir, sizeof(Current_files_dir)))
|
|
|
|
|
return false;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
return AddNewGameFile(filename, "levels");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::AddNewScript(void) {
|
|
|
|
|
char filename[255];
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (!Network_up) {
|
|
|
|
|
OutrageMessageBox("You need to say Yes on the initial data update, in order to\nadd files\n");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
// Get the filename of the representing image
|
|
|
|
|
CString filter = "Descent III Script Source (*.cpp)|*.cpp|Descent III Compiled Script (*.dll)|*.dll||";
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (!OpenFileDialog(this, (LPCTSTR)filter, filename, Current_files_dir, sizeof(Current_files_dir)))
|
|
|
|
|
return false;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
return AddNewGameFile(filename, "scripts");
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool DeleteGamefile(char *tempbuffer) {
|
|
|
|
|
int tl;
|
|
|
|
|
mngs_Pagelock pl;
|
|
|
|
|
bool removed = false;
|
|
|
|
|
|
|
|
|
|
// verify that we have it locked
|
|
|
|
|
if ((tl = mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE)) == -1) {
|
|
|
|
|
OutrageMessageBox("%s is not yours to delete. Hmmm. Get Jeff", tempbuffer);
|
|
|
|
|
Int3();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(pl.name, tempbuffer);
|
|
|
|
|
pl.pagetype = PAGETYPE_GAMEFILE;
|
|
|
|
|
|
|
|
|
|
// Check to see if this is a local gamefile only. If so, only delete it locally
|
|
|
|
|
if (mng_CheckIfPageOwned(&pl, TableUser) != 1) {
|
|
|
|
|
mng_FreeTrackLock(tl);
|
|
|
|
|
if (!mng_DeletePage(tempbuffer, PAGETYPE_GAMEFILE, 1)) {
|
|
|
|
|
mprintf(0, ErrorString);
|
|
|
|
|
Int3();
|
|
|
|
|
} else {
|
|
|
|
|
removed = true;
|
|
|
|
|
}
|
2024-09-03 10:34:37 +00:00
|
|
|
|
} else { // if it is network, delete it from both the net and local drives
|
2024-06-15 18:12:48 +00:00
|
|
|
|
mng_FreeTrackLock(tl);
|
|
|
|
|
mng_DeletePage(tempbuffer, PAGETYPE_GAMEFILE, 1);
|
|
|
|
|
mng_DeletePage(tempbuffer, PAGETYPE_GAMEFILE, 0);
|
|
|
|
|
mng_DeletePagelock(tempbuffer, PAGETYPE_GAMEFILE);
|
|
|
|
|
removed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (removed) {
|
|
|
|
|
for (int gf = 0; gf < MAX_GAMEFILES; gf++) {
|
|
|
|
|
if (Gamefiles[gf].used && (!stricmp(tempbuffer, Gamefiles[gf].name))) {
|
|
|
|
|
FreeGamefile(gf);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool AddNewGameFile(char *fullpath, char *directory) {
|
|
|
|
|
char cur_name[100];
|
|
|
|
|
char pathname[100], name[100], extension[100];
|
|
|
|
|
int gamefile_handle;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (!Network_up) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Okay, we selected a file. Lets do what needs to be done here.
|
|
|
|
|
ddio_SplitPath(fullpath, pathname, name, extension);
|
|
|
|
|
sprintf(cur_name, "%s%s", name, extension);
|
|
|
|
|
|
|
|
|
|
if ((FindGamefileName(cur_name)) != -1) {
|
|
|
|
|
OutrageMessageBox("There is already a file with that name. Rename the file and then try to add it.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gamefile_handle = AllocGamefile();
|
|
|
|
|
|
|
|
|
|
strcpy(Gamefiles[gamefile_handle].name, cur_name);
|
|
|
|
|
strcpy(Gamefiles[gamefile_handle].dir_name, directory);
|
|
|
|
|
|
|
|
|
|
// Finally, save a local copy of the model/anim and alloc a tracklock
|
|
|
|
|
mprintf(0, "Making a copy of this file locally...\n");
|
|
|
|
|
|
|
|
|
|
char destname[100];
|
|
|
|
|
ddio_MakePath(destname, LocalD3Dir, "data", directory, Gamefiles[gamefile_handle].name, NULL);
|
|
|
|
|
if (stricmp(destname, fullpath)) // only copy if they are different
|
|
|
|
|
cf_CopyFile(destname, fullpath);
|
|
|
|
|
|
|
|
|
|
mng_AllocTrackLock(cur_name, PAGETYPE_GAMEFILE);
|
|
|
|
|
return true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CheckInGamefile(char *tempbuffer, bool show_ok_confirmation) {
|
|
|
|
|
mngs_Pagelock temp_pl;
|
|
|
|
|
int r, n;
|
|
|
|
|
|
|
|
|
|
for (n = 0; n < MAX_GAMEFILES; n++) {
|
|
|
|
|
if (Gamefiles[n].used && (!stricmp(Gamefiles[n].name, tempbuffer))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (n == MAX_GAMEFILES)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Make sure we own this gamefile
|
|
|
|
|
strcpy(temp_pl.name, Gamefiles[n].name);
|
|
|
|
|
temp_pl.pagetype = PAGETYPE_GAMEFILE;
|
|
|
|
|
|
|
|
|
|
r = mng_CheckIfPageOwned(&temp_pl, TableUser);
|
|
|
|
|
if (r < 0)
|
|
|
|
|
OutrageMessageBox(ErrorString);
|
|
|
|
|
else if (r == 0)
|
|
|
|
|
OutrageMessageBox(InfoString);
|
|
|
|
|
else {
|
|
|
|
|
// Change the pagelock state to UNLOCKED
|
|
|
|
|
strcpy(temp_pl.holder, "UNLOCKED");
|
|
|
|
|
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl)) {
|
|
|
|
|
AfxMessageBox(ErrorString, MB_OK);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
// Now actually replace the copy on the net with our local one
|
|
|
|
|
if (!mng_ReplacePage(Gamefiles[n].name, Gamefiles[n].name, n, PAGETYPE_GAMEFILE, 0))
|
|
|
|
|
OutrageMessageBox(ErrorString);
|
|
|
|
|
else {
|
|
|
|
|
// Save this gamefile file to the network for all
|
|
|
|
|
|
|
|
|
|
char destname[100], srcname[100];
|
|
|
|
|
|
|
|
|
|
ddio_MakePath(srcname, LocalD3Dir, "data", Gamefiles[n].dir_name, Gamefiles[n].name, NULL);
|
|
|
|
|
ddio_MakePath(destname, NetD3Dir, "data", Gamefiles[n].dir_name, Gamefiles[n].name, NULL);
|
|
|
|
|
|
|
|
|
|
cf_CopyFile(destname, srcname);
|
|
|
|
|
|
2024-09-03 10:34:37 +00:00
|
|
|
|
// Delete it from local pagefile if it is there
|
2024-06-15 18:12:48 +00:00
|
|
|
|
int dret = mng_DeletePage(Gamefiles[n].name, PAGETYPE_GAMEFILE, 1);
|
|
|
|
|
ASSERT(dret == 1);
|
|
|
|
|
|
|
|
|
|
// Free the tracklock
|
|
|
|
|
int p = mng_FindTrackLock(Gamefiles[n].name, PAGETYPE_GAMEFILE);
|
|
|
|
|
ASSERT(p != -1);
|
|
|
|
|
mng_FreeTrackLock(p);
|
|
|
|
|
|
|
|
|
|
if (show_ok_confirmation)
|
|
|
|
|
OutrageMessageBox("%s checked in.", tempbuffer);
|
|
|
|
|
|
2024-09-03 10:34:37 +00:00
|
|
|
|
// Make sure it is checked in
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (cf_Diff(destname, srcname)) {
|
|
|
|
|
ASSERT(1); // Get Jason! File didn't check in correctly!
|
|
|
|
|
cf_CopyFile(destname, srcname); // Do this so we can trace whats happening
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CheckOutGamefile(char *tempbuffer, bool show_ok_confirmation, bool report_who_has_locked) {
|
|
|
|
|
int n;
|
|
|
|
|
mngs_Pagelock temp_pl;
|
|
|
|
|
mngs_gamefile_page gamefilepage;
|
|
|
|
|
int r;
|
|
|
|
|
|
|
|
|
|
for (n = 0; n < MAX_GAMEFILES; n++) {
|
|
|
|
|
if (Gamefiles[n].used && (!stricmp(Gamefiles[n].name, tempbuffer))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (n == MAX_GAMEFILES)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Make sure it can be locked
|
|
|
|
|
strcpy(temp_pl.name, Gamefiles[n].name);
|
|
|
|
|
temp_pl.pagetype = PAGETYPE_GAMEFILE;
|
|
|
|
|
|
|
|
|
|
r = mng_CheckIfPageLocked(&temp_pl);
|
|
|
|
|
if (r == 2) {
|
|
|
|
|
int answer;
|
|
|
|
|
answer = OutrageMessageBox(MBOX_YESNO, "This page is not even in the table file, or the database maybe corrupt. "
|
|
|
|
|
"Override to 'Unlocked'? (Select NO if you don't know what you're doing)");
|
|
|
|
|
if (answer == IDYES) {
|
|
|
|
|
strcpy(temp_pl.holder, "UNLOCKED");
|
|
|
|
|
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl))
|
|
|
|
|
AfxMessageBox(ErrorString, MB_OK);
|
|
|
|
|
}
|
|
|
|
|
} else if (r < 0)
|
|
|
|
|
OutrageMessageBox(ErrorString);
|
|
|
|
|
else if (r == 1) {
|
|
|
|
|
if (report_who_has_locked)
|
|
|
|
|
OutrageMessageBox(InfoString);
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
// Everything is ok. Tell the network we're locking it and get a copy to
|
|
|
|
|
// our local drive
|
|
|
|
|
strcpy(temp_pl.holder, TableUser);
|
|
|
|
|
|
|
|
|
|
// Search thru the net pagefile and get a new copy in RAM in case anyone
|
|
|
|
|
// changed it since we started the editor
|
|
|
|
|
if (mng_FindSpecificGamefilePage(temp_pl.name, &gamefilepage, 0)) {
|
|
|
|
|
if (mng_AssignGamefilePageToGamefile(&gamefilepage, n)) {
|
|
|
|
|
if (!mng_ReplacePage(Gamefiles[n].name, Gamefiles[n].name, n, PAGETYPE_GAMEFILE, 1)) {
|
|
|
|
|
OutrageMessageBox("There was problem writing that page(%s) locally!", tempbuffer);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
if (!mng_ReplacePagelock(temp_pl.name, &temp_pl)) {
|
|
|
|
|
AfxMessageBox(ErrorString, MB_OK);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (show_ok_confirmation)
|
|
|
|
|
OutrageMessageBox("%s locked.", tempbuffer);
|
|
|
|
|
} else
|
|
|
|
|
OutrageMessageBox("There was a problem loading this gamefile(%s). You might encounter problems in dealing "
|
|
|
|
|
"with it. Good luck!",
|
|
|
|
|
tempbuffer);
|
|
|
|
|
|
|
|
|
|
mng_AllocTrackLock(Gamefiles[n].name, PAGETYPE_GAMEFILE);
|
|
|
|
|
} else
|
|
|
|
|
OutrageMessageBox("Couldn't find that gamefile(%s) in the table file!", tempbuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool UndoCheckOutGamefile(char *tempbuffer) {
|
|
|
|
|
int tl, n;
|
|
|
|
|
mngs_Pagelock pl;
|
|
|
|
|
mngs_gamefile_page gamefilepage;
|
|
|
|
|
|
|
|
|
|
for (n = 0; n < MAX_GAMEFILES; n++) {
|
|
|
|
|
if (Gamefiles[n].used && (!stricmp(Gamefiles[n].name, tempbuffer))) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (n == MAX_GAMEFILES)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Should have this item locked
|
|
|
|
|
if ((tl = mng_FindTrackLock(Gamefiles[n].name, PAGETYPE_GAMEFILE)) == -1)
|
|
|
|
|
return false;
|
|
|
|
|
|
2024-09-03 10:34:37 +00:00
|
|
|
|
// Make sure it is to be deleted
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if (OutrageMessageBox(MBOX_YESNO,
|
|
|
|
|
"Are you sure you want to undo your lock on %s and lose any changes you may have made?",
|
|
|
|
|
tempbuffer) != IDYES)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
strcpy(pl.name, Gamefiles[n].name);
|
|
|
|
|
pl.pagetype = PAGETYPE_GAMEFILE;
|
|
|
|
|
|
|
|
|
|
mng_FreeTrackLock(tl);
|
|
|
|
|
|
|
|
|
|
// Delete local page
|
|
|
|
|
if (!mng_DeletePage(Gamefiles[n].name, PAGETYPE_GAMEFILE, 1)) {
|
|
|
|
|
mprintf(0, ErrorString);
|
|
|
|
|
Int3();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get old data from net
|
|
|
|
|
if (!mng_FindSpecificGamefilePage(pl.name, &gamefilepage, 0)) {
|
|
|
|
|
Int3();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_AssignGamefilePageToGamefile(&gamefilepage, n)) {
|
|
|
|
|
Int3();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::DeleteLevel() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char buffer[_MAX_PATH + 200];
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".d3l");
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to delete
|
|
|
|
|
sprintf(buffer, "Are you sure you want to delete the level\n%s?", tempbuffer);
|
|
|
|
|
if (MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool script_also;
|
|
|
|
|
script_also = false;
|
|
|
|
|
|
|
|
|
|
// ok the level has been deleted, see if there is a corresponding .cpp file
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
sprintf(buffer, "A possible level script (%s) was found, do you want\nto remove this also?", tempbuffer);
|
|
|
|
|
if (m_AutoCheckScripts || MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer)) {
|
|
|
|
|
changed = true;
|
|
|
|
|
script_also = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
if (script_also) {
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::DeleteScript() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char buffer[_MAX_PATH + 200];
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to delete
|
|
|
|
|
sprintf(buffer, "Are you sure you want to delete script source file\n%s?", tempbuffer);
|
|
|
|
|
if (MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// removed also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Deleting: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (DeleteGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
|
}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::CheckInScripts() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to checkin
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::CheckInLevels() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char buffer[_MAX_PATH + 200];
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".d3l");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// go ahead and check in
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
bool script_also;
|
|
|
|
|
script_also = false;
|
|
|
|
|
|
|
|
|
|
// ok the level has been checked in, see if there is a corresponding .cpp file
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"A possible level script (%s) was found, do you want\nto check this in also? (HIGHLY recommended)",
|
|
|
|
|
tempbuffer);
|
|
|
|
|
if (m_AutoCheckScripts || MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false)) {
|
|
|
|
|
changed = true;
|
|
|
|
|
script_also = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
if (script_also) {
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking In: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckInGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::CheckOutScripts() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_AVAILABLE);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to checkin
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::CheckOutLevels() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_AVAILABLE);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char buffer[_MAX_PATH + 200];
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".d3l");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to checkin
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
bool script_also;
|
|
|
|
|
script_also = false;
|
|
|
|
|
|
|
|
|
|
// ok the level has been checked in, see if there is a corresponding .cpp file
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
sprintf(buffer,
|
|
|
|
|
"A possible level script (%s) was found, do you want\nto check this out also? (HIGHLY recommended)",
|
|
|
|
|
tempbuffer);
|
|
|
|
|
if (m_AutoCheckScripts || MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false)) {
|
|
|
|
|
changed = true;
|
|
|
|
|
script_also = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
if (script_also) {
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_GAMEFILES; j++) {
|
|
|
|
|
if ((Gamefiles[j].used) && (!stricmp(Gamefiles[j].name, tempbuffer)) &&
|
|
|
|
|
(mng_FindTrackLock(tempbuffer, PAGETYPE_GAMEFILE) == -1)) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked out also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "Checking Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (CheckOutGamefile(tempbuffer, false))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::UndoCheckOutScripts() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// this item is checked...we wish to checkin
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool CScriptLevelInterface::UndoCheckOutLevels() {
|
|
|
|
|
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
|
|
|
|
|
int listbox_size = list->GetCount();
|
|
|
|
|
int list_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
list_size++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list_size == 0)
|
|
|
|
|
return false;
|
|
|
|
|
int *index_map = (int *)mem_malloc(list_size * sizeof(int));
|
|
|
|
|
if (!index_map)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (i = 0; i < listbox_size; i++) {
|
|
|
|
|
if (list->GetCheck(i)) {
|
|
|
|
|
index_map[index] = i;
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mng_MakeLocker()) {
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
bool changed = false;
|
|
|
|
|
char buffer[_MAX_PATH + 200];
|
|
|
|
|
char tempbuffer[_MAX_PATH];
|
|
|
|
|
char savename[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < list_size; i++) {
|
|
|
|
|
index = index_map[i];
|
|
|
|
|
|
|
|
|
|
list->GetText(index, tempbuffer);
|
|
|
|
|
strcpy(savename, tempbuffer);
|
|
|
|
|
strcat(tempbuffer, ".d3l");
|
|
|
|
|
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
// go ahead and check in
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
|
|
|
|
|
bool script_also;
|
|
|
|
|
script_also = false;
|
|
|
|
|
|
|
|
|
|
// ok the level has been checked in, see if there is a corresponding .cpp file
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".cpp");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// checked in also...
|
|
|
|
|
sprintf(
|
|
|
|
|
buffer,
|
|
|
|
|
"A possible level script (%s) was found, do you want\nto undo this check out also? (HIGHLY recommended)",
|
|
|
|
|
tempbuffer);
|
|
|
|
|
if (m_AutoCheckScripts || MessageBox(buffer, "Friendly Warning", MB_YESNO) == IDYES) {
|
|
|
|
|
// go ahead and delete the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer)) {
|
|
|
|
|
changed = true;
|
|
|
|
|
script_also = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok, now see if there was a DLL too
|
|
|
|
|
if (script_also) {
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".dll");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and undo the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".msg");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and undo the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(tempbuffer, savename);
|
|
|
|
|
strcat(tempbuffer, ".str");
|
|
|
|
|
for (j = 0; j < MAX_TRACKLOCKS; j++) {
|
|
|
|
|
if ((GlobalTrackLocks[j].used) && (GlobalTrackLocks[j].pagetype == PAGETYPE_GAMEFILE) &&
|
|
|
|
|
(!stricmp(GlobalTrackLocks[j].name, tempbuffer))) {
|
|
|
|
|
// ok, we found a possibly matching script...ask if they want that
|
|
|
|
|
// undone also...
|
|
|
|
|
// go ahead and undo the sucker!
|
|
|
|
|
char t[256];
|
|
|
|
|
sprintf(t, "UndoCheck Out: %s", tempbuffer);
|
|
|
|
|
SetStatus(t);
|
|
|
|
|
|
|
|
|
|
if (UndoCheckOutGamefile(tempbuffer))
|
|
|
|
|
changed = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mng_EraseLocker();
|
|
|
|
|
mem_free(index_map);
|
|
|
|
|
|
|
|
|
|
return changed;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
// returns true if the given .cpp file is has an out of date dll (or non-existant). Working
|
|
|
|
|
// dir MUST be set to data\scripts before calling this function
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool IsScriptOutofDate(char *name) {
|
|
|
|
|
bool out_of_date = false;
|
|
|
|
|
|
|
|
|
|
HANDLE hFindFilecpp = INVALID_HANDLE_VALUE, hFindFiledll = INVALID_HANDLE_VALUE;
|
|
|
|
|
WIN32_FIND_DATA FindFileDatacpp, FindFileDatadll;
|
|
|
|
|
char fname[_MAX_PATH], ext[_MAX_EXT];
|
|
|
|
|
|
|
|
|
|
hFindFilecpp = FindFirstFile(name, &FindFileDatacpp);
|
|
|
|
|
if (hFindFilecpp != INVALID_HANDLE_VALUE) {
|
|
|
|
|
ddio_SplitPath(FindFileDatacpp.cFileName, NULL, fname, ext);
|
|
|
|
|
strcat(fname, ".dll");
|
|
|
|
|
|
|
|
|
|
hFindFiledll = FindFirstFile(fname, &FindFileDatadll);
|
|
|
|
|
if (hFindFiledll == INVALID_HANDLE_VALUE ||
|
|
|
|
|
CompareFileTime(&FindFileDatadll.ftLastWriteTime, &FindFileDatacpp.ftLastWriteTime) < 0) {
|
|
|
|
|
// out of date
|
|
|
|
|
out_of_date = true;
|
|
|
|
|
}
|
|
|
|
|
if (hFindFiledll != INVALID_HANDLE_VALUE)
|
|
|
|
|
FindClose(hFindFiledll);
|
|
|
|
|
hFindFiledll = INVALID_HANDLE_VALUE;
|
|
|
|
|
} else {
|
|
|
|
|
char error[_MAX_PATH];
|
|
|
|
|
sprintf(error, "'%s' not found", name);
|
|
|
|
|
AfxMessageBox(error);
|
|
|
|
|
out_of_date = true;
|
|
|
|
|
}
|
|
|
|
|
if (hFindFilecpp != INVALID_HANDLE_VALUE)
|
|
|
|
|
FindClose(hFindFilecpp);
|
|
|
|
|
hFindFilecpp = INVALID_HANDLE_VALUE;
|
|
|
|
|
|
|
|
|
|
return out_of_date;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include "module.h"
|
|
|
|
|
#include "osiris_share.h"
|
|
|
|
|
extern tOSIRISModuleInit Osiris_module_init;
|
2024-06-15 18:12:48 +00:00
|
|
|
|
typedef char(DLLFUNCCALL *InitializeDLL_fp)(tOSIRISModuleInit *function_list);
|
|
|
|
|
typedef void(DLLFUNCCALL *ShutdownDLL_fp)(void);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
|
|
|
|
// returns true if the given .cpp/.dll file is out of sync (or non-existant). Working directory
|
|
|
|
|
// doesn't necessarily have to be set to data\scripts.
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool IsScriptOutofSync(char *name) {
|
|
|
|
|
bool out_of_sync = false;
|
|
|
|
|
InitializeDLL_fp initdll;
|
|
|
|
|
ShutdownDLL_fp shutdowndll;
|
|
|
|
|
module mod;
|
|
|
|
|
|
|
|
|
|
char filename[_MAX_PATH], ext[_MAX_EXT];
|
|
|
|
|
char path[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
ddio_SplitPath(name, NULL, filename, ext);
|
|
|
|
|
|
|
|
|
|
Osiris_module_init.string_count = 0;
|
|
|
|
|
Osiris_module_init.string_table = NULL;
|
|
|
|
|
Osiris_module_init.module_is_static = false;
|
|
|
|
|
Osiris_module_init.module_identifier = 0;
|
|
|
|
|
Osiris_module_init.script_identifier = filename;
|
|
|
|
|
|
|
|
|
|
strcat(filename, ".dll");
|
|
|
|
|
ddio_MakePath(path, LocalScriptDir, filename, NULL);
|
|
|
|
|
mprintf(0, " Checking %s...", filename);
|
|
|
|
|
|
|
|
|
|
if (mod_LoadModule(&mod, path)) {
|
|
|
|
|
initdll = (InitializeDLL_fp)mod_GetSymbol(&mod, "InitializeDLL", 4);
|
|
|
|
|
if (initdll) {
|
|
|
|
|
if (!initdll(&Osiris_module_init)) {
|
|
|
|
|
// dll does not initialize...out of synce
|
|
|
|
|
out_of_sync = true;
|
|
|
|
|
mprintf(0, "OUT OF SYNC!\n");
|
|
|
|
|
} else {
|
|
|
|
|
mprintf(0, "Not Out of Sync\n");
|
|
|
|
|
shutdowndll = (ShutdownDLL_fp)mod_GetSymbol(&mod, "ShutdownDLL", 0);
|
|
|
|
|
if (shutdowndll) {
|
|
|
|
|
shutdowndll();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// unable to load
|
|
|
|
|
mprintf(0, "UNABLE TO GET INITIALIZEDLL\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mod_FreeModule(&mod);
|
|
|
|
|
} else {
|
|
|
|
|
mprintf(0, "MODULE NOT FOUND\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return out_of_sync;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Returns true if there are out of date script files (only checks those in manage system)
|
2024-06-15 18:12:48 +00:00
|
|
|
|
int AreScriptsOutofDate(void) {
|
|
|
|
|
if (Scripts_need_sync) {
|
|
|
|
|
CScriptSyncDialog dlg;
|
|
|
|
|
dlg.DoModal();
|
|
|
|
|
Scripts_need_sync = false;
|
|
|
|
|
return dlg.m_ErrorCount;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
int count = 0;
|
|
|
|
|
char old_dir[_MAX_PATH];
|
|
|
|
|
|
|
|
|
|
ddio_GetWorkingDir(old_dir,_MAX_PATH);
|
|
|
|
|
|
|
|
|
|
// First check for out-of-sync scripts (attempt load aigame and generic)
|
|
|
|
|
mprintf(0,"Checking for out of sync scripts...\n");
|
|
|
|
|
if(IsScriptOutofSync("aigame.dll")||IsScriptOutofSync("generic.dll"))
|
|
|
|
|
{
|
|
|
|
|
OutrageMessageBox(MBOX_OK,"WARNING! You have out of sync scripts...you MUST recompile your scripts!!!!!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mprintf(0,"Checking for out of date scripts...");
|
|
|
|
|
ddio_SetWorkingDir(LocalScriptDir);
|
|
|
|
|
|
|
|
|
|
for (int i=0;i<MAX_GAMEFILES;i++){
|
|
|
|
|
if (Gamefiles[i].used){
|
|
|
|
|
//we're only adding .d3l's to this list
|
|
|
|
|
int length = strlen(Gamefiles[i].name);
|
|
|
|
|
if(!stricmp(&Gamefiles[i].name[length-4],".cpp") && IsScriptOutofDate(Gamefiles[i].name)){
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ddio_SetWorkingDir(old_dir);
|
|
|
|
|
|
|
|
|
|
mprintf(0,"Found %d OOD scripts\n",count);
|
|
|
|
|
return count;
|
|
|
|
|
*/
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
#include "psglob.h"
|
|
|
|
|
class tFindInManage
|
|
|
|
|
{
|
|
|
|
|
public:
|
2024-06-15 18:12:48 +00:00
|
|
|
|
tFindInManage() {searching = false;}
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
bool searching;
|
|
|
|
|
bool in_Gamefiles;
|
|
|
|
|
int curr_index;
|
|
|
|
|
char glob_string[PAGENAME_LEN];
|
2024-04-19 20:58:24 +00:00
|
|
|
|
};
|
|
|
|
|
tFindInManage FindInManageData;
|
|
|
|
|
|
|
|
|
|
bool FindManageFirst(char *buffer,char *wildcard);
|
|
|
|
|
bool FindManageNext(char *buffer);
|
|
|
|
|
void FindManageClose(void);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool FindManageFirst(char *buffer,char *wildcard)
|
|
|
|
|
{
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if(FindInManageData.searching)
|
|
|
|
|
FindManageClose();
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
FindInManageData.searching = true;
|
|
|
|
|
strcpy(FindInManageData.glob_string,wildcard);
|
|
|
|
|
FindInManageData.curr_index = 0;
|
|
|
|
|
FindInManageData.in_Gamefiles = true;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
|
2024-06-15 18:12:48 +00:00
|
|
|
|
return FindManageNext(buffer);
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FindManageNext(char *buffer)
|
|
|
|
|
{
|
2024-06-15 18:12:48 +00:00
|
|
|
|
if(!FindInManageData.searching)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if(FindInManageData.in_Gamefiles)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
for(;FindInManageData.curr_index<MAX_GAMEFILES;FindInManageData.curr_index++)
|
|
|
|
|
{
|
|
|
|
|
if(Gamefiles[FindInManageData.curr_index].used &&
|
|
|
|
|
PSGlobMatch(FindInManageData.glob_string,Gamefiles[FindInManageData.curr_index].name,false,false))
|
|
|
|
|
{
|
|
|
|
|
//match
|
|
|
|
|
strcpy(buffer,Gamefiles[FindInManageData.curr_index].name);
|
|
|
|
|
FindInManageData.curr_index++;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FindInManageData.curr_index = 0;
|
|
|
|
|
FindInManageData.in_Gamefiles = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(;FindInManageData.curr_index<MAX_TRACKLOCKS;FindInManageData.curr_index++)
|
|
|
|
|
{
|
|
|
|
|
if(GlobalTrackLocks[FindInManageData.curr_index].used &&
|
|
|
|
|
GlobalTrackLocks[FindInManageData.curr_index].pagetype==PAGETYPE_GAMEFILE &&
|
|
|
|
|
PSGlobMatch(FindInManageData.glob_string,GlobalTrackLocks[FindInManageData.curr_index].name,false,false))
|
|
|
|
|
{
|
|
|
|
|
//match
|
|
|
|
|
strcpy(buffer,GlobalTrackLocks[FindInManageData.curr_index].name);
|
|
|
|
|
FindInManageData.curr_index++;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FindManageClose(void)
|
|
|
|
|
{
|
2024-06-15 18:12:48 +00:00
|
|
|
|
FindInManageData.searching = false;
|
2024-04-19 20:58:24 +00:00
|
|
|
|
}
|
2024-05-06 15:12:44 +00:00
|
|
|
|
*/
|