mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-16 15:41:39 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
308
Code/wwsaveload/editable.h
Normal file
308
Code/wwsaveload/editable.h
Normal file
@@ -0,0 +1,308 @@
|
||||
/*
|
||||
** 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/>.
|
||||
*/
|
||||
|
||||
/***********************************************************************************************
|
||||
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : WWSaveLoad *
|
||||
* *
|
||||
* $Archive:: /Commando/Code/wwsaveload/editable.h $*
|
||||
* *
|
||||
* Author:: Patrick Smith *
|
||||
* *
|
||||
* $Modtime:: 11/02/00 3:34p $*
|
||||
* *
|
||||
* $Revision:: 27 $*
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __EDITABLE_H
|
||||
#define __EDITABLE_H
|
||||
|
||||
|
||||
#include "always.h"
|
||||
#include "persist.h"
|
||||
#include "parameter.h"
|
||||
#include "simpleparameter.h"
|
||||
#include "parameterlist.h"
|
||||
#include "wwdebug.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// EditableClass
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
class EditableClass : public PersistClass
|
||||
{
|
||||
public:
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
//
|
||||
// Note: These methods can be implemented in derived classes
|
||||
// by the DECLARE_EDITABLE macro.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
virtual int Get_Parameter_Count (void) const;
|
||||
virtual ParameterClass * Lock_Parameter (int i);
|
||||
virtual void Unlock_Parameter (int i);
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Get_Parameter_Count
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
inline int
|
||||
EditableClass::Get_Parameter_Count (void) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Get_Parameter
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
inline ParameterClass *
|
||||
EditableClass::Lock_Parameter (int i)
|
||||
{
|
||||
WWASSERT (0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Set_Parameter
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
inline void
|
||||
EditableClass::Unlock_Parameter (int i)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
//#define PARAM_EDITING_ON
|
||||
#ifdef PARAM_EDITING_ON
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DECLARE_EDITABLE
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
#define DECLARE_EDITABLE(_class, _parent) \
|
||||
ParameterListClass plist_##_class; \
|
||||
virtual int _class::Get_Parameter_Count(void) const \
|
||||
{ \
|
||||
return plist_##_class.Count () + _parent::Get_Parameter_Count (); \
|
||||
} \
|
||||
virtual ParameterClass *_class::Lock_Parameter(int i) \
|
||||
{ \
|
||||
if (i < _parent::Get_Parameter_Count()) { \
|
||||
return _parent::Lock_Parameter (i); \
|
||||
} \
|
||||
return plist_##_class[i - _parent::Get_Parameter_Count()]; \
|
||||
} \
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// EDITABLE_PARAM
|
||||
//
|
||||
// The following macros are used inside the constructor for an editable
|
||||
// object to map member data to abstract parameter objects.
|
||||
//
|
||||
// Some examples:
|
||||
//
|
||||
// To register the player's name (a string):
|
||||
// EDITABLE_PARAM(GameClass, ParameterClass::TYPE_STRING, Name)
|
||||
//
|
||||
// To register the player's name using a more descriptive display string:
|
||||
// NAMED_EDITABLE_PARAM(GameClass, ParameterClass::TYPE_STRING, Name, "Player Name")
|
||||
//
|
||||
// To register a unit's maximum health
|
||||
// INT_EDITABLE_PARAM(GameClass, MaxHeatlh, 0, 500)
|
||||
//
|
||||
// To register a complex variable (such as an enumerated type:
|
||||
// #ifdef PARAM_EDITING_ON
|
||||
// EnumParameterClass *param = new EnumParameterClass(GangID);
|
||||
// param->Set_Name ("Gang");
|
||||
// param->Add_Value ("GDI", ID_GDI);
|
||||
// param->Add_Value ("NOD", ID_NOD);
|
||||
// param->Add_Value ("Neutral", ID_NEUTRAL);
|
||||
// GENERIC_EDITABLE_PARAM(param)
|
||||
// #endif
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#define EDITABLE_PARAM(_class, type, data) plist_##_class.Add (&(data), #data, type);
|
||||
#define NAMED_EDITABLE_PARAM(_class, type, data, name) plist_##_class.Add (&(data), name, type);
|
||||
|
||||
#define INT_EDITABLE_PARAM(_class, data, min, max) { \
|
||||
IntParameterClass *param = new IntParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define INT_UNITS_PARAM(_class, data, min, max, unitsname) { \
|
||||
IntParameterClass *param = new IntParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name(unitsname); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define NAMED_INT_UNITS_PARAM(_class,data,min,max,unitsname,name) { \
|
||||
IntParameterClass *param = new IntParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name(unitsname); \
|
||||
param->Set_Name(name); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define FLOAT_EDITABLE_PARAM(_class, data, min, max) { \
|
||||
FloatParameterClass *param = new FloatParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define FLOAT_UNITS_PARAM(_class, data, min, max, unitsname) { \
|
||||
FloatParameterClass *param = new FloatParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name(unitsname); \
|
||||
plist_##_class.Add (param); }
|
||||
|
||||
#define NAMED_FLOAT_UNITS_PARAM(_class, data, min, max, unitsname,name) { \
|
||||
FloatParameterClass *param = new FloatParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name(unitsname); \
|
||||
param->Set_Name(name); \
|
||||
plist_##_class.Add (param); }
|
||||
|
||||
#define ANGLE_EDITABLE_PARAM(_class, data, min, max) { \
|
||||
AngleParameterClass *param = new AngleParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name ("degrees"); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define NAMED_ANGLE_EDITABLE_PARAM(_class, data, min, max, name) { \
|
||||
AngleParameterClass *param = new AngleParameterClass( &data, #data); \
|
||||
param->Set_Range (min, max); \
|
||||
param->Set_Units_Name ("degrees"); \
|
||||
param->Set_Name(name); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define GENERIC_EDITABLE_PARAM(_class, param) \
|
||||
plist_##_class.Add (param); \
|
||||
|
||||
#define MODEL_DEF_PARAM(_class, data, name) { \
|
||||
ModelDefParameterClass *param = new ModelDefParameterClass (&data); \
|
||||
param->Set_Name (#data); \
|
||||
param->Set_Base_Class (name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define PHYS_DEF_PARAM(_class, data, name) { \
|
||||
PhysDefParameterClass *param = new PhysDefParameterClass (&data); \
|
||||
param->Set_Name (#data); \
|
||||
param->Set_Base_Class (name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define SCRIPT_PARAM(_class, name, params) { \
|
||||
ScriptParameterClass *param = new ScriptParameterClass (&name, ¶ms); \
|
||||
param->Set_Name (#name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define SCRIPTLIST_PARAM(_class, name, name_list, param_list) { \
|
||||
ScriptListParameterClass *param = new ScriptListParameterClass (&name_list, ¶m_list); \
|
||||
param->Set_Name (name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define ENUM_PARAM(_class, data, params) { \
|
||||
EnumParameterClass *param = new EnumParameterClass (&data); \
|
||||
param->Set_Name (#data); \
|
||||
param->Add_Values params; \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define FILENAME_PARAM(_class, data, desc, extension) { \
|
||||
FilenameParameterClass *param = new FilenameParameterClass (&data); \
|
||||
param->Set_Name (#data); \
|
||||
param->Set_Description (desc); \
|
||||
param->Set_Extension (extension); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define DEFIDLIST_PARAM(_class, data, root_class_id) { \
|
||||
DefIDListParameterClass *param = new DefIDListParameterClass (&data); \
|
||||
param->Set_Name (#data); \
|
||||
param->Set_Class_ID (root_class_id); \
|
||||
plist_##_class.Add (param); } \
|
||||
|
||||
#define CLASSID_DEFIDLIST_PARAM(_class, data, root_class_id, class_id, name) { \
|
||||
DefIDListParameterClass *param = new DefIDListParameterClass (&data); \
|
||||
param->Set_Name (name); \
|
||||
param->Set_Class_ID (root_class_id); \
|
||||
param->Set_Selected_Class_ID (&class_id); \
|
||||
plist_##_class.Add (param); }
|
||||
|
||||
#define ZONE_PARAM(_class, data, name) { \
|
||||
ZoneParameterClass *param = new ZoneParameterClass (&data); \
|
||||
param->Set_Name (name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define PARAM_SEPARATOR(_class, name) { \
|
||||
SeparatorParameterClass *param = new SeparatorParameterClass; \
|
||||
param->Set_Name (name); \
|
||||
GENERIC_EDITABLE_PARAM(_class, param); }
|
||||
|
||||
#define GENERIC_DEFID_PARAM(_class, data, root_class_id) { \
|
||||
GenericDefParameterClass *param = new GenericDefParameterClass (&data); \
|
||||
param->Set_Class_ID (root_class_id); \
|
||||
param->Set_Name (#data); \
|
||||
plist_##_class.Add (param); }
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#define DECLARE_EDITABLE(_class, _parent)
|
||||
#define EDITABLE_PARAM(_class, type, data)
|
||||
#define NAMED_EDITABLE_PARAM(_class, type, data, name)
|
||||
#define INT_EDITABLE_PARAM(_class, data, min, max)
|
||||
#define INT_UNITS_PARAM(_class, data, min, max, unitsname)
|
||||
#define NAMED_INT_UNITS_PARAM(_class,data,min,max,unitsname,name)
|
||||
#define FLOAT_EDITABLE_PARAM(_class, data, min, max)
|
||||
#define FLOAT_UNITS_PARAM(_class, data, min, max, unitsname)
|
||||
#define NAMED_FLOAT_UNITS_PARAM(_class, data, min, max, unitsname,name)
|
||||
#define ANGLE_EDITABLE_PARAM(_class, data, min, max)
|
||||
#define NAMED_ANGLE_EDITABLE_PARAM(_class, data, min, max, name)
|
||||
#define GENERIC_EDITABLE_PARAM(_class, param)
|
||||
#define MODEL_DEF_PARAM(_class, data, name)
|
||||
#define PHYS_DEF_PARAM(_class, data, name)
|
||||
#define SCRIPT_PARAM(_class, name, params)
|
||||
#define SCRIPTLIST_PARAM(_class, name, name_list, param_list)
|
||||
#define ENUM_PARAM(_class, data, params)
|
||||
#define FILENAME_PARAM(_class, data, desc, extension)
|
||||
#define DEFIDLIST_PARAM(_class, data, root_class_id)
|
||||
#define CLASSID_DEFIDLIST_PARAM(_class, data, root_class_id, class_id, name)
|
||||
#define ZONE_PARAM(_class, data, name)
|
||||
#define PARAM_SEPARATOR(_class, name)
|
||||
#define GENERIC_DEFID_PARAM(_class, data, root_class_id)
|
||||
|
||||
#endif //PARAM_EDITING_ON
|
||||
|
||||
|
||||
#endif //__EDITABLE_H
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user