editable.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. ** Command & Conquer Generals Zero Hour(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** 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 ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : WWSaveLoad *
  23. * *
  24. * $Archive:: /Commando/Code/wwsaveload/editable.h $*
  25. * *
  26. * *
  27. * Org Author:: Patrick Smith *
  28. * *
  29. * Author:: Kenny Mitchell *
  30. * *
  31. * $Modtime:: 5/29/02 11:00a $*
  32. * *
  33. * $Revision:: 29 $*
  34. * *
  35. *---------------------------------------------------------------------------------------------*
  36. * Functions: *
  37. * 5/27/02 KM Added named filename parameter declaration
  38. * 5/29/02 KM Added specific texture filename parameter support
  39. *---------------------------------------------------------------------------------------------*
  40. * Functions: *
  41. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  42. #if defined(_MSC_VER)
  43. #pragma once
  44. #endif
  45. #ifndef __EDITABLE_H
  46. #define __EDITABLE_H
  47. #include "always.h"
  48. #include "persist.h"
  49. #include "parameter.h"
  50. #include "simpleparameter.h"
  51. #include "parameterlist.h"
  52. #include "wwdebug.h"
  53. //////////////////////////////////////////////////////////////////////////////////
  54. //
  55. // EditableClass
  56. //
  57. //////////////////////////////////////////////////////////////////////////////////
  58. class EditableClass
  59. {
  60. public:
  61. /////////////////////////////////////////////////////////////////////
  62. // Public methods
  63. //
  64. // Note: These methods can be implemented in derived classes
  65. // by the DECLARE_EDITABLE macro.
  66. //
  67. /////////////////////////////////////////////////////////////////////
  68. virtual int Get_Parameter_Count (void) const;
  69. virtual ParameterClass * Lock_Parameter (int i);
  70. virtual void Unlock_Parameter (int i);
  71. };
  72. /////////////////////////////////////////////////////////////////////
  73. // Get_Parameter_Count
  74. /////////////////////////////////////////////////////////////////////
  75. inline int
  76. EditableClass::Get_Parameter_Count (void) const
  77. {
  78. return 0;
  79. }
  80. /////////////////////////////////////////////////////////////////////
  81. // Get_Parameter
  82. /////////////////////////////////////////////////////////////////////
  83. inline ParameterClass *
  84. EditableClass::Lock_Parameter (int i)
  85. {
  86. WWASSERT (0);
  87. return NULL;
  88. }
  89. /////////////////////////////////////////////////////////////////////
  90. // Set_Parameter
  91. /////////////////////////////////////////////////////////////////////
  92. inline void
  93. EditableClass::Unlock_Parameter (int i)
  94. {
  95. return ;
  96. }
  97. //#define PARAM_EDITING_ON
  98. #ifdef PARAM_EDITING_ON
  99. //////////////////////////////////////////////////////////////////////////////////
  100. //
  101. // DECLARE_EDITABLE
  102. //
  103. //////////////////////////////////////////////////////////////////////////////////
  104. #define DECLARE_EDITABLE(_class, _parent) \
  105. ParameterListClass plist_##_class; \
  106. virtual int _class::Get_Parameter_Count(void) const \
  107. { \
  108. return plist_##_class.Count () + _parent::Get_Parameter_Count (); \
  109. } \
  110. virtual ParameterClass *_class::Lock_Parameter(int i) \
  111. { \
  112. if (i < _parent::Get_Parameter_Count()) { \
  113. return _parent::Lock_Parameter (i); \
  114. } \
  115. return plist_##_class[i - _parent::Get_Parameter_Count()]; \
  116. } \
  117. //////////////////////////////////////////////////////////////////////////////////
  118. //
  119. // EDITABLE_PARAM
  120. //
  121. // The following macros are used inside the constructor for an editable
  122. // object to map member data to abstract parameter objects.
  123. //
  124. // Some examples:
  125. //
  126. // To register the player's name (a string):
  127. // EDITABLE_PARAM(GameClass, ParameterClass::TYPE_STRING, Name)
  128. //
  129. // To register the player's name using a more descriptive display string:
  130. // NAMED_EDITABLE_PARAM(GameClass, ParameterClass::TYPE_STRING, Name, "Player Name")
  131. //
  132. // To register a unit's maximum health
  133. // INT_EDITABLE_PARAM(GameClass, MaxHeatlh, 0, 500)
  134. //
  135. // To register a complex variable (such as an enumerated type:
  136. // #ifdef PARAM_EDITING_ON
  137. // EnumParameterClass *param = new EnumParameterClass(GangID);
  138. // param->Set_Name ("Gang");
  139. // param->Add_Value ("GDI", ID_GDI);
  140. // param->Add_Value ("NOD", ID_NOD);
  141. // param->Add_Value ("Neutral", ID_NEUTRAL);
  142. // GENERIC_EDITABLE_PARAM(param)
  143. // #endif
  144. //
  145. //////////////////////////////////////////////////////////////////////////////////
  146. #define EDITABLE_PARAM(_class, type, data) plist_##_class.Add (&(data), #data, type);
  147. #define NAMED_EDITABLE_PARAM(_class, type, data, name) plist_##_class.Add (&(data), name, type);
  148. #define INT_EDITABLE_PARAM(_class, data, min, max) { \
  149. IntParameterClass *param = W3DNEW IntParameterClass( &data, #data); \
  150. param->Set_Range (min, max); \
  151. plist_##_class.Add (param); } \
  152. #define INT_UNITS_PARAM(_class, data, min, max, unitsname) { \
  153. IntParameterClass *param = W3DNEW IntParameterClass( &data, #data); \
  154. param->Set_Range (min, max); \
  155. param->Set_Units_Name(unitsname); \
  156. plist_##_class.Add (param); } \
  157. #define NAMED_INT_UNITS_PARAM(_class,data,min,max,unitsname,name) { \
  158. IntParameterClass *param = W3DNEW IntParameterClass( &data, #data); \
  159. param->Set_Range (min, max); \
  160. param->Set_Units_Name(unitsname); \
  161. param->Set_Name(name); \
  162. plist_##_class.Add (param); } \
  163. #define FLOAT_EDITABLE_PARAM(_class, data, min, max) { \
  164. FloatParameterClass *param = W3DNEW FloatParameterClass( &data, #data); \
  165. param->Set_Range (min, max); \
  166. plist_##_class.Add (param); } \
  167. #define FLOAT_UNITS_PARAM(_class, data, min, max, unitsname) { \
  168. FloatParameterClass *param = W3DNEW FloatParameterClass( &data, #data); \
  169. param->Set_Range (min, max); \
  170. param->Set_Units_Name(unitsname); \
  171. plist_##_class.Add (param); }
  172. #define NAMED_FLOAT_UNITS_PARAM(_class, data, min, max, unitsname,name) { \
  173. FloatParameterClass *param = W3DNEW FloatParameterClass( &data, #data); \
  174. param->Set_Range (min, max); \
  175. param->Set_Units_Name(unitsname); \
  176. param->Set_Name(name); \
  177. plist_##_class.Add (param); }
  178. #define ANGLE_EDITABLE_PARAM(_class, data, min, max) { \
  179. AngleParameterClass *param = W3DNEW AngleParameterClass( &data, #data); \
  180. param->Set_Range (min, max); \
  181. param->Set_Units_Name ("degrees"); \
  182. plist_##_class.Add (param); } \
  183. #define NAMED_ANGLE_EDITABLE_PARAM(_class, data, min, max, name) { \
  184. AngleParameterClass *param = W3DNEW AngleParameterClass( &data, #data); \
  185. param->Set_Range (min, max); \
  186. param->Set_Units_Name ("degrees"); \
  187. param->Set_Name(name); \
  188. plist_##_class.Add (param); } \
  189. #define GENERIC_EDITABLE_PARAM(_class, param) \
  190. plist_##_class.Add (param); \
  191. #define MODEL_DEF_PARAM(_class, data, name) { \
  192. ModelDefParameterClass *param = W3DNEW ModelDefParameterClass (&data); \
  193. param->Set_Name (#data); \
  194. param->Set_Base_Class (name); \
  195. GENERIC_EDITABLE_PARAM(_class, param); }
  196. #define PHYS_DEF_PARAM(_class, data, name) { \
  197. PhysDefParameterClass *param = W3DNEW PhysDefParameterClass (&data); \
  198. param->Set_Name (#data); \
  199. param->Set_Base_Class (name); \
  200. GENERIC_EDITABLE_PARAM(_class, param); }
  201. #define SCRIPT_PARAM(_class, name, params) { \
  202. ScriptParameterClass *param = W3DNEW ScriptParameterClass (&name, &params); \
  203. param->Set_Name (#name); \
  204. GENERIC_EDITABLE_PARAM(_class, param); }
  205. #define SCRIPTLIST_PARAM(_class, name, name_list, param_list) { \
  206. ScriptListParameterClass *param = W3DNEW ScriptListParameterClass (&name_list, &param_list); \
  207. param->Set_Name (name); \
  208. GENERIC_EDITABLE_PARAM(_class, param); }
  209. #define ENUM_PARAM(_class, data, params) { \
  210. EnumParameterClass *param = W3DNEW EnumParameterClass (&data); \
  211. param->Set_Name (#data); \
  212. param->Add_Values params; \
  213. plist_##_class.Add (param); } \
  214. #define FILENAME_PARAM(_class, data, desc, extension) { \
  215. FilenameParameterClass *param = W3DNEW FilenameParameterClass (&data); \
  216. param->Set_Name (#data); \
  217. param->Set_Description (desc); \
  218. param->Set_Extension (extension); \
  219. plist_##_class.Add (param); } \
  220. #define NAMED_FILENAME_PARAM(_class, data, name, desc, extension) { \
  221. FilenameParameterClass *param = new FilenameParameterClass (&data); \
  222. param->Set_Name (name); \
  223. param->Set_Description (desc); \
  224. param->Set_Extension (extension); \
  225. plist_##_class.Add (param); } \
  226. #define TEXTURE_FILENAME_PARAM(_class, data, desc, extension) { \
  227. TextureFilenameParameterClass *param = new TextureFilenameParameterClass (&data); \
  228. param->Set_Name (#data); \
  229. param->Set_Description (desc); \
  230. param->Set_Extension (extension); \
  231. plist_##_class.Add (param); } \
  232. #define NAMED_TEXTURE_FILENAME_PARAM(_class, data, name, desc, extension) { \
  233. TextureFilenameParameterClass *param = new TextureFilenameParameterClass (&data); \
  234. param->Set_Name (name); \
  235. param->Set_Description (desc); \
  236. param->Set_Extension (extension); \
  237. plist_##_class.Add (param); } \
  238. #define DEFIDLIST_PARAM(_class, data, root_class_id) { \
  239. DefIDListParameterClass *param = W3DNEW DefIDListParameterClass (&data); \
  240. param->Set_Name (#data); \
  241. param->Set_Class_ID (root_class_id); \
  242. plist_##_class.Add (param); } \
  243. #define CLASSID_DEFIDLIST_PARAM(_class, data, root_class_id, class_id, name) { \
  244. DefIDListParameterClass *param = W3DNEW DefIDListParameterClass (&data); \
  245. param->Set_Name (name); \
  246. param->Set_Class_ID (root_class_id); \
  247. param->Set_Selected_Class_ID (&class_id); \
  248. plist_##_class.Add (param); }
  249. #define ZONE_PARAM(_class, data, name) { \
  250. ZoneParameterClass *param = W3DNEW ZoneParameterClass (&data); \
  251. param->Set_Name (name); \
  252. GENERIC_EDITABLE_PARAM(_class, param); }
  253. #define PARAM_SEPARATOR(_class, name) { \
  254. SeparatorParameterClass *param = W3DNEW SeparatorParameterClass; \
  255. param->Set_Name (name); \
  256. GENERIC_EDITABLE_PARAM(_class, param); }
  257. #define GENERIC_DEFID_PARAM(_class, data, root_class_id) { \
  258. GenericDefParameterClass *param = W3DNEW GenericDefParameterClass (&data); \
  259. param->Set_Class_ID (root_class_id); \
  260. param->Set_Name (#data); \
  261. plist_##_class.Add (param); }
  262. #else
  263. #define DECLARE_EDITABLE(_class, _parent)
  264. #define EDITABLE_PARAM(_class, type, data)
  265. #define NAMED_EDITABLE_PARAM(_class, type, data, name)
  266. #define INT_EDITABLE_PARAM(_class, data, min, max)
  267. #define INT_UNITS_PARAM(_class, data, min, max, unitsname)
  268. #define NAMED_INT_UNITS_PARAM(_class,data,min,max,unitsname,name)
  269. #define FLOAT_EDITABLE_PARAM(_class, data, min, max)
  270. #define FLOAT_UNITS_PARAM(_class, data, min, max, unitsname)
  271. #define NAMED_FLOAT_UNITS_PARAM(_class, data, min, max, unitsname,name)
  272. #define ANGLE_EDITABLE_PARAM(_class, data, min, max)
  273. #define NAMED_ANGLE_EDITABLE_PARAM(_class, data, min, max, name)
  274. #define GENERIC_EDITABLE_PARAM(_class, param)
  275. #define MODEL_DEF_PARAM(_class, data, name)
  276. #define PHYS_DEF_PARAM(_class, data, name)
  277. #define SCRIPT_PARAM(_class, name, params)
  278. #define SCRIPTLIST_PARAM(_class, name, name_list, param_list)
  279. #define ENUM_PARAM(_class, data, params)
  280. #define FILENAME_PARAM(_class, data, desc, extension)
  281. #define NAMED_FILENAME_PARAM(_class, data, name, desc, extension)
  282. #define TEXTURE_FILENAME_PARAM(_class, data, desc, extension)
  283. #define NAMED_TEXTURE_FILENAME_PARAM(_class, data, name, desc, extension)
  284. #define DEFIDLIST_PARAM(_class, data, root_class_id)
  285. #define CLASSID_DEFIDLIST_PARAM(_class, data, root_class_id, class_id, name)
  286. #define ZONE_PARAM(_class, data, name)
  287. #define PARAM_SEPARATOR(_class, name)
  288. #define GENERIC_DEFID_PARAM(_class, data, root_class_id)
  289. #endif //PARAM_EDITING_ON
  290. #endif //__EDITABLE_H