226 lines
5.1 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "StdAfx.h"
#include "DebugWindowDialog.h"
DebugWindowDialog::DebugWindowDialog(UINT nIDTemplate, CWnd* pParentWnd) :
CDialog(nIDTemplate, pParentWnd)
{
mStepping = false;
mRunFast = false;
mNumberOfStepsAllowed = -1;
mMainWndHWND = ::FindWindow(NULL, "Command & Conquer: Generals");
}
int DebugWindowDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
return CDialog::OnCreate(lpCreateStruct);
}
HWND DebugWindowDialog::GetMainWndHWND(void)
{
return mMainWndHWND;
}
void DebugWindowDialog::ForcePause(void)
{
mNumberOfStepsAllowed = 0;
_UpdatePauseButton();
}
void DebugWindowDialog::ForceContinue(void)
{
mNumberOfStepsAllowed = -1;
_UpdatePauseButton();
}
void DebugWindowDialog::OnPause()
{
if (mNumberOfStepsAllowed < 0) {
mNumberOfStepsAllowed = 0;
} else {
mNumberOfStepsAllowed = -1;
}
_UpdatePauseButton();
}
void DebugWindowDialog::OnStep()
{
mStepping = true;
mNumberOfStepsAllowed = 1;
_UpdatePauseButton();
}
void DebugWindowDialog::OnRunFast()
{
CButton *pButton = (CButton*)GetDlgItem(IDC_RUN_FAST);
mRunFast = pButton->GetCheck() == 1;
}
void DebugWindowDialog::OnStepTen()
{
mStepping = true;
mNumberOfStepsAllowed = 10;
_UpdatePauseButton();
}
void DebugWindowDialog::OnClearWindows()
{
mMessages.clear();
mVariables.clear();
_RebuildMesgString();
_RebuildVarsString();
}
bool DebugWindowDialog::CanProceed(void)
{
if (mNumberOfStepsAllowed < 0) {
return true;
} else if (mNumberOfStepsAllowed == 0) {
if (mStepping) {
mStepping = false;
_UpdatePauseButton();
}
return false;
}
--mNumberOfStepsAllowed;
return true;
}
bool DebugWindowDialog::RunAppFast(void)
{
return mRunFast;
}
void DebugWindowDialog::AppendMessage(const std::string& messageToAppend)
{
mMessages.push_back(messageToAppend);
_RebuildMesgString();
}
void DebugWindowDialog::AdjustVariable(const std::string& varName, const std::string& varValue)
{
for (VecPairStringIt it = mVariables.begin(); it != mVariables.end(); it++) {
if (it->first == varName) {
it->second = varValue;
_RebuildVarsString();
return;
}
}
PairString newPair;
newPair.first = varName;
newPair.second = varValue;
mVariables.push_back(newPair);
_RebuildVarsString();
}
void DebugWindowDialog::SetFrameNumber(int frameNumber)
{
static int numDigits;
numDigits = frameNumber / 10 + 2; // 1 for 1 additional digit, 1 for \0
mFrameNumber.resize(numDigits);
sprintf(mFrameNumber.begin(), "%d", frameNumber);
CWnd *pWnd = GetDlgItem(IDC_FrameNumber);
if (pWnd) {
pWnd->SetWindowText(mFrameNumber.begin());
}
}
void DebugWindowDialog::_RebuildVarsString(void)
{
int cursorPosBeg, cursorPosEnd;
((CEdit*)GetDlgItem(IDC_Variables))->GetSel(cursorPosBeg, cursorPosEnd);
mVariablesString = "";
for (VecPairStringIt it = mVariables.begin(); it != mVariables.end(); it++) {
mVariablesString += it->first;
mVariablesString += " = ";
mVariablesString += it->second;
mVariablesString += "\r\n";
}
// Push the new string
mVariablesDisplayString = mVariablesString.c_str();
GetDlgItem(IDC_Variables)->SetWindowText(mVariablesDisplayString);
((CEdit*)GetDlgItem(IDC_Variables))->GetSel(cursorPosBeg, cursorPosEnd);
}
void DebugWindowDialog::_RebuildMesgString(void)
{
mMessagesString = "";
for (VecStringIt it = mMessages.begin(); it != mMessages.end(); it++) {
mMessagesString += (*it);
mMessagesString += "\r\n";
}
// Push the new string
mMessagesDisplayString = mMessagesString.c_str();
GetDlgItem(IDC_Messages)->SetWindowText(mMessagesDisplayString);
((CEdit*)GetDlgItem(IDC_Messages))->SetSel(mMessagesString.length(), mMessagesString.length(), false);
}
void DebugWindowDialog::_UpdatePauseButton(void)
{
// huh huh huhuh he said pButt
CButton* pButt = (CButton*) GetDlgItem(IDC_Pause);
if (!pButt) {
return;
}
// The state should of the button should reflect !mNumberOfStepsAllowed
pButt->SetCheck((mNumberOfStepsAllowed ? FALSE : TRUE));
}
void DebugWindowDialog::OnClose()
{
ShowWindow(SW_MINIMIZE);
}
void DebugWindowDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (nType == SIZE_MINIMIZED) {
if (mMainWndHWND) {
::SetFocus(mMainWndHWND);
}
}
}
BEGIN_MESSAGE_MAP(DebugWindowDialog, CDialog)
ON_WM_CREATE( )
ON_BN_CLICKED(IDC_Pause, OnPause)
ON_BN_CLICKED(IDC_Step, OnStep)
ON_BN_CLICKED(IDC_RUN_FAST, OnRunFast)
ON_BN_CLICKED(IDC_StepTen, OnStepTen)
ON_BN_CLICKED(IDC_ClearWindows, OnClearWindows)
ON_WM_CLOSE()
ON_WM_SIZE()
END_MESSAGE_MAP()