This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/ScriptEditDialog.cpp

499 lines
12 KiB
C++

/*
** Command & Conquer Renegade(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/>.
*/
// ScriptEditDialog.cpp : implementation file
//
#include "stdafx.h"
#include "leveledit.h"
#include "ScriptEditDialog.h"
#include "ScriptMgr.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// ScriptEditDialogClass
//
/////////////////////////////////////////////////////////////////////////////
ScriptEditDialogClass::ScriptEditDialogClass(CWnd* pParent /*=NULL*/)
: m_CurrentParamType (PARAM_TYPE_STRING),
m_CurrentParamIndex (0),
m_ValueVector3Dlg (NULL),
CDialog(ScriptEditDialogClass::IDD, pParent)
{
//{{AFX_DATA_INIT(ScriptEditDialogClass)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// ~ScriptEditDialogClass
//
/////////////////////////////////////////////////////////////////////////////
ScriptEditDialogClass::~ScriptEditDialogClass (void)
{
SAFE_DELETE (m_ValueVector3Dlg);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DoDataExchange
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::DoDataExchange (CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ScriptEditDialogClass)
DDX_Control(pDX, IDC_PARAM_VALUE_STRING_EDIT, m_ValueStringEdit);
DDX_Control(pDX, IDC_PARAM_VALUE_NUMBER_SPIN, m_ValueNumberSpin);
DDX_Control(pDX, IDC_PARAM_VALUE_NUMBER_EDIT, m_ValueNumberEdit);
DDX_Control(pDX, IDC_PARAM_VALUE_LIST_COMBO, m_ValueListCombo);
DDX_Control(pDX, IDC_PARAM_VALUE_BOOL_CHECK, m_ValueBoolCheck);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ScriptEditDialogClass, CDialog)
//{{AFX_MSG_MAP(ScriptEditDialogClass)
ON_CBN_SELCHANGE(IDC_PARAM_NAME_COMBO, OnSelChangeParamNameCombo)
ON_CBN_SELCHANGE(IDC_SCRIPT_NAME, OnSelChangeScriptName)
ON_NOTIFY(UDN_DELTAPOS, IDC_PARAM_VALUE_NUMBER_SPIN, OnDeltaposParamValueNumberSpin)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// OnInitDialog
//
/////////////////////////////////////////////////////////////////////////////
BOOL
ScriptEditDialogClass::OnInitDialog (void)
{
CDialog::OnInitDialog();
//
// Add the total list of scripts to the combobox
//
for (int index = 0; index < ScriptMgrClass::Get_Count (); index ++) {
EditScriptClass *script = ScriptMgrClass::Get_Script (index);
if (script != NULL) {
//
// Add this script to the combobox
//
int item_index = SendDlgItemMessage (IDC_SCRIPT_NAME, CB_ADDSTRING, 0, (LPARAM)script->Get_Name ());
SendDlgItemMessage (IDC_SCRIPT_NAME, CB_SETITEMDATA, (WPARAM)item_index, (LPARAM)script);
//
// Select this script if it is the default
//
if (::lstrcmpi (m_Script.Get_Name (), script->Get_Name ()) == 0) {
SendDlgItemMessage (IDC_SCRIPT_NAME, CB_SETCURSEL, (WPARAM)item_index);
}
}
}
//
// Reposition the hidden controls so they occupy the same area as
// the default 'value' control.
//
CRect rect;
m_ValueStringEdit.GetWindowRect (&rect);
ScreenToClient (&rect);
m_ValueNumberEdit.SetWindowPos (NULL, rect.left, rect.top, rect.Width (), rect.Height (), SWP_NOZORDER);
m_ValueListCombo.SetWindowPos (NULL, rect.left, rect.top, rect.Width (), rect.Height () * 10, SWP_NOZORDER);
m_ValueBoolCheck.SetWindowPos (NULL, rect.left, rect.top, rect.Width (), rect.Height (), SWP_NOZORDER);
m_ValueNumberSpin.SetRange (-1000000, 1000000);
m_ValueNumberSpin.SetBuddy (&m_ValueNumberEdit);
//
// Create the 'Vector3' dialog control
//
m_ValueVector3Dlg = new Vector3DialogClass;
m_ValueVector3Dlg->Create (this);
CRect v3_rect;
m_ValueVector3Dlg->GetWindowRect (&v3_rect);
m_ValueVector3Dlg->ShowWindow (SW_HIDE);
m_ValueVector3Dlg->SetWindowPos (&m_ValueNumberEdit, rect.left, (rect.top + rect.Height () / 2) - (v3_rect.Height () / 2), 0, 0, SWP_NOSIZE);
Fill_Param_Combo ();
Switch_Value_Control_Type ();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// Fill_Param_Combo
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::Fill_Param_Combo (void)
{
// Clear the contents of the param combobox
SendDlgItemMessage (IDC_PARAM_NAME_COMBO, CB_RESETCONTENT);
// Add the param names to the combobox
for (int index = 0; index < m_Script.Get_Param_Count (); index ++) {
CString name = m_Script.Get_Param_Name (index);
SendDlgItemMessage (IDC_PARAM_NAME_COMBO, CB_ADDSTRING, (WPARAM)0, (LPARAM)(LPCTSTR)name);
}
// Select the first parameter in the list by default
SendDlgItemMessage (IDC_PARAM_NAME_COMBO, CB_SETCURSEL, (WPARAM)0);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Switch_Value_Control_Type
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::Switch_Value_Control_Type (void)
{
// Get the parameter index and use it to determine the new combo type
int index = SendDlgItemMessage (IDC_PARAM_NAME_COMBO, CB_GETCURSEL);
if (index != CB_ERR) {
Switch_Value_Control_Type (index);
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Switch_Value_Control_Type
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::Switch_Value_Control_Type (int param_index)
{
// Is the new type different than the old one?
PARAM_TYPES type = m_Script.Get_Param_Type (param_index);
if (type != m_CurrentParamType) {
//
// What's the new type?
//
switch (type)
{
case PARAM_TYPE_FLOAT:
case PARAM_TYPE_INT:
{
if (type == PARAM_TYPE_FLOAT) {
::Make_Edit_Float_Ctrl (m_ValueNumberEdit);
} else {
::Make_Edit_Int_Ctrl (m_ValueNumberEdit);
}
m_ValueNumberEdit.ShowWindow (SW_SHOW);
m_ValueNumberSpin.ShowWindow (SW_SHOW);
}
break;
case PARAM_TYPE_BOOL:
{
m_ValueBoolCheck.ShowWindow (SW_SHOW);
}
break;
case PARAM_TYPE_VECTOR3:
{
m_ValueVector3Dlg->ShowWindow (SW_SHOW);
}
break;
case PARAM_TYPE_STRING:
default:
{
m_ValueStringEdit.ShowWindow (SW_SHOW);
}
break;
}
//
// Hide the old window
//
switch (m_CurrentParamType)
{
case PARAM_TYPE_FLOAT:
case PARAM_TYPE_INT:
{
if ((type != PARAM_TYPE_FLOAT) &&
(type != PARAM_TYPE_INT)) {
m_ValueNumberEdit.ShowWindow (SW_HIDE);
m_ValueNumberSpin.ShowWindow (SW_HIDE);
}
}
break;
case PARAM_TYPE_BOOL:
{
m_ValueBoolCheck.ShowWindow (SW_HIDE);
}
break;
case PARAM_TYPE_VECTOR3:
{
m_ValueVector3Dlg->ShowWindow (SW_HIDE);
}
break;
case PARAM_TYPE_STRING:
default:
{
m_ValueStringEdit.ShowWindow (SW_HIDE);
}
break;
}
// Remember the new type
m_CurrentParamType = type;
}
//
// Make sure the value is correct
//
Fill_Value_Control (m_Script.Get_Param_Value (param_index));
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Fill_Value_Control
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::Fill_Value_Control (LPCTSTR value)
{
// What's type?
switch (m_CurrentParamType)
{
case PARAM_TYPE_FLOAT:
{
float float_value = ::atof (value);
m_ValueNumberEdit.SetWindowText (value);
m_ValueNumberSpin.SetPos (::atol (value));
//m_ValueNumberSpin.SetPos (int(float_value * 100.00F));
}
break;
case PARAM_TYPE_INT:
{
m_ValueNumberEdit.SetWindowText (value);
m_ValueNumberSpin.SetPos (::atol (value));
}
break;
case PARAM_TYPE_BOOL:
{
m_ValueBoolCheck.SetWindowText (m_Script.Get_Param_Name (m_CurrentParamIndex));
m_ValueBoolCheck.SetCheck (::lstrcmpi (value, "true") == 0);
}
break;
case PARAM_TYPE_VECTOR3:
{
//
// Determine what the 3 components of the vector3 are
//
Vector3 new_value (0, 0, 0);
::sscanf (value, "%f %f %f", &new_value.X, &new_value.Y, &new_value.Z);
//
// Pass the new value onto the dialog
//
m_ValueVector3Dlg->Set_Default_Value (new_value);
}
break;
case PARAM_TYPE_STRING:
default:
{
m_ValueStringEdit.SetWindowText (value);
}
break;
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Save_Current_Value
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::Save_Current_Value (void)
{
// What's type?
CString text_value;
switch (m_CurrentParamType)
{
case PARAM_TYPE_FLOAT:
{
// Validate the float
float float_value = ::GetDlgItemFloat (m_hWnd, IDC_PARAM_VALUE_NUMBER_EDIT, true);
text_value.Format ("%.2f", float_value);
}
break;
case PARAM_TYPE_INT:
{
// Validate the int
int num_value = GetDlgItemInt (IDC_PARAM_VALUE_NUMBER_EDIT);
text_value.Format ("%d", num_value);
}
break;
case PARAM_TYPE_BOOL:
{
text_value = m_ValueBoolCheck.GetCheck () ? "true" : "false";
}
break;
case PARAM_TYPE_VECTOR3:
{
//
// Get the current value from the dialog and convert it to a string
//
Vector3 curr_value = m_ValueVector3Dlg->Get_Current_Value ();
text_value.Format ("%.2f %.2f %.2f", curr_value.X, curr_value.Y, curr_value.Z);
}
break;
case PARAM_TYPE_STRING:
default:
{
m_ValueStringEdit.GetWindowText (text_value);
}
break;
}
// Pass the new value onto the property
m_Script.Set_Param_Value (m_CurrentParamIndex, text_value);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnSelChangeParamNameCombo
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::OnSelChangeParamNameCombo (void)
{
// Make sure we save the current value from the value control
Save_Current_Value ();
// Get the parameter index
m_CurrentParamIndex = SendDlgItemMessage (IDC_PARAM_NAME_COMBO, CB_GETCURSEL);
if (m_CurrentParamIndex != CB_ERR) {
// Reset the dialog controls to reflect this parameter
Switch_Value_Control_Type ();
Fill_Value_Control (m_Script.Get_Param_Value (m_CurrentParamIndex));
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnSelChangeScriptName
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::OnSelChangeScriptName (void)
{
// Get the current selection
int index = SendDlgItemMessage (IDC_SCRIPT_NAME, CB_GETCURSEL);
if (index != CB_ERR) {
EditScriptClass *script = (EditScriptClass *)SendDlgItemMessage (IDC_SCRIPT_NAME, CB_GETITEMDATA, index);
if (script != NULL) {
m_Script = (*script);
// Fill the parameter's combobox with param names
Fill_Param_Combo ();
Switch_Value_Control_Type (0);
m_CurrentParamIndex = 0;
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnDeltaposParamValueNumberSpin
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::OnDeltaposParamValueNumberSpin
(
NMHDR *pNMHDR,
LRESULT *pResult
)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
int value = GetDlgItemInt (IDC_PARAM_VALUE_NUMBER_EDIT);
value += pNMUpDown->iDelta;
SetDlgItemInt (IDC_PARAM_VALUE_NUMBER_EDIT, value);
(*pResult) = 0;
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnOK
//
/////////////////////////////////////////////////////////////////////////////
void
ScriptEditDialogClass::OnOK (void)
{
Save_Current_Value ();
CDialog::OnOK ();
return ;
}