/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/editor/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 $
*
* 24 5/11/99 12:13p Jason
* added checks for messed up gamefiles
*
* 23 2/25/99 12:34p Jeff
* don't display message that someone has a file checked out during mass
* compile
*
* 22 2/24/99 9:39p Jeff
* only sync scripts when needed
*
* 21 2/23/99 11:52p Jeff
* new script dll sync dialog
*
* 20 2/21/99 8:04p Jeff
* better handling of out-of-sync scripts
*
* 19 2/18/99 8:29p Nate
* commented out some manage code
*
* 18 2/18/99 10:58a Jeff
* added a 'find in files' for gamefiles manage system
*
* 17 2/17/99 6:54p Jeff
* added check box for auto check in/out scripts with levels...fix
* checksum mprintf bug
*
* 16 2/09/99 4:43p Jeff
* fixed resource leak
*
* 15 2/01/99 11:55a Jeff
* automatically check in/out .msg and .str files
*
* 14 1/13/99 5:01p Jeff
* don't auto-checkin dll if the .cpp doesn't get checked in for a new
* file
*
* 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.
*
* 12 1/05/99 4:54p Jeff
* save the last script edited and set the on init
*
* 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
*
* 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)
*
* 9 12/20/98 9:57p Jeff
* added ability to display scripts not checked out. don't display
* message on checkin/out
*
* 8 12/18/98 12:11p Jeff
* created a function to determine a script's type and hooked it in
*
* 7 12/18/98 12:11p Jeff
* added mass script compile dialog
*
* 6 12/18/98 10:40a Jeff
* save out settings to registry
*
* 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.
*
* 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.
*
* 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.
*
* 2 12/11/98 5:50p Jeff
* implemented and added changes regarding Level&Scripting manage system
* and compiler interface
*
* $NoKeywords: $
*/
// ScriptLevelInterface.cpp : implementation file
//
#include
#include
#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
bool AddNewGameFile(char *fullpath, char *directory);
bool DeleteGamefile(char *tempbuffer);
bool CheckInGamefile(char *tempbuffer, bool giveok);
bool CheckOutGamefile(char *tempbuffer, bool show_ok_confirmation, bool report_who_has_locked = true);
char LastScriptSelected[256];
bool Scripts_need_sync = true;
/////////////////////////////////////////////////////////////////////////////
// CScriptLevelInterface dialog
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
InCritical = false;
}
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
}
BEGIN_MESSAGE_MAP(CScriptLevelInterface, CDialog)
//{{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
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScriptLevelInterface message handlers
void CScriptLevelInterface::SetStatus(const char *str) {
CWnd *wnd = (CWnd *)GetDlgItem(IDC_STATUS);
wnd->SetWindowText(str);
Descent->defer();
}
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;
}
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");
}
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;
}
void CScriptLevelInterface::OnRadioScripts() { UpdateDialog(); }
void CScriptLevelInterface::OnRadioLevels() { UpdateDialog(); }
CEdit *CompileOutputWindow;
CString CompileOutputData;
void CompileOutputCallback(char *str) {
CompileOutputData += str;
CompileOutputWindow->SetWindowText(CompileOutputData);
}
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);
}
}
}
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� .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;
}
void CScriptLevelInterface::OnCloseupSelectedScript() {
UpdateData(true);
SetStatus("Determining script type...");
char buffer[_MAX_PATH];
int currsel = m_ScriptToCompile.GetCurSel();
if (currsel >= 0) {
m_ScriptToCompile.GetLBText(currsel, buffer);
strcpy(LastScriptSelected, buffer);
uint8_t type = DetermineScriptType(buffer);
switch (type) {
case ST_GAME:
m_ScriptType = 0;
break;
case ST_LEVEL:
m_ScriptType = 1;
break;
}
UpdateData(false);
}
SetStatus("Ready");
}
void CScriptLevelInterface::OnSelchangeSelectedScript() { OnCloseupSelectedScript(); }
void CScriptLevelInterface::UpdateAvailableWithLevels() {
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_AVAILABLE);
if (!list)
return;
list->ResetContent();
SetStatus("Updating available levels");
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], ".d3l") &&
(mng_FindTrackLock(Gamefiles[i].name, PAGETYPE_GAMEFILE) == -1)) {
strcpy(buffer, Gamefiles[i].name);
buffer[length - 4] = '\0';
list->AddString(buffer);
}
}
}
SetStatus("Ready");
}
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");
}
void CScriptLevelInterface::UpdateCheckedOutWithLevels() {
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
if (!list)
return;
list->ResetContent();
SetStatus("Updating checked out levels");
char buffer[_MAX_PATH];
int length;
for (int i = 0; i < MAX_TRACKLOCKS; i++) {
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
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);
}
}
}
SetStatus("Ready");
}
void CScriptLevelInterface::UpdateCheckedOutWithScripts() {
CCheckListBox *list = (CCheckListBox *)GetDlgItem(IDC_LIST_CHECKEDOUT);
if (!list)
return;
list->ResetContent();
SetStatus("Updating checked out scripts");
char buffer[_MAX_PATH];
int length;
for (int i = 0; i < MAX_TRACKLOCKS; i++) {
if (GlobalTrackLocks[i].used && GlobalTrackLocks[i].pagetype == PAGETYPE_GAMEFILE) {
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);
}
}
}
SetStatus("Ready");
}
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
std::filesystem::path gamefile = std::filesystem::path(Gamefiles[i].name);
if (gamefile.extension() == ".d3l") {
// ok we have a d3l, look to see if there is a script available for it
gamefile.replace_extension(".cpp");
if (std::filesystem::is_regular_file(std::filesystem::path(LocalScriptDir) / gamefile)) {
combo->AddString(gamefile.u8string().c_str());
}
}
}
}
} 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");
}
void CScriptLevelInterface::UpdateScriptListWithScripts() {
CComboBox *combo = (CComboBox *)GetDlgItem(IDC_SELECTED_SCRIPT);
if (!combo)
return;
combo->ResetContent();
SetStatus("Updating script list with scripts");
char buffer[_MAX_PATH];
int length, i;
if (m_ShowNonCheckedOut) {
ddio_DoForeachFile(std::filesystem::path(LocalScriptDir), std::regex(".+\\.cpp"), [&combo](const std::filesystem::path& path){
combo->AddString(path.filename().u8string().c_str());
});
} 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");
}
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");
}
}
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;
}
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;
}
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");
}
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");
}
void CScriptLevelInterface::OnConfigcompiler() {
CVirtualCompilerConfig dlg;
SetStatus("Configuring Compiler");
dlg.DoModal();
SetStatus("Ready");
}
void CScriptLevelInterface::OnClose() {
if (InCritical)
return;
CDialog::OnClose();
}
void CScriptLevelInterface::OnDestroy() { CDialog::OnDestroy(); }
void CScriptLevelInterface::OnOK() {
UpdateData(true);
// 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);
CDialog::OnOK();
}
void CScriptLevelInterface::OnMasscompile() {
CScriptMassCompile dlg;
SetStatus("Mass compiling scripts...");
dlg.DoModal();
UpdateDialog();
SetStatus("Ready");
}
void CScriptLevelInterface::OnListNoncheckedOut() { UpdateDialog(); }
// ======================File Checkin/Checkout Functions======================
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;
}
// Get the filename of the representing image
CString filter = "Descent III Levels (*.d3l)|*.d3l||";
if (!OpenFileDialog(this, (LPCTSTR)filter, filename, Current_files_dir, sizeof(Current_files_dir)))
return false;
return AddNewGameFile(filename, "levels");
}
bool CScriptLevelInterface::AddNewScript(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;
}
// Get the filename of the representing image
CString filter = "Descent III Script Source (*.cpp)|*.cpp|Descent III Compiled Script (*.dll)|*.dll||";
if (!OpenFileDialog(this, (LPCTSTR)filter, filename, Current_files_dir, sizeof(Current_files_dir)))
return false;
return AddNewGameFile(filename, "scripts");
}
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;
}
} else { // if it is network, delete it from both the net and local drives
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;
}
bool AddNewGameFile(char *fullpath, char *directory) {
char cur_name[100];
char pathname[100], name[100], extension[100];
int gamefile_handle;
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;
}
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);
// Delete it from local pagefile if it is there
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);
// Make sure it is checked in
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;
}
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;
}
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;
// Make sure it is to be deleted
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
// 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
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;
}
#include "module.h"
#include "osiris_share.h"
extern tOSIRISModuleInit Osiris_module_init;
typedef char(DLLFUNCCALL *InitializeDLL_fp)(tOSIRISModuleInit *function_list);
typedef void(DLLFUNCCALL *ShutdownDLL_fp)(void);
// 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.
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;
}
// Returns true if there are out of date script files (only checks those in manage system)
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