Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
318 lines
7.9 KiB
C++
318 lines
7.9 KiB
C++
// FileDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "mw4gameed.h"
|
|
#include "FileDlg.h"
|
|
#include "ConfirmDlg.h"
|
|
#include <io.h>
|
|
#include <direct.h>
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileDlg dialog
|
|
extern CMW4GameEdApp theApp;
|
|
|
|
|
|
CFileDlg::CFileDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CFileDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CFileDlg)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CFileDlg::~CFileDlg()
|
|
{
|
|
}
|
|
|
|
void CFileDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CFileDlg)
|
|
DDX_Control(pDX, IDC_FILEDLGNUMOBJEDIT, m_NumObj);
|
|
DDX_Control(pDX, IDC_FILEDLGMAPNAMEEDIT, m_MapName);
|
|
DDX_Control(pDX, IDC_FILEDLGLIST, m_FileList);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CFileDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CFileDlg)
|
|
ON_BN_CLICKED(IDFILEDLGDELETE, OnFiledlgdelete)
|
|
ON_BN_CLICKED(IDFILEDLGOPEN, OnFiledlgopen)
|
|
ON_LBN_SELCHANGE(IDC_FILEDLGLIST, OnSelchangeFiledlglist)
|
|
ON_LBN_DBLCLK(IDC_FILEDLGLIST, OnDblclkFiledlglist)
|
|
ON_WM_CLOSE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileDlg message handlers
|
|
|
|
BOOL CFileDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
SetWindowText("Open Mission File");
|
|
((CButton*)(GetDlgItem(IDFILEDLGOPEN)))->ShowWindow(SW_SHOW);
|
|
/*
|
|
MString path = Working_Directory;
|
|
path += "\\Content\\Missions\\*.*";
|
|
Directory *directory;
|
|
directory = new Directory(path, true);
|
|
Check_Object(directory);
|
|
|
|
Stuff::IsolateDirectory(&path);
|
|
|
|
Check_Object(directory);
|
|
delete directory;
|
|
|
|
*/
|
|
LoadMissionList();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CFileDlg::LoadMissionList()
|
|
{
|
|
ClearListData();
|
|
|
|
|
|
Stuff::NotationFile build_file("Content\\MechWarrior4.build");
|
|
Page *core_page = build_file.FindPage("");
|
|
if (core_page)
|
|
{
|
|
Check_Object(core_page);
|
|
Page::NoteIterator *core_notes = core_page->MakeNoteIterator();
|
|
Check_Object(core_notes);
|
|
Note *core_note;
|
|
while ((core_note = core_notes->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(core_note);
|
|
NotationFile map_file;
|
|
core_note->GetEntry(&map_file);
|
|
Page *maps_page = map_file.FindPage("");
|
|
Check_Object(maps_page);
|
|
Page::NoteIterator *map_notes = maps_page->MakeNoteIterator();
|
|
Check_Object(map_notes);
|
|
Note *map_note;
|
|
while ((map_note = map_notes->ReadAndNext()) != NULL)
|
|
{
|
|
Check_Object(map_note);
|
|
NotationFile mission_file;
|
|
map_note->GetEntry(&mission_file);
|
|
Page *missions_page = mission_file.FindPage("");
|
|
if(missions_page)
|
|
{
|
|
Check_Object(missions_page);
|
|
Page::NoteIterator *mission_notes = missions_page->MakeNoteIterator();
|
|
Check_Object(mission_notes);
|
|
Note *mission_note;
|
|
while ((mission_note = mission_notes->ReadAndNext()) != NULL)
|
|
{
|
|
CString misname;
|
|
misname=mission_note->GetName();
|
|
misname=misname.Left(misname.ReverseFind('.'));
|
|
misname=misname.Mid(misname.ReverseFind('\\')+1);
|
|
int index = m_FileList.AddString(misname);
|
|
CString path;
|
|
char *p;
|
|
path.Format("Content\\Missions\\%s\\%s.instance",misname,misname);
|
|
p = new char[path.GetLength() + 1];
|
|
strcpy(p,(LPCSTR)path);
|
|
m_FileList.SetItemDataPtr(index,p);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void RemoveFolder(char* folderName)
|
|
{
|
|
struct _finddata_t file;
|
|
long hFile;
|
|
|
|
char path[MAX_PATH],fileName[MAX_PATH];
|
|
sprintf(path,"%s\\*.*",folderName);
|
|
|
|
if((hFile = _findfirst(path,&file)) != -1L)
|
|
{
|
|
do
|
|
{
|
|
if (file.name[0] == '.')
|
|
continue;
|
|
|
|
sprintf(fileName,"%s\\%s",folderName,file.name);
|
|
if (file.attrib & _A_SUBDIR)
|
|
{
|
|
RemoveFolder(fileName);
|
|
continue;
|
|
}
|
|
SetFileAttributes(fileName,FILE_ATTRIBUTE_NORMAL);
|
|
remove(fileName);
|
|
}
|
|
while(_findnext(hFile,&file) == 0);
|
|
|
|
_rmdir(folderName);
|
|
}
|
|
}
|
|
|
|
void CFileDlg::OnFiledlgdelete()
|
|
{
|
|
int authorization = 0;
|
|
char missionName[MAX_PATH];
|
|
m_FileList.GetText(m_FileList.GetCurSel(),missionName);
|
|
|
|
if (strstr(theApp.missionFileName,missionName))
|
|
{
|
|
if (MessageBox("If you delete the currently loaded file, you will not be able to save it afterwards. Are you sure you want to permenantly delete this file?", // Localize
|
|
"Mission Delete Warning",MB_YESNO) == IDNO)
|
|
{
|
|
return;
|
|
}
|
|
authorization = IDOK;
|
|
theApp.OnFileClose();
|
|
}
|
|
|
|
struct _finddata_t file;
|
|
long hFile;
|
|
|
|
if ((hFile = _findfirst("Content\\resources.build",&file)) == -1L)
|
|
STOP (("Could not find Content\\Resources.build. Please reinstall")); // Localize
|
|
|
|
if (file.attrib & _A_RDONLY)
|
|
{
|
|
if (MessageBox("Content\\resources.build is marked read only. Would you like to change the file to writable and continue?",
|
|
"Resource Error",MB_YESNO) == IDNO)
|
|
{
|
|
MessageBox("Unable to remove mission.","Mission Delete Error");
|
|
return;
|
|
}
|
|
SetFileAttributes("Content\\resources.build",FILE_ATTRIBUTE_NORMAL);
|
|
}
|
|
|
|
if (authorization == 0)
|
|
{
|
|
CConfirmDlg dlg(CONFIRM_FILEDELETE);
|
|
|
|
dlg.m_Title = "File Delete Confirmation"; // Localize
|
|
dlg.m_MessageText = "Are you sure you want to permanently remove this file?"; // Localize
|
|
authorization = dlg.DoModal();
|
|
}
|
|
if (authorization == IDOK)
|
|
{
|
|
char path[MAX_PATH];
|
|
sprintf(path,"Content\\Missions\\%s",missionName);
|
|
RemoveFolder(path);
|
|
|
|
LoadMissionList();
|
|
|
|
FILE* oldFile, *newFile;
|
|
|
|
if ((oldFile = fopen("Content\\Resources.build","r")) == NULL)
|
|
{
|
|
MessageBox("Unable to open Content\\Resource.build. The mission has been deleted but you will probably get a warning the next time you start.","Mission Delete Error"); // Localize
|
|
return;
|
|
}
|
|
if ((newFile = fopen("Content\\Resources.del","w")) == NULL)
|
|
{
|
|
MessageBox("Unable to create temperary file. The mission has been deleted but you will probably get a warning the next time you start.","Mission Delete Error"); // Localize
|
|
return;
|
|
}
|
|
char buffer[512];
|
|
do
|
|
{
|
|
fgets(buffer,511,oldFile);
|
|
if (feof(oldFile))
|
|
break;
|
|
|
|
if (strstr(strlwr(buffer),strlwr(missionName)) || buffer[0] == 10)
|
|
{
|
|
continue;
|
|
}
|
|
fputs(buffer,newFile);
|
|
}
|
|
while (1);
|
|
fclose(oldFile);
|
|
fclose(newFile);
|
|
remove("Content\\Resources.build");
|
|
rename("Content\\Resources.del","Content\\Resources.build");
|
|
}
|
|
}
|
|
|
|
void CFileDlg::OnFiledlgopen()
|
|
{
|
|
m_PathName = (char*)m_FileList.GetItemDataPtr(m_FileList.GetCurSel());
|
|
ClearListData();
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CFileDlg::OnSelchangeFiledlglist()
|
|
{
|
|
int index = m_FileList.GetCurSel();
|
|
char* path = (char*)m_FileList.GetItemDataPtr(index);
|
|
|
|
if (path)
|
|
{
|
|
NotationFile file(path);
|
|
|
|
char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT],contentFile[MAX_PATH];
|
|
const char* mapFile;
|
|
_splitpath(path,drive,dir,fname,ext);
|
|
_makepath(contentFile,drive,dir,fname,"contents");
|
|
|
|
Page *page = file.GetPage(fname);
|
|
Check_Object(page);
|
|
page->GetEntry("Map",&mapFile,true);
|
|
|
|
_splitpath(mapFile,drive,dir,fname,ext);
|
|
m_MapName.SetWindowText(fname);
|
|
|
|
NotationFile propFile(contentFile);
|
|
|
|
char numString[8];
|
|
NotationFile::PageIterator *pages = propFile.MakePageIterator();
|
|
Check_Object(pages);
|
|
m_NumObj.SetWindowText(itoa(pages->GetSize(),numString,10));
|
|
delete pages;
|
|
}
|
|
else
|
|
{
|
|
// You should never get here
|
|
MessageBox("Could not associate an instance file with that mission","File Error");
|
|
}
|
|
}
|
|
|
|
void CFileDlg::OnDblclkFiledlglist()
|
|
{
|
|
OnFiledlgopen();
|
|
}
|
|
|
|
char* CFileDlg::GetPathName()
|
|
{
|
|
return ((char*)LPCTSTR(m_PathName));
|
|
}
|
|
|
|
void CFileDlg::ClearListData()
|
|
{
|
|
while (m_FileList.GetCount())
|
|
{
|
|
char* path = (char*)m_FileList.GetItemDataPtr(0);
|
|
if (path)
|
|
delete [] path;
|
|
m_FileList.DeleteString(0);
|
|
}
|
|
}
|
|
|
|
void CFileDlg::OnCancel()
|
|
{
|
|
ClearListData();
|
|
CDialog::OnCancel();
|
|
}
|