/* ** 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 . */ // 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 ; }