Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS

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.
This commit is contained in:
Cyd
2026-06-24 21:28:16 -05:00
commit 2b8ca921cb
66341 changed files with 7923174 additions and 0 deletions
@@ -0,0 +1,637 @@
// DlgProject.cpp : implementation file
//
#include "stdafx.h"
#include "Multitron.h"
#include "DlgProject.h"
#include <imagelib\image.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgProject dialog
CDlgProject::CDlgProject(CWnd* pParent /*=NULL*/)
: CDialog(CDlgProject::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgProject)
//}}AFX_DATA_INIT
m_pNoteFile = NULL;
m_pDocument = (CMultitronDoc *)-1;
}
void CDlgProject::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgProject)
DDX_Control(pDX, IDC_TREE_DATA, m_wndTreeData);
DDX_Control(pDX, IDC_PREVIEW, m_wndPreview);
DDX_Control(pDX, IDC_LIST_HINTPAGE, m_wndListHintPage);
DDX_Control(pDX, IDC_COMBO_HINTFILENAME, m_wndComboHintFileName);
DDX_Control(pDX, IDC_TREE_FILES, m_wndTreeFiles);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgProject, CDialog)
//{{AFX_MSG_MAP(CDlgProject)
ON_CBN_SELENDOK(IDC_COMBO_HINTFILENAME, OnSelendokComboHintfilename)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_FILES, OnSelchangedTreeFiles)
ON_LBN_SELCHANGE(IDC_LIST_HINTPAGE, OnSelchangeListHintpage)
ON_WM_DRAWITEM()
ON_LBN_DBLCLK(IDC_LIST_HINTPAGE, OnDblclkListHintpage)
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_ADD_MEGATEXTURE, OnAddMegatexture)
ON_COMMAND(ID_ADD_TEXTUREHINT, OnAddTexturehint)
ON_COMMAND(ID_REMOVE_TEXTUREHINT, OnRemoveTexturehint)
ON_NOTIFY(NM_DBLCLK, IDC_TREE_DATA, OnDblclkTreeData)
ON_COMMAND(ID_OPEN_TEXTURE, OnOpenTexture)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgProject message handlers
int CDlgProject::AddItem(CFileNode *pNode,HTREEITEM hParent)
{
int count = 0;
if (pNode)
{
count++;
CString name = pNode->strName;
if (TVI_ROOT != hParent)
{
char fname[MAX_PATH];
_splitpath(name,NULL,NULL,fname,NULL);
name = fname;
}
HTREEITEM hItem = m_wndTreeFiles.InsertItem(name,hParent);
if (TVI_ROOT != hParent)
m_wndTreeFiles.SetItemData(hItem,(DWORD)pNode);
POSITION pos = pNode->listChildren.GetHeadPosition();
while (pos)
{
CFileNode *pChild = (CFileNode *)pNode->listChildren.GetNext(pos);
count += AddItem(pChild,hItem);
}
}
return count;
}
void CDlgProject::OnSelchangedTreeFiles(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CFileNode *pNode = (CFileNode *)pNMTreeView->itemNew.lParam;
m_wndComboHintFileName.ResetContent();
if (pNode)
{
int count = 0;
Stuff::NotationFile::PageIterator *pages = pNode->pFile->MakePageIterator();
Stuff::Page *page;
while (NULL != (page = pages->ReadAndNext()))
{
CString pagename = page->GetName();
Stuff::Page::NoteIterator *notes = page->MakeNoteIterator();
Stuff::Note *note;
while (NULL != (note = notes->ReadAndNext()))
{
const char *entry;
note->GetEntry(&entry);
int index = m_wndComboHintFileName.AddString(entry);
m_wndComboHintFileName.SetItemData(index,(DWORD)note);
// Set texturepool by default
if (0==stricmp(note->GetName(),"texturepool"))
{
count++;
m_wndComboHintFileName.SetCurSel(index);
}
}
delete notes;
/*
const char *entry;
if (page->GetEntry("texturepool",&entry))
{
count++;
int index = m_wndComboHintFileName.AddString(entry);
CString filename("content\\");
filename+=entry;
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
Stuff::NotationFile *pHintFile = pApp->GetHintFile(filename);
m_wndComboHintFileName.SetItemData(index,(DWORD)pHintFile);
}*/
}
delete pages;
if ((0==count)&&m_wndComboHintFileName.GetCount())
m_wndComboHintFileName.SetCurSel(0);
}
OnSelendokComboHintfilename();
*pResult = 0;
}
void CDlgProject::OnSelendokComboHintfilename()
{
m_wndListHintPage.ResetContent();
m_BackBuffer.DeleteObject();
m_wndPreview.Invalidate();
m_pNoteFile=NULL;
int sel = m_wndComboHintFileName.GetCurSel();
if (CB_ERR != sel)
{
Stuff::Note *pNote = (Stuff::Note *)m_wndComboHintFileName.GetItemData(sel);
if (pNote)
{
Check_Object(pNote);
const char *entry;
pNote->GetEntry(&entry);
CString filename("content\\");
filename+=entry;
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CMultitronDoc *pMDoc = (CMultitronDoc *)m_pDocument;
Stuff::NotationFile *pFile = pMDoc->GetHintFile(filename);
m_pNoteFile = pFile;
CString notename = pNote->GetName();
if (0==stricmp(notename,"texturepool"))
SetDataTexturepool(pFile);
else if (0==stricmp(notename,"data"))
SetDataBrowseNotation(pFile);
else if (0==stricmp(notename,"instance"))
SetDataBrowseNotation(pFile);
else if (0==stricmp(notename,"notation"))
SetDataBrowseNotation(pFile);
else
{
m_wndTreeData.ShowWindow(SW_HIDE);
m_wndListHintPage.ShowWindow(SW_HIDE);
}
DWORD attrib = GetFileAttributes(filename);
if (-1 != attrib)
{
if (attrib & FILE_ATTRIBUTE_READONLY)
{
CString str;
str.Format("%s is Read-Only. Would you like to enable write permission?",filename);
if (IDYES == MessageBox(str,"Read Hint File",MB_YESNO))
{
attrib &= ~FILE_ATTRIBUTE_READONLY;
SetFileAttributes(filename,attrib);
}
}
}
}
}
else
{
m_wndTreeData.ShowWindow(SW_HIDE);
m_wndListHintPage.ShowWindow(SW_HIDE);
}
}
void CDlgProject::OnSelchangeListHintpage()
{
int nCount = m_wndListHintPage.GetSelCount();
int *items = new int[nCount];
int err = m_wndListHintPage.GetSelItems(nCount,items);
CPtrList list;
for (int x=0;x<nCount;x++)
{
DWORD data = m_wndListHintPage.GetItemData(items[x]);
list.AddTail((LPVOID)data);
}
delete items;
m_BackBuffer.DeleteObject();
m_wndPreview.Invalidate();
Image image;
if (list.GetCount())
{
Stuff::Page *page = (Stuff::Page *)list.GetHead();
if (page)
{
CString imagename = page->GetName();
const char *entry;
if (page->GetEntry("Alias",&entry))
{
imagename = entry;
}
CString path = "content\\textures\\"+imagename;
image.Delete();
CString fullname = path+".png";
if (gos_DoesFileExist(fullname))
{
image.Load((char *)(LPCTSTR)fullname);
}
else
{
fullname = path+".tga";
if (gos_DoesFileExist(fullname))
{
image.Load((char *)(LPCTSTR)fullname);
}
else
{
return;
}
}
if(image.GetBpp()==32)
image.MaskTo(RGBMask(0x00ff0000,0x0000ff00,0x000000ff,0xff000000));
else
image.MaskTo(RGBMask(0x00ff0000,0x0000ff00,0x000000ff));
CDC memDC,*hfDC;
hfDC=GetDC();
BOOL bres;
bres=m_BackBuffer.CreateCompatibleBitmap(hfDC,image.GetWidth(),image.GetHeight());
Verify(bres);
memDC.CreateCompatibleDC(hfDC);
memDC.SelectObject(&m_BackBuffer);
BITMAPINFOHEADER bhd;
BITMAPINFO binf;
bhd.biSize=sizeof(BITMAPINFOHEADER);
bhd.biWidth=image.GetWidth(); bhd.biHeight=-image.GetHeight();
bhd.biPlanes=1;
bhd.biBitCount=image.GetBpp();
bhd.biCompression=BI_RGB;
bhd.biSizeImage=0;
bhd.biClrImportant=0;
binf.bmiHeader=bhd;
BYTE *imgdat=(BYTE *)(image.Lock());
DWORD isize = image.GetWidth()*image.GetHeight()*(image.GetBpp()>>3);
if (32==image.GetBpp())
{
m_BackBuffer.SetBitmapBits(isize,imgdat);
}
else
{
SetDIBitsToDevice(memDC,0,0,image.GetWidth(),
image.GetHeight(),0,0,0,image.GetWidth(),imgdat,
&binf,DIB_RGB_COLORS);
}
image.UnLock();
memDC.DeleteDC();
ReleaseDC(hfDC);
}
}
}
void CDlgProject::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
switch (lpDrawItemStruct->CtlID)
{
case IDC_PREVIEW:
{
HBITMAP hBitmap = m_BackBuffer;
if (hBitmap)
{
CDC memDC;
int res;
BITMAP bmp;
res=m_BackBuffer.GetBitmap(&bmp);
Verify(res);
BOOL bres;
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
bres=memDC.CreateCompatibleDC(pDC);
Verify(bres);
memDC.SelectObject(&m_BackBuffer);
CRect hfrct;
m_wndPreview.GetClientRect(&hfrct);
pDC->SetStretchBltMode(COLORONCOLOR);
bres=pDC->StretchBlt(0,0,hfrct.Width(),hfrct.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//bres=pDC->BitBlt(0,0,hfrct.Width(),hfrct.Height(),NULL,0,0,BLACKNESS);
//bres=pDC->BitBlt(0,0,hfrct.Width(),hfrct.Height(),&memDC,0,0,SRCCOPY);
Verify(bres);
memDC.DeleteDC();
}
return;
}
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CDlgProject::OnDblclkListHintpage()
{
OnOpenTexture();
}
void CDlgProject::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
int i = 0;
switch (pMenu->GetMenuItemCount())
{
case 4:i=2;break;
case 6:i=3;break;
case 10:i=4;break;
}
if (i)
{
CMenu *pSubMenu = pMenu->GetSubMenu(i);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x, point.y, this, NULL);
}
}
void CDlgProject::OnAddMegatexture()
{
int nCount = m_wndListHintPage.GetSelCount();
int *items = new int[nCount];
int err = m_wndListHintPage.GetSelItems(nCount,items);
CPtrList list;
for (int x=0;x<nCount;x++)
{
DWORD data = m_wndListHintPage.GetItemData(items[x]);
list.AddTail((LPVOID)data);
}
delete items;
if (0==nCount)
return;
Stuff::Page *page = (Stuff::Page *)list.GetHead();
Check_Object(page);
// Create a megatexture with the name of the first item with underscore first character
CString meganame = CString("_")+page->GetName();
int index = m_wndComboHintFileName.GetCurSel();
if (CB_ERR != index)
{
Stuff::NotationFile *pFile = m_pNoteFile;
if (pFile)
{
// Put all of the textures at 0 0 and let the TextureView arrange them
Stuff::Page *megapage = pFile->AddPage(meganame);
megapage->AppendEntry("PageSize","512 512");
POSITION pos = list.GetHeadPosition();
while (pos)
{
Stuff::Page *page = (Stuff::Page *)list.GetNext(pos);
Check_Object(page);
CString name = page->GetName();
const char *entry;
if (page->GetEntry("Alias",&entry))
{
name = entry;
}
megapage->AppendEntry(name,"");
}
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CDocTemplate *pTemplate = (CDocTemplate *)pApp->m_mapTemplate[ID_FILE_NEW];
pTemplate->OpenDocumentFile((LPCTSTR)megapage);
OnSelendokComboHintfilename();
int count = m_wndListHintPage.GetCount();
for (int x=0;x<count;x++)
{
LPVOID lp = (LPVOID)m_wndListHintPage.GetItemData(x);
if (lp == (LPVOID)megapage)
{
m_wndListHintPage.SetSel(x);
OnSelchangeListHintpage();
break;
}
}
}
}
}
void CDlgProject::OnAddTexturehint()
{
int index = m_wndComboHintFileName.GetCurSel();
if (CB_ERR != index)
{
Stuff::NotationFile *pFile = m_pNoteFile;
if (pFile)
{
CFileDialog dlg(true,".png","content\\textures\\*.*",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,"Image Files (*.png;*.tga)|*.png;*.tga||",AfxGetMainWnd());
if (IDOK == dlg.DoModal())
{
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CDocTemplate *pTemplate = (CDocTemplate *)pApp->m_mapTemplate[ID_FILE_NEW];
SetCurrentDirectory(pApp->m_strRunDir);
CPtrList list;
POSITION pos = dlg.GetStartPosition();
while (pos)
{
CString pathname = dlg.GetNextPathName(pos);
char name[MAX_PATH];
_splitpath(pathname,NULL,NULL,name,NULL);
Stuff::Page *page = pFile->AddPage(name);
list.AddTail((LPVOID)page);
pTemplate->OpenDocumentFile((LPCTSTR)page);
}
OnSelendokComboHintfilename();
int count = m_wndListHintPage.GetCount();
for (int x=0;x<count;x++)
{
LPVOID lp = (LPVOID)m_wndListHintPage.GetItemData(x);
pos = list.Find(lp);
if (pos)
{
list.RemoveAt(pos);
m_wndListHintPage.SetSel(x);
}
if (list.GetCount()==0)
break;
}
OnSelchangeListHintpage();
}
}
}
}
void CDlgProject::OnRemoveTexturehint()
{
int index = m_wndComboHintFileName.GetCurSel();
if (CB_ERR != index)
{
Stuff::NotationFile *pFile = m_pNoteFile;
if (pFile)
{
CMultitronDoc *pDoc = (CMultitronDoc *)m_pDocument;
int nCount = m_wndListHintPage.GetSelCount();
int *items = new int[nCount];
int err = m_wndListHintPage.GetSelItems(nCount,items);
for (int x=0;x<nCount;x++)
{
Stuff::Page *page = (Stuff::Page *)m_wndListHintPage.GetItemData(items[x]);
Check_Object(page);
pDoc->RemoveTexture(page);
}
delete items;
pDoc->UpdateAllViews(NULL);
}
}
}
int CDlgProject::SetDataTexturepool(Stuff::NotationFile *pFile)
{
m_wndListHintPage.ResetContent();
m_wndListHintPage.ShowWindow(SW_SHOW);
m_wndTreeData.ShowWindow(SW_HIDE);
Stuff::NotationFile::PageIterator *pages = pFile->MakePageIterator();
Stuff::Page *page;
while (NULL != (page = pages->ReadAndNext()))
{
CString pagename = page->GetName();
int index = m_wndListHintPage.AddString(pagename);
m_wndListHintPage.SetItemData(index,(DWORD)page);
}
delete pages;
return 0;
}
int CDlgProject::SetDataBrowseNotation(Stuff::NotationFile *pFile)
{
m_wndTreeData.DeleteAllItems();
m_wndTreeData.ShowWindow(SW_SHOW);
m_wndListHintPage.ShowWindow(SW_HIDE);
Stuff::NotationFile::PageIterator *pages = pFile->MakePageIterator();
Stuff::Page *page;
while (NULL != (page = pages->ReadAndNext()))
{
CString pagename = page->GetName();
HTREEITEM hPage = m_wndTreeData.InsertItem(pagename,TVI_ROOT);
m_wndTreeData.SetItemData(hPage,(DWORD)page);
Stuff::Page::NoteIterator *notes = page->MakeNoteIterator();
Stuff::Note *note;
while (NULL != (note = notes->ReadAndNext()))
{
CString notename = note->GetName();
const char *entry;
note->GetEntry(&entry);
CString str;
str.Format("%s=%s",notename,entry);
HTREEITEM hNote = m_wndTreeData.InsertItem(str,hPage);
m_wndTreeData.SetItemData(hNote,(DWORD)note);
}
delete notes;
m_wndTreeData.Expand(hPage,TVE_EXPAND);
}
delete pages;
return 0;
}
void CDlgProject::OnDblclkTreeData(NMHDR* pNMHDR, LRESULT* pResult)
{
OnOpenTexture();
*pResult = 0;
}
CDocument *CDlgProject::SetDocument(CMultitronDoc *pDoc)
{
BOOL bReset = true;
if (pDoc == m_pDocument)
bReset = false;
CMultitronDoc *pBack = m_pDocument;
if (-1 != (DWORD)pDoc)
m_pDocument = pDoc;
else
{
bReset = false;
}
if (m_wndTreeFiles.GetSafeHwnd())
{
if (bReset)
m_wndTreeFiles.DeleteAllItems();
if (pDoc)
{
if (bReset)
{
CFileNode *pNode = m_pDocument->GetFileNode();
AddItem(pNode);
}
OnSelendokComboHintfilename();
}
}
return pBack;
}
void CDlgProject::OnOpenTexture()
{
if (m_wndListHintPage.GetSafeHwnd())
{
CDocument *pDoc = NULL;
int nCount = m_wndListHintPage.GetSelCount();
if (nCount)
{
int *items = new int[nCount];
int err = m_wndListHintPage.GetSelItems(nCount,items);
for (int x=0;x<nCount;x++)
{
DWORD data = m_wndListHintPage.GetItemData(items[x]);
if (0==x)
pDoc = m_pDocument->OpenTexture((Stuff::Page *)data);
else
pDoc->SetPathName((LPCTSTR)data);
}
delete items;
}
if (pDoc)
pDoc->UpdateAllViews(NULL);
}
if (m_wndTreeData.GetSafeHwnd())
{
HTREEITEM hItem = m_wndTreeData.GetSelectedItem();
if (hItem)
{
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CDocTemplate *pTemplate = (CDocTemplate *)pApp->m_mapTemplate[ID_FILE_NEW_NOTEFILE];
DWORD data = m_wndTreeData.GetItemData(hItem);
if (data)
pTemplate->OpenDocumentFile((LPCTSTR)data);
}
}
m_pDocument->UpdateAllViews(NULL);
}