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.
551 lines
14 KiB
C++
551 lines
14 KiB
C++
// ChildView.cpp : implementation of the CChildView class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "mw4print.h"
|
|
#include "ChildView.h"
|
|
#include "cspcfd.h"
|
|
|
|
#include "MechLabHeaders.h"
|
|
#include "GameTypes.h"
|
|
|
|
#include "mw4dummy.h"
|
|
#include "recscore.h"
|
|
typedef unsigned long UINT4;
|
|
typedef unsigned char* POINTER;
|
|
#include "logreport.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "mw4dummy.cpp"
|
|
#include "recscore.cpp"
|
|
#include "logreport.cpp"
|
|
|
|
#define IDT_TIMER 1000
|
|
|
|
BEGIN_MESSAGE_MAP(CChildView,CWnd )
|
|
//{{AFX_MSG_MAP(CChildView)
|
|
ON_WM_PAINT()
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_TIMER()
|
|
//}}AFX_MSG_MAP
|
|
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
|
|
ON_COMMAND(ID_FILE_LOGREPORT, OnFileLogReport)
|
|
ON_COMMAND(ID_FILE_LOG2DATES, OnFileLog2Dates)
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_MESSAGE_MAP(CDlgGet2Dates, CDialog)
|
|
//{{AFX_MSG_MAP(CDlgGet2Dates)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
bool _stdcall RunExec(const CStr& strExec)
|
|
{
|
|
if (strExec.GetLength() > 0) {
|
|
CStr strDir;
|
|
int nStart = 0, nLen;
|
|
const char* pcszExec = strExec.String();
|
|
if (*pcszExec == '"') {
|
|
nStart++;
|
|
nLen = strExec.Find('"');
|
|
if (nLen != -1) {
|
|
nLen--;
|
|
}
|
|
} else {
|
|
nLen = strExec.Find(' ');
|
|
}
|
|
strDir.Assign(&pcszExec[nStart], nLen);
|
|
strDir.AsDirectory(TRUE);
|
|
|
|
char szBuf[512];
|
|
strcpy(szBuf, strExec.String());
|
|
STARTUPINFO si;
|
|
memset(&si, 0, sizeof(si));
|
|
si.cb = sizeof(si);
|
|
si.dwX = si.dwY = si.dwXSize = si.dwYSize = CW_USEDEFAULT;
|
|
PROCESS_INFORMATION pi;
|
|
|
|
return !!CreateProcess(NULL, szBuf, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP | HIGH_PRIORITY_CLASS, NULL, strDir.String(), &si, &pi);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
CMyPrintInfo::CMyPrintInfo(const char* pcszFile, bool bIncludeBot)
|
|
: m_strFile(pcszFile), m_bIncludeBot(bIncludeBot), m_bPrinted(false)
|
|
{
|
|
}
|
|
|
|
CLogInfo::CLogInfo()
|
|
{
|
|
m_nState = 1; // 0: no error(ok!!!), 1: (@err=1), error, 2: launched(@Launched=1)...
|
|
m_strTime = 0; // Time=%02d:%02d
|
|
m_nPlayerCount = 0; // Player Count=%d
|
|
}
|
|
|
|
CLogResult::CLogResult()
|
|
{
|
|
m_nTotalPlayers = 0;
|
|
m_nGames = 0;
|
|
m_nUnfinished = 0;
|
|
m_nErrGames = 0;
|
|
m_dwRet = 0;
|
|
}
|
|
|
|
void CLogResult::GetLogResult(const CString& str)
|
|
{
|
|
m_nGames = 0, m_nTotalPlayers = 0, m_nUnfinished = 0, m_nErrGames = 0;
|
|
m_dwRet = 0;
|
|
|
|
SLogReport* pRPT = SLogReport::OpenLogReport(str, *(SYSTEMTIME*)NULL, FALSE);
|
|
if (pRPT) {
|
|
SLogItem* pStart = pRPT->GetFirst();
|
|
SLogItem* pEnd = pRPT->GetLast();
|
|
while(pStart < pEnd)
|
|
{
|
|
if ((0 < pStart->m_nPlayers) && (pStart->m_nPlayers <= 16)) {
|
|
if (pStart->m_nLaunched) {
|
|
m_nUnfinished++;
|
|
} else if (pStart->m_nErr) {
|
|
m_nErrGames++;
|
|
} else {
|
|
m_nGames++;
|
|
m_nTotalPlayers += pStart->m_nPlayers;
|
|
}
|
|
}
|
|
pStart = pStart->GetNext();
|
|
}
|
|
} else {
|
|
CStr strFile(str);
|
|
|
|
strFile.ChangeExt(".log", TRUE);
|
|
|
|
int nBufferSize = (36 + 1) * 2000;
|
|
char* psz = (char*)malloc(nBufferSize);
|
|
DoLogReport(strFile, psz, nBufferSize);
|
|
free(psz);
|
|
}
|
|
if (pRPT) {
|
|
m_dwRet = pRPT->m_dwSigns;
|
|
SLogReport::FreeLogReport(pRPT);
|
|
}
|
|
}
|
|
|
|
void CLogResult::DoLogReport(const CStr& str, char* psz, int nBufferSize)
|
|
{
|
|
TARRAYREF(CLogInfo) aLogs;
|
|
char szBuf[256];
|
|
|
|
GetPrivateProfileString(NULL, NULL, "", psz, nBufferSize, str);
|
|
while(*psz)
|
|
{
|
|
int nPlayerCount = GetPrivateProfileInt(psz, "Player Count", 0, str);
|
|
if ((0 < nPlayerCount) && (nPlayerCount <= 16)) {
|
|
int nState;
|
|
if (GetPrivateProfileInt(psz, "@err", 0, str)) {
|
|
nState = 1;
|
|
} else if (GetPrivateProfileInt(psz, "@Launched", 0, str)) {
|
|
nState = 2;
|
|
} else {
|
|
nState = 0;
|
|
}
|
|
GetPrivateProfileString(psz, "Time", "", szBuf, sizeof(szBuf), str);
|
|
CLogInfo& log = aLogs.Add();
|
|
log.m_nState = nState;
|
|
log.m_strTime = szBuf;
|
|
log.m_nPlayerCount = nPlayerCount;
|
|
}
|
|
psz = &psz[strlen(psz) + 1];
|
|
}
|
|
int i, nSize = aLogs.GetSize();
|
|
|
|
for(i = 0; i < nSize; i++)
|
|
{
|
|
const CLogInfo& log = aLogs.GetAt(i);
|
|
if (log.m_nState == 2) {
|
|
m_nUnfinished++;
|
|
} else if (log.m_nState == 1) {
|
|
m_nErrGames++;
|
|
} else {
|
|
ASSERT(log.m_nState == 0);
|
|
m_nGames++;
|
|
m_nTotalPlayers += log.m_nPlayerCount;
|
|
}
|
|
}
|
|
}
|
|
|
|
CShortDate::CShortDate(const CTime& t)
|
|
{
|
|
m_nYear = t.GetYear();
|
|
m_nMonth = t.GetMonth();
|
|
m_nDay = t.GetDay();
|
|
}
|
|
|
|
int CShortDate::Compare(const CShortDate& that)
|
|
{
|
|
ASSERT(this && &that);
|
|
|
|
int nDif;
|
|
|
|
nDif = m_nYear - that.m_nYear;
|
|
if (nDif == 0) {
|
|
nDif = m_nMonth - that.m_nMonth;
|
|
if (nDif == 0) {
|
|
nDif = m_nDay - that.m_nDay;
|
|
}
|
|
}
|
|
|
|
return nDif;
|
|
}
|
|
|
|
void CShortDate::IncADay()
|
|
{
|
|
int nDayEnd = GetDayEnd(m_nYear, m_nMonth);
|
|
if (++m_nDay >= nDayEnd) {
|
|
m_nDay = 1;
|
|
if (++m_nMonth >= 12) {
|
|
m_nMonth = 1;
|
|
m_nYear++;
|
|
}
|
|
}
|
|
}
|
|
|
|
CDlgGet2Dates::CDlgGet2Dates(SYSTEMTIME& SysTime, CWnd* pParent /*=NULL*/)
|
|
: CDialog(CDlgGet2Dates::IDD, pParent), m_Start(SysTime), m_End(SysTime)
|
|
{
|
|
//{{AFX_DATA_INIT(CDlgGet2Dates)
|
|
//}}AFX_DATA_INIT
|
|
//m_Start = 0;
|
|
//m_End = 0;
|
|
}
|
|
|
|
void CDlgGet2Dates::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDlgGet2Dates)
|
|
//}}AFX_DATA_MAP
|
|
DDX_DateTimeCtrl(pDX, IDC_DNT_END, m_End);
|
|
DDX_DateTimeCtrl(pDX, IDC_DNT_START, m_Start);
|
|
}
|
|
|
|
BOOL CDlgGet2Dates::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
CChildView::CChildView()
|
|
{
|
|
m_uTimer = 0;
|
|
}
|
|
|
|
CChildView::~CChildView()
|
|
{
|
|
}
|
|
|
|
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
if (!CWnd::PreCreateWindow(cs))
|
|
return FALSE;
|
|
|
|
cs.dwExStyle |= WS_EX_CLIENTEDGE;
|
|
cs.style &= ~WS_BORDER;
|
|
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
|
|
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CChildView::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
// TODO: Add your message handler code here
|
|
|
|
// Do not call CWnd::OnPaint() for painting messages
|
|
}
|
|
|
|
bool CChildView::DoCopyData(HWND hwnd, const MW4PRINT_COPYDATASTRUCT& cd)
|
|
{
|
|
hWindow = m_hWnd;
|
|
if ((cd.dwData == MW4PRINT_COPYDATA_META) && (cd.cbData == sizeof(cd) - sizeof(COPYDATASTRUCT)) && cd.lpData) {
|
|
const GUID& guid = *(const GUID*)cd.lpData; // do not use cd.m_GUID
|
|
const char* pcsz = (const char*)&(&guid)[1]; // do not use cd.m_szFile
|
|
|
|
#ifdef _DEBUG
|
|
g_bPRTest = true;
|
|
#else // _DEBUG
|
|
g_bPRTest = false;
|
|
#endif // _DEBUG
|
|
CMyPrintInfo* p = new CMyPrintInfo(pcsz, g_bPRTest);
|
|
m_lstMPIs.AddTail(p);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd ::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
m_uTimer = SetTimer(IDT_TIMER, 1 * 1000, NULL);
|
|
if (!m_uTimer)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CChildView::OnDestroy()
|
|
{
|
|
if (m_uTimer) {
|
|
KillTimer(m_uTimer);
|
|
m_uTimer = 0;
|
|
}
|
|
CWnd ::OnDestroy();
|
|
}
|
|
|
|
void CChildView::OnTimer(UINT nIDEvent)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
if (nIDEvent == IDT_TIMER) {
|
|
CMyPrintInfo* p = m_lstMPIs.GetHead();
|
|
while(p) {
|
|
if (!p->m_bPrinted) {
|
|
hWindow = m_hWnd;
|
|
g_bPRTest = p->m_bIncludeBot;
|
|
if (g_RSF.LoadPR(p->m_strFile)) {
|
|
int nErr = g_RSF.DoPrint();
|
|
if (nErr == 0) {
|
|
p->m_bPrinted = true;
|
|
m_lstMPIs.Cut(p);
|
|
delete p;
|
|
}
|
|
}
|
|
g_RSF.Reset();
|
|
break;
|
|
}
|
|
p = p->m_pNext;
|
|
}
|
|
}
|
|
|
|
CWnd ::OnTimer(nIDEvent);
|
|
}
|
|
|
|
void CChildView::OnFileOpen()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
const char* pcszFilters = "Battle Tech Print File(*.pr)|*.pr|All Files(*.*)|*.*|";
|
|
CSpcFileDialog FD(TRUE, ".pr", NULL, OFN_HIDEREADONLY, pcszFilters, this);
|
|
FD.SetTitle("Open : *.Pr");
|
|
FD.SetFilterIndex(1);
|
|
FD.EnableHook("Include &Bot");
|
|
//FD.SetCustomFilter();
|
|
if (FD.DoModal() == IDOK) {
|
|
#ifdef _DEBUG
|
|
g_bPRTest = true;
|
|
#else // !_DEBUG
|
|
g_bPRTest = (FD.m_ofn.Flags & OFN_READONLY) ? true: false;
|
|
#endif // _DEBUG
|
|
CString str(FD.GetPathName());
|
|
CMyPrintInfo* p = new CMyPrintInfo(str, g_bPRTest);
|
|
m_lstMPIs.AddTail(p);
|
|
}
|
|
}
|
|
|
|
void CChildView::OnFileLogReport()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
SYSTEMTIME SysTime;
|
|
GetLocalTime(&SysTime); // GetSystemTime
|
|
|
|
char szPath[MAX_PATH];
|
|
|
|
AdjustSysTimeForLog(SysTime);
|
|
sprintf(szPath, "c:\\mw4files\\%02d_%02d_%d.rpt", SysTime.wMonth, SysTime.wDay, SysTime.wYear);
|
|
|
|
const char* pcszFilters = "Battle Tech Report File(*.rpt)|*.rpt|All Files(*.*)|*.*|";
|
|
CSpcFileDialog FD(TRUE, ".rpt", szPath, OFN_HIDEREADONLY, pcszFilters, this);
|
|
FD.SetTitle("Open : *.Rpt");
|
|
FD.SetFilterIndex(1);
|
|
if (FD.DoModal() == IDOK) {
|
|
CString str(FD.GetPathName());
|
|
|
|
CLogResult lr;
|
|
|
|
lr.GetLogResult(str);
|
|
|
|
int nPos = str.ReverseFind('\\');
|
|
if (nPos == -1) {
|
|
nPos = str.ReverseFind('/');
|
|
}
|
|
CStr strFile(&((const char*)str)[nPos + 1]);
|
|
strFile.ChangeExt("", TRUE);
|
|
|
|
char szBuf[256 * 3];
|
|
sprintf(szBuf, "%s\n\n%d total players, %d Games", strFile.String(), lr.m_nTotalPlayers, lr.m_nGames);
|
|
if (lr.m_nUnfinished) {
|
|
sprintf(&szBuf[strlen(szBuf)], "\n\nUnfinished Games: %d", lr.m_nUnfinished);
|
|
}
|
|
if (lr.m_nErrGames) {
|
|
sprintf(&szBuf[strlen(szBuf)], "\n\nError Games: %d", lr.m_nErrGames);
|
|
}
|
|
if (lr.m_dwRet == LRPT_FILE_ERR)
|
|
strcat(szBuf, "\n\nPrevious LogData lost!!!");
|
|
else if (lr.m_dwRet == LRPT_FILE_ERR2)
|
|
strcat(szBuf, "\n\nLogData broken!!!");
|
|
|
|
MessageBox(szBuf, "Log Report");
|
|
}
|
|
}
|
|
|
|
void CChildView::OnFileLog2Dates()
|
|
{
|
|
SYSTEMTIME SysTime;
|
|
GetLocalTime(&SysTime); // GetSystemTime
|
|
|
|
CDlgGet2Dates dlg(SysTime, this);
|
|
|
|
BOOL bSuccess = FALSE;
|
|
while(dlg.DoModal() == IDOK)
|
|
{
|
|
CString str;
|
|
|
|
CShortDate Start(dlg.m_Start);
|
|
CShortDate End(dlg.m_End);
|
|
|
|
if (Start.Compare(End) > 0) {
|
|
MessageBox("Start date should be <= End Date");
|
|
continue;
|
|
}
|
|
if (Start.m_nYear < 2002) {
|
|
MessageBox("Start year should be >= 2002");
|
|
continue;
|
|
}
|
|
|
|
CStrArray aStrs;
|
|
BOOL bDone = false;
|
|
|
|
int nTotalPlayers = 0;
|
|
int nGames = 0;
|
|
int nUnfinished = 0;
|
|
int nErrGames = 0;
|
|
int nErr1 = 0;
|
|
int nErr2 = 0;
|
|
int nDays = 0;
|
|
|
|
do
|
|
{
|
|
if (Start.Compare(End) == 0)
|
|
bDone = TRUE;
|
|
|
|
CString strDate;
|
|
strDate.Format("c:\\mw4files\\%02d_%02d_%d.rpt", Start.m_nMonth, Start.m_nDay, Start.m_nYear);
|
|
|
|
CLogResult lr;
|
|
lr.GetLogResult(strDate);
|
|
|
|
nTotalPlayers += lr.m_nTotalPlayers;
|
|
nGames += lr.m_nGames;
|
|
nUnfinished += lr.m_nUnfinished;
|
|
nErrGames += lr.m_nErrGames;
|
|
int n1 = 0, n2 = 0;
|
|
if (lr.m_dwRet == LRPT_FILE_ERR) {
|
|
nErr1++;
|
|
n1++;
|
|
} else if (lr.m_dwRet == LRPT_FILE_ERR2) {
|
|
nErr2++;
|
|
n2++;
|
|
}
|
|
|
|
// comment out below if-block for off day!!!
|
|
CStr& str = aStrs.Add();
|
|
//if (lr.m_nTotalPlayers || lr.m_nGames || lr.m_nUnfinished || lr.m_nErrGames || n1 || n2) {
|
|
str.Format("%02d/%02d/%04d, %6d, %5d, %5d, %5d, %4d, %4d\r\n",
|
|
Start.m_nMonth, Start.m_nDay, Start.m_nYear,
|
|
lr.m_nTotalPlayers, lr.m_nGames, lr.m_nUnfinished, lr.m_nErrGames,
|
|
n1, n2);
|
|
//} else {
|
|
// str.Format("%02d/%02d/%04d no records\r\n", Start.m_nMonth, Start.m_nDay, Start.m_nYear);
|
|
//}
|
|
Start.IncADay();
|
|
nDays++;
|
|
} while(!bDone);
|
|
CStr& strD = aStrs.Add();
|
|
strD.Format("===================================================\r\n"
|
|
"mm/dd/year, #Plyrs, Games, Unfin, #Errs, Lost, Brkn\r\n");
|
|
|
|
CStr& strT = aStrs.Add();
|
|
strT.Format("%5d days, %6d, %5d, %5d, %5d, %4d, %4d\r\n",
|
|
nDays, nTotalPlayers, nGames, nUnfinished, nErrGames,
|
|
nErr1, nErr2);
|
|
|
|
int nTotal = aStrs.GetTotalLength();
|
|
HANDLE hMem = GlobalAlloc(GMEM_MOVEABLE, nTotal);
|
|
if (hMem) {
|
|
LPVOID p = GlobalLock(hMem);
|
|
if (p) {
|
|
char* psz = (char*)p;
|
|
CStr* pStart = &aStrs.GetAt(0);
|
|
CStr* pEnd = &pStart[aStrs.GetSize()];
|
|
while(pStart < pEnd)
|
|
{
|
|
strcpy(psz, pStart->String());
|
|
psz += pStart->GetLength();
|
|
pStart++;
|
|
}
|
|
*psz = '\0';
|
|
|
|
HANDLE handle = CreateFile("c:\\mw4files\\report.txt",
|
|
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (handle) {
|
|
DWORD dwWritten;
|
|
WriteFile(handle, p, psz - (char*)p, &dwWritten, NULL);
|
|
CloseHandle(handle);
|
|
|
|
CStr strExec;
|
|
#if 0
|
|
//char szBuf[256];
|
|
//GetWindowsDirectory(szBuf, sizeof(szBuf));
|
|
//strExec.Format("\"%s\\system32\\notepad.exe\" /p c:\\mw4files\\report.txt", szBuf);
|
|
#else
|
|
strExec.Format("c:\\mw4files\\notepad.exe /p c:\\mw4files\\report.txt", AssetsDirectory1);
|
|
//strExec.Format("\"%s\\notepad.exe\" /p c:\\mw4files\\report.txt", AssetsDirectory1);
|
|
#endif
|
|
RunExec(strExec);
|
|
}
|
|
|
|
if (OpenClipboard()) {
|
|
EmptyClipboard();
|
|
if (SetClipboardData(CF_TEXT, hMem)) {
|
|
bSuccess = TRUE;
|
|
hMem = NULL;
|
|
}
|
|
CloseClipboard();
|
|
}
|
|
}
|
|
if (hMem) {
|
|
GlobalFree(hMem);
|
|
hMem = NULL;
|
|
}
|
|
}
|
|
if (bSuccess) {
|
|
MessageBox("LOG data is printed & placed in (CLIPBOARD & c:\\mw4files\\report.txt)");
|
|
} else {
|
|
//MessageBox("");
|
|
}
|
|
break;
|
|
}
|
|
}
|