TransitionDamageFX.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: TransitionDamageFX.h /////////////////////////////////////////////////////////////////////
  24. // Author: Colin Day, March 2002
  25. // Desc: Damage module capable of launching various effects on damage transitions
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27. #pragma once
  28. #ifndef __TRANSITIONDAMAGEFX_H_
  29. #define __TRANSITIONDAMAGEFX_H_
  30. // USER INCLUDES //////////////////////////////////////////////////////////////////////////////////
  31. #include "GameClient/ParticleSys.h"
  32. #include "GameLogic/Module/DamageModule.h"
  33. #include "GameLogic/Module/BodyModule.h"
  34. // FORWARD REFERENCES /////////////////////////////////////////////////////////////////////////////
  35. class Thing;
  36. class FXList;
  37. class ObjectCreationList;
  38. class ParticleSystemTemplate;
  39. // we can have this many effects of each type per body state
  40. // NOTE: If you change this you should update the dataFieldParse[] table in the FXDamageModuleData
  41. // to allow for the new indices into the effect arrays
  42. enum { DAMAGE_MODULE_MAX_FX = 12 };
  43. typedef Char FXDamageLocType;
  44. enum
  45. {
  46. FX_DAMAGE_LOC_TYPE_BONE = 0,
  47. FX_DAMAGE_LOC_TYPE_COORD = 1
  48. };
  49. //-------------------------------------------------------------------------------------------------
  50. //-------------------------------------------------------------------------------------------------
  51. struct FXLocInfo
  52. {
  53. FXDamageLocType locType; // location is bone or coord
  54. AsciiString boneName; // bone name to use for effect pos
  55. Bool randomBone; // if true, boneName is a prefix and we will do the effect at one of the bones with that prefix
  56. Coord3D loc; // location is a specified point in space
  57. };
  58. //-------------------------------------------------------------------------------------------------
  59. //-------------------------------------------------------------------------------------------------
  60. struct FXDamageFXListInfo
  61. {
  62. const FXList *fx;
  63. FXLocInfo locInfo;
  64. };
  65. //-------------------------------------------------------------------------------------------------
  66. //-------------------------------------------------------------------------------------------------
  67. struct FXDamageOCLInfo
  68. {
  69. const ObjectCreationList *ocl;
  70. FXLocInfo locInfo;
  71. };
  72. //-------------------------------------------------------------------------------------------------
  73. //-------------------------------------------------------------------------------------------------
  74. struct FXDamageParticleSystemInfo
  75. {
  76. const ParticleSystemTemplate *particleSysTemplate;
  77. FXLocInfo locInfo;
  78. };
  79. //-------------------------------------------------------------------------------------------------
  80. //-------------------------------------------------------------------------------------------------
  81. class TransitionDamageFXModuleData : public DamageModuleData
  82. {
  83. public:
  84. TransitionDamageFXModuleData( void );
  85. static void buildFieldParse(MultiIniFieldParse& p)
  86. {
  87. DamageModuleData::buildFieldParse(p);
  88. static const FieldParse dataFieldParse[] =
  89. {
  90. { "DamageFXTypes", INI::parseDamageTypeFlags, NULL, offsetof( TransitionDamageFXModuleData, m_damageFXTypes ) },
  91. { "DamageOCLTypes", INI::parseDamageTypeFlags, NULL, offsetof( TransitionDamageFXModuleData, m_damageOCLTypes ) },
  92. { "DamageParticleTypes", INI::parseDamageTypeFlags, NULL, offsetof( TransitionDamageFXModuleData, m_damageParticleTypes ) },
  93. { "DamagedFXList1", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 0 ] ) },
  94. { "DamagedFXList2", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 1 ] ) },
  95. { "DamagedFXList3", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 2 ] ) },
  96. { "DamagedFXList4", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 3 ] ) },
  97. { "DamagedFXList5", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 4 ] ) },
  98. { "DamagedFXList6", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 5 ] ) },
  99. { "DamagedFXList7", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 6 ] ) },
  100. { "DamagedFXList8", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 7 ] ) },
  101. { "DamagedFXList9", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 8 ] ) },
  102. { "DamagedFXList10", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 9 ] ) },
  103. { "DamagedFXList11", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 10 ] ) },
  104. { "DamagedFXList12", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_DAMAGED ][ 11 ] ) },
  105. { "ReallyDamagedFXList1", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 0 ] ) },
  106. { "ReallyDamagedFXList2", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 1 ] ) },
  107. { "ReallyDamagedFXList3", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 2 ] ) },
  108. { "ReallyDamagedFXList4", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 3 ] ) },
  109. { "ReallyDamagedFXList5", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 4 ] ) },
  110. { "ReallyDamagedFXList6", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 5 ] ) },
  111. { "ReallyDamagedFXList7", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 6 ] ) },
  112. { "ReallyDamagedFXList8", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 7 ] ) },
  113. { "ReallyDamagedFXList9", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 8 ] ) },
  114. { "ReallyDamagedFXList10", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 9 ] ) },
  115. { "ReallyDamagedFXList11", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 10 ] ) },
  116. { "ReallyDamagedFXList12", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_REALLYDAMAGED ][ 11 ] ) },
  117. { "RubbleFXList1", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 0 ] ) },
  118. { "RubbleFXList2", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 1 ] ) },
  119. { "RubbleFXList3", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 2 ] ) },
  120. { "RubbleFXList4", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 3 ] ) },
  121. { "RubbleFXList5", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 4 ] ) },
  122. { "RubbleFXList6", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 5 ] ) },
  123. { "RubbleFXList7", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 6 ] ) },
  124. { "RubbleFXList8", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 7 ] ) },
  125. { "RubbleFXList9", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 8 ] ) },
  126. { "RubbleFXList10", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 9 ] ) },
  127. { "RubbleFXList11", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 10 ] ) },
  128. { "RubbleFXList12", TransitionDamageFXModuleData::parseFXList, NULL, offsetof( TransitionDamageFXModuleData, m_fxList[ BODY_RUBBLE ][ 11 ] ) },
  129. { "DamagedOCL1", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 0 ] ) },
  130. { "DamagedOCL2", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 1 ] ) },
  131. { "DamagedOCL3", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 2 ] ) },
  132. { "DamagedOCL4", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 3 ] ) },
  133. { "DamagedOCL5", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 4 ] ) },
  134. { "DamagedOCL6", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 5 ] ) },
  135. { "DamagedOCL7", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 6 ] ) },
  136. { "DamagedOCL8", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 7 ] ) },
  137. { "DamagedOCL9", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 8 ] ) },
  138. { "DamagedOCL10", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 9 ] ) },
  139. { "DamagedOCL11", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 10 ] ) },
  140. { "DamagedOCL12", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_DAMAGED ][ 11 ] ) },
  141. { "ReallyDamagedOCL1", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 0 ] ) },
  142. { "ReallyDamagedOCL2", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 1 ] ) },
  143. { "ReallyDamagedOCL3", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 2 ] ) },
  144. { "ReallyDamagedOCL4", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 3 ] ) },
  145. { "ReallyDamagedOCL5", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 4 ] ) },
  146. { "ReallyDamagedOCL6", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 5 ] ) },
  147. { "ReallyDamagedOCL7", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 6 ] ) },
  148. { "ReallyDamagedOCL8", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 7 ] ) },
  149. { "ReallyDamagedOCL9", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 8 ] ) },
  150. { "ReallyDamagedOCL10", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 9 ] ) },
  151. { "ReallyDamagedOCL11", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 10 ] ) },
  152. { "ReallyDamagedOCL12", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_REALLYDAMAGED ][ 11 ] ) },
  153. { "RubbleOCL1", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 0 ] ) },
  154. { "RubbleOCL2", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 1 ] ) },
  155. { "RubbleOCL3", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 2 ] ) },
  156. { "RubbleOCL4", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 3 ] ) },
  157. { "RubbleOCL5", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 4 ] ) },
  158. { "RubbleOCL6", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 5 ] ) },
  159. { "RubbleOCL7", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 6 ] ) },
  160. { "RubbleOCL8", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 7 ] ) },
  161. { "RubbleOCL9", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 8 ] ) },
  162. { "RubbleOCL10", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 9 ] ) },
  163. { "RubbleOCL11", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 10 ] ) },
  164. { "RubbleOCL12", TransitionDamageFXModuleData::parseObjectCreationList, NULL, offsetof( TransitionDamageFXModuleData, m_OCL[ BODY_RUBBLE ][ 11 ] ) },
  165. { "DamagedParticleSystem1", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 0 ] ) },
  166. { "DamagedParticleSystem2", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 1 ] ) },
  167. { "DamagedParticleSystem3", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 2 ] ) },
  168. { "DamagedParticleSystem4", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 3 ] ) },
  169. { "DamagedParticleSystem5", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 4 ] ) },
  170. { "DamagedParticleSystem6", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 5 ] ) },
  171. { "DamagedParticleSystem7", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 6 ] ) },
  172. { "DamagedParticleSystem8", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 7 ] ) },
  173. { "DamagedParticleSystem9", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 8 ] ) },
  174. { "DamagedParticleSystem10", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 9 ] ) },
  175. { "DamagedParticleSystem11", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 10 ] ) },
  176. { "DamagedParticleSystem12", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_DAMAGED ][ 11 ] ) },
  177. { "ReallyDamagedParticleSystem1", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 0 ] ) },
  178. { "ReallyDamagedParticleSystem2", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 1 ] ) },
  179. { "ReallyDamagedParticleSystem3", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 2 ] ) },
  180. { "ReallyDamagedParticleSystem4", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 3 ] ) },
  181. { "ReallyDamagedParticleSystem5", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 4 ] ) },
  182. { "ReallyDamagedParticleSystem6", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 5 ] ) },
  183. { "ReallyDamagedParticleSystem7", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 6 ] ) },
  184. { "ReallyDamagedParticleSystem8", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 7 ] ) },
  185. { "ReallyDamagedParticleSystem9", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 8 ] ) },
  186. { "ReallyDamagedParticleSystem10", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 9 ] ) },
  187. { "ReallyDamagedParticleSystem11", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 10 ] ) },
  188. { "ReallyDamagedParticleSystem12", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_REALLYDAMAGED ][ 11 ] ) },
  189. { "RubbleParticleSystem1", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 0 ] ) },
  190. { "RubbleParticleSystem2", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 1 ] ) },
  191. { "RubbleParticleSystem3", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 2 ] ) },
  192. { "RubbleParticleSystem4", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 3 ] ) },
  193. { "RubbleParticleSystem5", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 4 ] ) },
  194. { "RubbleParticleSystem6", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 5 ] ) },
  195. { "RubbleParticleSystem7", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 6 ] ) },
  196. { "RubbleParticleSystem8", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 7 ] ) },
  197. { "RubbleParticleSystem9", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 8 ] ) },
  198. { "RubbleParticleSystem10", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 9 ] ) },
  199. { "RubbleParticleSystem11", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 10 ] ) },
  200. { "RubbleParticleSystem12", TransitionDamageFXModuleData::parseParticleSystem, NULL, offsetof( TransitionDamageFXModuleData, m_particleSystem[ BODY_RUBBLE ][ 11 ] ) },
  201. { 0, 0, 0, 0 }
  202. };
  203. p.add(dataFieldParse);
  204. }
  205. static void parseFXList( INI *ini, void *instance, void *store, const void *userData );
  206. static void parseObjectCreationList( INI *ini, void *instance, void *store, const void *userData );
  207. static void parseParticleSystem( INI *ini, void *instance, void *store, const void *userData );
  208. DamageTypeFlags m_damageFXTypes; ///< flags used to play or not play the effects
  209. FXDamageFXListInfo m_fxList[ BODYDAMAGETYPE_COUNT ][ DAMAGE_MODULE_MAX_FX ];
  210. DamageTypeFlags m_damageOCLTypes; ///< flags used to play or not play the effects
  211. FXDamageOCLInfo m_OCL[ BODYDAMAGETYPE_COUNT ][ DAMAGE_MODULE_MAX_FX ];
  212. DamageTypeFlags m_damageParticleTypes; ///< flags used to play or not play the effects
  213. FXDamageParticleSystemInfo m_particleSystem[ BODYDAMAGETYPE_COUNT ][ DAMAGE_MODULE_MAX_FX ];
  214. };
  215. //-------------------------------------------------------------------------------------------------
  216. class TransitionDamageFX : public DamageModule
  217. {
  218. MAKE_STANDARD_MODULE_MACRO_WITH_MODULE_DATA( TransitionDamageFX, TransitionDamageFXModuleData );
  219. MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( TransitionDamageFX, "TransitionDamageFX" )
  220. public:
  221. TransitionDamageFX( Thing *thing, const ModuleData* moduleData );
  222. // virtual destructor prototype provided by memory pool declaration
  223. virtual void onDamage( DamageInfo *damageInfo ) { }
  224. virtual void onHealing( DamageInfo *damageInfo ) { }
  225. virtual void onBodyDamageStateChange( const DamageInfo* damageInfo,
  226. BodyDamageType oldState,
  227. BodyDamageType newState );
  228. protected:
  229. /// we keep a record of attached particle system so we can detach and kill them when we want to
  230. ParticleSystemID m_particleSystemID[ BODYDAMAGETYPE_COUNT ][ DAMAGE_MODULE_MAX_FX ];
  231. };
  232. #endif // end __TRANSITIONDAMAGEFX