ModuleFactory.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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: ModuleFactory.cpp ////////////////////////////////////////////////////////////////////////
  24. // Author: Colin Day, September 2001
  25. // Desc: TheModuleFactory is where we actually instance modules for objects
  26. // and drawbles. Those modules are things such as an UpdateModule
  27. // or DamageModule or DrawModule etc.
  28. //
  29. // TheModuleFactory will contain a list of ModuleTemplates, when we
  30. // request a new module, we will look for that template in our
  31. // list and create it
  32. //
  33. ///////////////////////////////////////////////////////////////////////////////////////////////////
  34. // INCLUDES ///////////////////////////////////////////////////////////////////////////////////////
  35. #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
  36. #include "Common/Module.h"
  37. #include "Common/ModuleFactory.h"
  38. #include "Common/NameKeyGenerator.h"
  39. // behavior includes
  40. #include "GameLogic/Module/AutoHealBehavior.h"
  41. #include "GameLogic/Module/GrantStealthBehavior.h"
  42. #include "GameLogic/Module/NeutronBlastBehavior.h"
  43. #include "GameLogic/Module/BehaviorModule.h"
  44. #include "GameLogic/Module/BridgeBehavior.h"
  45. #include "GameLogic/Module/BridgeScaffoldBehavior.h"
  46. #include "GameLogic/Module/BridgeTowerBehavior.h"
  47. #include "GameLogic/Module/CountermeasuresBehavior.h"
  48. #include "GameLogic/Module/DumbProjectileBehavior.h"
  49. #include "GameLogic/Module/InstantDeathBehavior.h"
  50. #include "GameLogic/Module/SlowDeathBehavior.h"
  51. #include "GameLogic/Module/HelicopterSlowDeathUpdate.h"
  52. #include "GameLogic/Module/NeutronMissileSlowDeathUpdate.h"
  53. #include "GameLogic/Module/CaveContain.h"
  54. #include "GameLogic/Module/OpenContain.h"
  55. #include "GameLogic/Module/OverchargeBehavior.h"
  56. #include "GameLogic/Module/HealContain.h"
  57. #include "GameLogic/Module/GarrisonContain.h"
  58. #include "GameLogic/Module/InternetHackContain.h"
  59. #include "GameLogic/Module/RailedTransportContain.h"
  60. #include "GameLogic/Module/RiderChangeContain.h"
  61. #include "GameLogic/Module/TransportContain.h"
  62. #include "GameLogic/Module/MobNexusContain.h"
  63. #include "GameLogic/Module/TunnelContain.h"
  64. #include "GameLogic/Module/OverlordContain.h"
  65. #include "GameLogic/Module/HelixContain.h"
  66. #include "GameLogic/Module/ParachuteContain.h"
  67. #ifdef ALLOW_SURRENDER
  68. #include "GameLogic/Module/POWTruckBehavior.h"
  69. #include "GameLogic/Module/PrisonBehavior.h"
  70. #include "GameLogic/Module/PropagandaCenterBehavior.h"
  71. #endif
  72. #include "GameLogic/Module/PropagandaTowerBehavior.h"
  73. #include "GameLogic/Module/BunkerBusterBehavior.h"
  74. #include "GameLogic/Module/FireWeaponWhenDamagedBehavior.h"
  75. #include "GameLogic/Module/FireWeaponWhenDeadBehavior.h"
  76. #include "GameLogic/Module/GenerateMinefieldBehavior.h"
  77. #include "GameLogic/Module/ParkingPlaceBehavior.h"
  78. #include "GameLogic/Module/FlightDeckBehavior.h"
  79. #include "GameLogic/Module/PoisonedBehavior.h"
  80. #include "GameLogic/Module/RebuildHoleBehavior.h"
  81. #include "GameLogic/Module/SupplyWarehouseCripplingBehavior.h"
  82. #include "GameLogic/Module/TechBuildingBehavior.h"
  83. #include "GameLogic/Module/MinefieldBehavior.h"
  84. #include "GameLogic/Module/BattleBusSlowDeathBehavior.h"
  85. #include "GameLogic/Module/JetSlowDeathBehavior.h"
  86. // die includes
  87. #include "GameLogic/Module/CreateCrateDie.h"
  88. #include "GameLogic/Module/CreateObjectDie.h"
  89. #include "GameLogic/Module/CrushDie.h"
  90. #include "GameLogic/Module/DamDie.h"
  91. #include "GameLogic/Module/DestroyDie.h"
  92. #include "GameLogic/Module/EjectPilotDie.h"
  93. #include "GameLogic/Module/FXListDie.h"
  94. #include "GameLogic/Module/RebuildHoleExposeDie.h"
  95. #include "GameLogic/Module/SpecialPowerCompletionDie.h"
  96. #include "GameLogic/Module/UpgradeDie.h"
  97. #include "GameLogic/Module/KeepObjectDie.h"
  98. // logic update includes
  99. #include "GameLogic/Module/AIUpdate.h"
  100. #include "GameLogic/Module/AnimationSteeringUpdate.h"
  101. #include "GameLogic/Module/AssistedTargetingUpdate.h"
  102. #include "GameLogic/Module/BaseRegenerateUpdate.h"
  103. #include "GameLogic/Module/BoneFXUpdate.h"
  104. #include "GameLogic/Module/ChinookAIUpdate.h"
  105. #include "GameLogic/Module/DefaultProductionExitUpdate.h"
  106. #include "GameLogic/Module/DeletionUpdate.h"
  107. #include "GameLogic/Module/SmartBombTargetHomingUpdate.h"
  108. #include "GameLogic/Module/DeliverPayloadAIUpdate.h"
  109. #include "GameLogic/Module/DozerAIUpdate.h"
  110. #include "GameLogic/Module/DynamicGeometryInfoUpdate.h"
  111. #include "GameLogic/Module/DynamicShroudClearingRangeUpdate.h"
  112. #include "GameLogic/Module/EnemyNearUpdate.h"
  113. #include "GameLogic/Module/FireSpreadUpdate.h"
  114. #include "GameLogic/Module/FirestormDynamicGeometryInfoUpdate.h"
  115. #include "GameLogic/Module/FireWeaponUpdate.h"
  116. #include "GameLogic/Module/FlammableUpdate.h"
  117. #include "GameLogic/Module/FloatUpdate.h"
  118. #include "GameLogic/Module/TensileFormationUpdate.h"
  119. #include "GameLogic/Module/HackInternetAIUpdate.h"
  120. #include "GameLogic/Module/DeployStyleAIUpdate.h"
  121. #include "GameLogic/Module/AssaultTransportAIUpdate.h"
  122. #include "GameLogic/Module/HeightDieUpdate.h"
  123. #include "GameLogic/Module/HordeUpdate.h"
  124. #include "GameLogic/Module/JetAIUpdate.h"
  125. #include "GameLogic/Module/LaserUpdate.h"
  126. #include "GameLogic/Module/PointDefenseLaserUpdate.h"
  127. #include "GameLogic/Module/CleanupHazardUpdate.h"
  128. #include "GameLogic/Module/AutoFindHealingUpdate.h"
  129. #include "GameLogic/Module/CommandButtonHuntUpdate.h"
  130. #include "GameLogic/Module/PilotFindVehicleUpdate.h"
  131. #include "GameLogic/Module/DemoTrapUpdate.h"
  132. #include "GameLogic/Module/ParticleUplinkCannonUpdate.h"
  133. #include "GameLogic/Module/SpectreGunshipUpdate.h"
  134. #include "GameLogic/Module/SpectreGunshipDeploymentUpdate.h"
  135. #include "GameLogic/Module/BaikonurLaunchPower.h"
  136. #include "GameLogic/Module/BattlePlanUpdate.h"
  137. #include "GameLogic/Module/LifetimeUpdate.h"
  138. #include "GameLogic/Module/RadiusDecalUpdate.h"
  139. #include "GameLogic/Module/AutoDepositUpdate.h"
  140. #include "GameLogic/Module/MissileAIUpdate.h"
  141. #include "GameLogic/Module/NeutronMissileUpdate.h"
  142. #include "GameLogic/Module/OCLUpdate.h"
  143. #include "GameLogic/Module/PhysicsUpdate.h"
  144. #ifdef ALLOW_SURRENDER
  145. #include "GameLogic/Module/POWTruckAIUpdate.h"
  146. #endif
  147. #include "GameLogic/Module/ProductionUpdate.h"
  148. #include "GameLogic/Module/ProjectileStreamUpdate.h"
  149. #include "GameLogic/Module/ProneUpdate.h"
  150. #include "GameLogic/Module/QueueProductionExitUpdate.h"
  151. #include "GameLogic/Module/RadarUpdate.h"
  152. #include "GameLogic/Module/RepairDockUpdate.h"
  153. #ifdef ALLOW_SURRENDER
  154. #include "GameLogic/Module/PrisonDockUpdate.h"
  155. #endif
  156. #include "GameLogic/Module/RailedTransportDockUpdate.h"
  157. #include "GameLogic/Module/RailedTransportAIUpdate.h"
  158. #include "GameLogic/Module/RailroadGuideAIUpdate.h"
  159. #include "GameLogic/Module/SlavedUpdate.h"
  160. #include "GameLogic/Module/MobMemberSlavedUpdate.h"
  161. #include "GameLogic/Module/SpecialAbilityUpdate.h"
  162. #include "GameLogic/Module/MissileLauncherBuildingUpdate.h"
  163. #include "GameLogic/Module/StealthDetectorUpdate.h"
  164. #include "GameLogic/Module/StealthUpdate.h"
  165. #include "GameLogic/Module/SpawnPointProductionExitUpdate.h"
  166. #include "GameLogic/Module/SpawnBehavior.h"
  167. #include "GameLogic/Module/SpyVisionUpdate.h"
  168. #include "GameLogic/Module/StickyBombUpdate.h"
  169. #include "GameLogic/Module/FireOCLAfterWeaponCooldownUpdate.h"
  170. #include "GameLogic/Module/HijackerUpdate.h"
  171. #include "GameLogic/Module/StructureCollapseUpdate.h"
  172. #include "GameLogic/Module/StructureToppleUpdate.h"
  173. #include "GameLogic/Module/SupplyCenterDockUpdate.h"
  174. #include "GameLogic/Module/SupplyCenterProductionExitUpdate.h"
  175. #include "GameLogic/Module/SupplyTruckAIUpdate.h"
  176. #include "GameLogic/Module/SupplyWarehouseDockUpdate.h"
  177. #include "GameLogic/Module/ToppleUpdate.h"
  178. #include "GameLogic/Module/TransportAIUpdate.h"
  179. #include "GameLogic/Module/WanderAIUpdate.h"
  180. #include "GameLogic/Module/WaveGuideUpdate.h"
  181. #include "GameLogic/Module/WeaponBonusUpdate.h"
  182. #include "GameLogic/Module/WorkerAIUpdate.h"
  183. #include "GameLogic/Module/PowerPlantUpdate.h"
  184. #include "GameLogic/Module/CheckpointUpdate.h"
  185. #include "GameLogic/Module/EMPUpdate.h"
  186. // upgrade includes
  187. #include "GameLogic/Module/ActiveShroudUpgrade.h"
  188. #include "GameLogic/Module/ArmorUpgrade.h"
  189. #include "GameLogic/Module/CommandSetUpgrade.h"
  190. #include "GameLogic/Module/GrantScienceUpgrade.h"
  191. #include "GameLogic/Module/PassengersFireUpgrade.h"
  192. #include "GameLogic/Module/LocomotorSetUpgrade.h"
  193. #include "GameLogic/Module/ObjectCreationUpgrade.h"
  194. #include "GameLogic/Module/RadarUpgrade.h"
  195. #include "GameLogic/Module/PowerPlantUpgrade.h"
  196. #include "GameLogic/Module/ReplaceObjectUpgrade.h"
  197. #include "GameLogic/Module/ModelConditionUpgrade.h"
  198. #include "GameLogic/Module/StatusBitsUpgrade.h"
  199. #include "GameLogic/Module/SubObjectsUpgrade.h"
  200. #include "GameLogic/Module/StealthUpgrade.h"
  201. #include "GameLogic/Module/UnpauseSpecialPowerUpgrade.h"
  202. #include "GameLogic/Module/WeaponBonusUpgrade.h"
  203. #include "GameLogic/Module/WeaponSetUpgrade.h"
  204. #include "GameLogic/Module/WeaponBonusUpgrade.h"
  205. #include "GameLogic/Module/CostModifierUpgrade.h"
  206. #include "GameLogic/Module/ExperienceScalarUpgrade.h"
  207. #include "GameLogic/Module/MaxHealthUpgrade.h"
  208. // create includes
  209. #include "GameLogic/Module/LockWeaponCreate.h"
  210. #include "GameLogic/Module/SupplyCenterCreate.h"
  211. #include "GameLogic/Module/SupplyWarehouseCreate.h"
  212. #include "GameLogic/Module/GrantUpgradeCreate.h"
  213. #include "GameLogic/Module/PreorderCreate.h"
  214. #include "GameLogic/Module/SpecialPowerCreate.h"
  215. #include "GameLogic/Module/VeterancyGainCreate.h"
  216. // damage includes
  217. #include "GameLogic/Module/BoneFXDamage.h"
  218. #include "GameLogic/Module/TransitionDamageFX.h"
  219. // collide includes
  220. #include "GameLogic/Module/FireWeaponCollide.h"
  221. #include "GameLogic/Module/SquishCollide.h"
  222. #include "GameLogic/Module/ConvertToCarBombCrateCollide.h"
  223. #include "GameLogic/Module/ConvertToHijackedVehicleCrateCollide.h"
  224. #include "GameLogic/Module/HealCrateCollide.h"
  225. #include "GameLogic/Module/MoneyCrateCollide.h"
  226. #include "GameLogic/Module/SabotageCommandCenterCrateCollide.h"
  227. #include "GameLogic/Module/SabotageFakeBuildingCrateCollide.h"
  228. #include "GameLogic/Module/SabotageInternetCenterCrateCollide.h"
  229. #include "GameLogic/Module/SabotageMilitaryFactoryCrateCollide.h"
  230. #include "GameLogic/Module/SabotagePowerPlantCrateCollide.h"
  231. #include "GameLogic/Module/SabotageSuperweaponCrateCollide.h"
  232. #include "GameLogic/Module/SabotageSupplyCenterCrateCollide.h"
  233. #include "GameLogic/Module/SabotageSupplyDropzoneCrateCollide.h"
  234. #include "GameLogic/Module/SalvageCrateCollide.h"
  235. #include "GameLogic/Module/ShroudCrateCollide.h"
  236. #include "GameLogic/Module/UnitCrateCollide.h"
  237. #include "GameLogic/Module/VeterancyCrateCollide.h"
  238. // body includes
  239. #include "GameLogic/Module/InactiveBody.h"
  240. #include "GameLogic/Module/ActiveBody.h"
  241. #include "GameLogic/Module/HighlanderBody.h"
  242. #include "GameLogic/Module/ImmortalBody.h"
  243. #include "GameLogic/Module/StructureBody.h"
  244. #include "GameLogic/Module/HiveStructureBody.h"
  245. #include "GameLogic/Module/UndeadBody.h"
  246. // contain includes
  247. // (none)
  248. // special power modules
  249. #include "GameLogic/Module/CashHackSpecialPower.h"
  250. #include "GameLogic/Module/DefectorSpecialPower.h"
  251. #ifdef ALLOW_DEMORALIZE
  252. #include "GameLogic/Module/DemoralizeSpecialPower.h"
  253. #endif
  254. #include "GameLogic/Module/OCLSpecialPower.h"
  255. #include "GameLogic/Module/SpecialAbility.h"
  256. #include "GameLogic/Module/SpyVisionSpecialPower.h"
  257. #include "GameLogic/Module/CashBountyPower.h"
  258. #include "GameLogic/Module/CleanupAreaPower.h"
  259. #include "GameLogic/Module/FireWeaponPower.h"
  260. // destroy includes
  261. // (none)
  262. // client update includes
  263. #include "GameClient/Module/AnimatedParticleSysBoneClientUpdate.h"
  264. #include "GameClient/Module/SwayClientUpdate.h"
  265. #include "GameClient/Module/BeaconClientUpdate.h"
  266. // PUBLIC DATA ////////////////////////////////////////////////////////////////////////////////////
  267. ModuleFactory *TheModuleFactory = NULL; ///< the module factory singleton
  268. // PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////////////////////////
  269. #ifdef _INTERNAL
  270. // for occasional debugging...
  271. //#pragma optimize("", off)
  272. //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes")
  273. #endif
  274. //-------------------------------------------------------------------------------------------------
  275. //-------------------------------------------------------------------------------------------------
  276. ModuleFactory::ModuleFactory( void )
  277. {
  278. m_moduleTemplateMap.clear();
  279. m_moduleDataList.clear();
  280. }
  281. //-------------------------------------------------------------------------------------------------
  282. //-------------------------------------------------------------------------------------------------
  283. ModuleFactory::~ModuleFactory( void )
  284. {
  285. m_moduleTemplateMap.clear();
  286. for (ModuleDataList::iterator i = m_moduleDataList.begin(); i != m_moduleDataList.end(); ++i)
  287. {
  288. const ModuleData* data = *i;
  289. delete data;
  290. }
  291. m_moduleDataList.clear();
  292. }
  293. //-------------------------------------------------------------------------------------------------
  294. /** Initialize the module factory. Any class that needs to be attached
  295. * to objects or drawables as modules needs to add a template
  296. * for that class here */
  297. //-------------------------------------------------------------------------------------------------
  298. void ModuleFactory::init( void )
  299. {
  300. // behavior modules
  301. addModule( AutoHealBehavior );
  302. addModule( GrantStealthBehavior );
  303. addModule( NeutronBlastBehavior );
  304. addModule( BridgeBehavior );
  305. addModule( BridgeScaffoldBehavior );
  306. addModule( BridgeTowerBehavior );
  307. addModule( CountermeasuresBehavior );
  308. addModule( DumbProjectileBehavior );
  309. addModule( PhysicsBehavior );
  310. addModule( InstantDeathBehavior );
  311. addModule( SlowDeathBehavior );
  312. addModule( HelicopterSlowDeathBehavior );
  313. addModule( NeutronMissileSlowDeathBehavior );
  314. addModule( CaveContain );
  315. addModule( OpenContain );
  316. addModule( OverchargeBehavior );
  317. addModule( HealContain );
  318. addModule( GarrisonContain );
  319. addModule( InternetHackContain );
  320. addModule( TransportContain );
  321. addModule( RiderChangeContain );
  322. addModule( RailedTransportContain );
  323. addModule( MobNexusContain );
  324. addModule( TunnelContain );
  325. addModule( OverlordContain );
  326. addModule( HelixContain );
  327. addModule( ParachuteContain );
  328. #ifdef ALLOW_SURRENDER
  329. addModule( POWTruckBehavior );
  330. addModule( PrisonBehavior );
  331. addModule( PropagandaCenterBehavior );
  332. #endif
  333. addModule( PropagandaTowerBehavior );
  334. addModule( BunkerBusterBehavior );
  335. addModule( FireWeaponWhenDamagedBehavior );
  336. addModule( FireWeaponWhenDeadBehavior );
  337. addModule( GenerateMinefieldBehavior );
  338. addModule( ParkingPlaceBehavior );
  339. addModule( FlightDeckBehavior );
  340. addModule( PoisonedBehavior );
  341. addModule( RebuildHoleBehavior );
  342. addModule( SupplyWarehouseCripplingBehavior );
  343. addModule( TechBuildingBehavior );
  344. addModule( MinefieldBehavior );
  345. addModule( BattleBusSlowDeathBehavior );
  346. addModule( JetSlowDeathBehavior );
  347. addModule( RailroadBehavior );
  348. addModule( SpawnBehavior );
  349. // die modules
  350. addModule( DestroyDie );
  351. addModule( FXListDie );
  352. addModule( CrushDie );
  353. addModule( DamDie );
  354. addModule( CreateCrateDie );
  355. addModule( CreateObjectDie );
  356. addModule( EjectPilotDie );
  357. addModule( SpecialPowerCompletionDie );
  358. addModule( RebuildHoleExposeDie );
  359. addModule( UpgradeDie );
  360. addModule( KeepObjectDie );
  361. // update modules
  362. addModule( AssistedTargetingUpdate );
  363. addModule( AutoFindHealingUpdate );
  364. addModule( BaseRegenerateUpdate );
  365. addModule( StealthDetectorUpdate );
  366. addModule( StealthUpdate );
  367. addModule( DeletionUpdate );
  368. addModule( SmartBombTargetHomingUpdate );
  369. addModule( DynamicShroudClearingRangeUpdate );
  370. addModule( DeployStyleAIUpdate );
  371. addModule( AssaultTransportAIUpdate );
  372. addModule( HordeUpdate );
  373. addModule( ToppleUpdate );
  374. addModule( EnemyNearUpdate );
  375. addModule( LifetimeUpdate );
  376. addModule( RadiusDecalUpdate );
  377. addModule( EMPUpdate );
  378. addModule( LeafletDropBehavior );
  379. addModule( AutoDepositUpdate );
  380. addModule( WeaponBonusUpdate );
  381. addModule( MissileAIUpdate );
  382. addModule( NeutronMissileUpdate );
  383. addModule( FireSpreadUpdate );
  384. addModule( FireWeaponUpdate );
  385. addModule( FlammableUpdate );
  386. addModule( FloatUpdate );
  387. addModule( TensileFormationUpdate );
  388. addModule( HeightDieUpdate );
  389. addModule( ChinookAIUpdate );
  390. addModule( JetAIUpdate );
  391. addModule( AIUpdateInterface );
  392. addModule( SupplyTruckAIUpdate );
  393. addModule( DeliverPayloadAIUpdate );
  394. addModule( HackInternetAIUpdate );
  395. addModule( DynamicGeometryInfoUpdate );
  396. addModule( FirestormDynamicGeometryInfoUpdate );
  397. addModule( LaserUpdate );
  398. addModule( PointDefenseLaserUpdate );
  399. addModule( CleanupHazardUpdate );
  400. addModule( CommandButtonHuntUpdate );
  401. addModule( PilotFindVehicleUpdate );
  402. addModule( DemoTrapUpdate );
  403. addModule( ParticleUplinkCannonUpdate );
  404. addModule( SpectreGunshipUpdate );
  405. addModule( SpectreGunshipDeploymentUpdate );
  406. addModule( BaikonurLaunchPower );
  407. addModule( BattlePlanUpdate );
  408. addModule( ProjectileStreamUpdate );
  409. addModule( QueueProductionExitUpdate );
  410. addModule( RepairDockUpdate );
  411. #ifdef ALLOW_SURRENDER
  412. addModule( PrisonDockUpdate );
  413. #endif
  414. addModule( RailedTransportDockUpdate );
  415. addModule( DefaultProductionExitUpdate );
  416. addModule( SpawnPointProductionExitUpdate );
  417. addModule( SpyVisionUpdate );
  418. addModule( SlavedUpdate );
  419. addModule( MobMemberSlavedUpdate );
  420. addModule( OCLUpdate );
  421. addModule( SpecialAbilityUpdate );
  422. addModule( MissileLauncherBuildingUpdate );
  423. addModule( SupplyCenterProductionExitUpdate );
  424. addModule( SupplyCenterDockUpdate );
  425. addModule( SupplyWarehouseDockUpdate );
  426. addModule( DozerAIUpdate );
  427. #ifdef ALLOW_SURRENDER
  428. addModule( POWTruckAIUpdate );
  429. #endif
  430. addModule( RailedTransportAIUpdate );
  431. addModule( ProductionUpdate );
  432. addModule( ProneUpdate );
  433. addModule( StickyBombUpdate );
  434. addModule( FireOCLAfterWeaponCooldownUpdate );
  435. addModule( HijackerUpdate );
  436. addModule( StructureToppleUpdate );
  437. addModule( StructureCollapseUpdate );
  438. addModule( BoneFXUpdate );
  439. addModule( RadarUpdate );
  440. addModule( AnimationSteeringUpdate );
  441. addModule( TransportAIUpdate );
  442. addModule( WanderAIUpdate );
  443. addModule( WaveGuideUpdate );
  444. addModule( WorkerAIUpdate );
  445. addModule( PowerPlantUpdate );
  446. addModule( CheckpointUpdate );
  447. // upgrade modules
  448. addModule( CostModifierUpgrade );
  449. addModule( ActiveShroudUpgrade );
  450. addModule( ArmorUpgrade );
  451. addModule( CommandSetUpgrade );
  452. addModule( GrantScienceUpgrade );
  453. addModule( PassengersFireUpgrade );
  454. addModule( StatusBitsUpgrade );
  455. addModule( SubObjectsUpgrade );
  456. addModule( StealthUpgrade );
  457. addModule( RadarUpgrade );
  458. addModule( PowerPlantUpgrade );
  459. addModule( LocomotorSetUpgrade );
  460. addModule( ObjectCreationUpgrade );
  461. addModule( ReplaceObjectUpgrade );
  462. addModule( ModelConditionUpgrade );
  463. addModule( UnpauseSpecialPowerUpgrade );
  464. addModule( WeaponBonusUpgrade );
  465. addModule( WeaponSetUpgrade );
  466. addModule( WeaponBonusUpgrade );
  467. addModule( ExperienceScalarUpgrade );
  468. addModule( MaxHealthUpgrade );
  469. // create modules
  470. addModule( LockWeaponCreate );
  471. addModule( PreorderCreate );
  472. addModule( SupplyCenterCreate );
  473. addModule( SupplyWarehouseCreate );
  474. addModule( SpecialPowerCreate );
  475. addModule( GrantUpgradeCreate );
  476. addModule( VeterancyGainCreate );
  477. // damage modules
  478. addModule( BoneFXDamage );
  479. addModule( TransitionDamageFX );
  480. // collide modules
  481. addModule( FireWeaponCollide );
  482. addModule( SquishCollide );
  483. addModule( HealCrateCollide );
  484. addModule( MoneyCrateCollide );
  485. addModule( ShroudCrateCollide );
  486. addModule( UnitCrateCollide );
  487. addModule( VeterancyCrateCollide );
  488. addModule( ConvertToCarBombCrateCollide );
  489. addModule( ConvertToHijackedVehicleCrateCollide );
  490. addModule( SabotageCommandCenterCrateCollide );
  491. addModule( SabotageFakeBuildingCrateCollide );
  492. addModule( SabotageInternetCenterCrateCollide );
  493. addModule( SabotageMilitaryFactoryCrateCollide );
  494. addModule( SabotagePowerPlantCrateCollide );
  495. addModule( SabotageSuperweaponCrateCollide );
  496. addModule( SabotageSupplyCenterCrateCollide );
  497. addModule( SabotageSupplyDropzoneCrateCollide );
  498. addModule( SalvageCrateCollide );
  499. // body modules
  500. addModule( InactiveBody );
  501. addModule( ActiveBody );
  502. addModule( HighlanderBody );
  503. addModule( ImmortalBody );
  504. addModule( StructureBody );
  505. addModule( HiveStructureBody );
  506. addModule( UndeadBody );
  507. // contain modules
  508. // (none)
  509. // special power modules
  510. addModule( CashHackSpecialPower );
  511. addModule( DefectorSpecialPower );
  512. #ifdef ALLOW_DEMORALIZE
  513. addModule( DemoralizeSpecialPower );
  514. #endif
  515. addModule( OCLSpecialPower );
  516. addModule( FireWeaponPower );
  517. addModule( SpecialAbility );
  518. addModule( SpyVisionSpecialPower );
  519. addModule( CashBountyPower );
  520. addModule( CleanupAreaPower );
  521. // destroy modules
  522. // (none)
  523. // client update modules
  524. addModule( AnimatedParticleSysBoneClientUpdate );
  525. addModule( SwayClientUpdate );
  526. addModule( BeaconClientUpdate );
  527. } // end init
  528. //-------------------------------------------------------------------------------------------------
  529. Int ModuleFactory::findModuleInterfaceMask(const AsciiString& name, ModuleType type)
  530. {
  531. if (name.isEmpty())
  532. return 0;
  533. const ModuleTemplate* moduleTemplate = findModuleTemplate(name, type);
  534. if (moduleTemplate)
  535. {
  536. return moduleTemplate->m_whichInterfaces;
  537. }
  538. return 0;
  539. }
  540. //-------------------------------------------------------------------------------------------------
  541. ModuleData* ModuleFactory::newModuleDataFromINI(INI* ini, const AsciiString& name, ModuleType type,
  542. const AsciiString& moduleTag)
  543. {
  544. if (name.isEmpty())
  545. return NULL;
  546. const ModuleTemplate* moduleTemplate = findModuleTemplate(name, type);
  547. if (moduleTemplate)
  548. {
  549. ModuleData* md = (*moduleTemplate->m_createDataProc)(ini);
  550. md->setModuleTagNameKey( NAMEKEY( moduleTag ) );
  551. m_moduleDataList.push_back(md);
  552. return md;
  553. }
  554. return NULL;
  555. }
  556. // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////////////////////////
  557. //-------------------------------------------------------------------------------------------------
  558. /*static*/ NameKeyType ModuleFactory::makeDecoratedNameKey(const AsciiString& name, ModuleType type)
  559. {
  560. char tmp[256];
  561. tmp[0] = '0' + (int)type;
  562. strcpy(&tmp[1], name.str());
  563. return TheNameKeyGenerator->nameToKey(tmp);
  564. }
  565. //-------------------------------------------------------------------------------------------------
  566. const ModuleFactory::ModuleTemplate* ModuleFactory::findModuleTemplate(const AsciiString& name, ModuleType type)
  567. {
  568. NameKeyType namekey = makeDecoratedNameKey(name, type);
  569. ModuleTemplateMap::const_iterator it = m_moduleTemplateMap.find(namekey);
  570. if (it == m_moduleTemplateMap.end())
  571. {
  572. DEBUG_CRASH(( "Module name '%s' not found\n", name.str() ));
  573. return NULL;
  574. }
  575. else
  576. {
  577. return &(*it).second;
  578. }
  579. }
  580. //-------------------------------------------------------------------------------------------------
  581. /** Allocate a new acton class istance given the name */
  582. //-------------------------------------------------------------------------------------------------
  583. Module *ModuleFactory::newModule( Thing *thing, const AsciiString& name, const ModuleData* moduleData, ModuleType type )
  584. {
  585. // sanity
  586. if( name.isEmpty() )
  587. {
  588. DEBUG_CRASH(("attempting to create module with empty name\n"));
  589. return NULL;
  590. }
  591. const ModuleTemplate* mt = findModuleTemplate(name, type);
  592. if (mt)
  593. {
  594. Module* mod = (*mt->m_createProc)( thing, moduleData );
  595. #ifdef _DEBUG
  596. if (type == MODULETYPE_BEHAVIOR)
  597. {
  598. BehaviorModule* bm = (BehaviorModule*)mod;
  599. DEBUG_ASSERTCRASH(
  600. ((mt->m_whichInterfaces & (MODULEINTERFACE_BODY)) != 0) == (bm->getBody() != NULL),
  601. ("getInterfaceMask bad for MODULE_BODY (%s)\n",name.str()));
  602. DEBUG_ASSERTCRASH(
  603. ((mt->m_whichInterfaces & (MODULEINTERFACE_COLLIDE)) != 0) == (bm->getCollide() != NULL),
  604. ("getInterfaceMask bad for MODULE_COLLIDE (%s)\n",name.str()));
  605. DEBUG_ASSERTCRASH(
  606. ((mt->m_whichInterfaces & (MODULEINTERFACE_CONTAIN)) != 0) == (bm->getContain() != NULL),
  607. ("getInterfaceMask bad for MODULE_CONTAIN (%s)\n",name.str()));
  608. DEBUG_ASSERTCRASH(
  609. ((mt->m_whichInterfaces & (MODULEINTERFACE_CREATE)) != 0) == (bm->getCreate() != NULL),
  610. ("getInterfaceMask bad for MODULE_CREATE (%s)\n",name.str()));
  611. DEBUG_ASSERTCRASH(
  612. ((mt->m_whichInterfaces & (MODULEINTERFACE_DAMAGE)) != 0) == (bm->getDamage() != NULL),
  613. ("getInterfaceMask bad for MODULE_DAMAGE (%s)\n",name.str()));
  614. DEBUG_ASSERTCRASH(
  615. ((mt->m_whichInterfaces & (MODULEINTERFACE_DESTROY)) != 0) == (bm->getDestroy() != NULL),
  616. ("getInterfaceMask bad for MODULE_DESTROY (%s)\n",name.str()));
  617. DEBUG_ASSERTCRASH(
  618. ((mt->m_whichInterfaces & (MODULEINTERFACE_DIE)) != 0) == (bm->getDie() != NULL),
  619. ("getInterfaceMask bad for MODULE_DIE (%s)\n",name.str()));
  620. DEBUG_ASSERTCRASH(
  621. ((mt->m_whichInterfaces & (MODULEINTERFACE_SPECIAL_POWER)) != 0) == (bm->getSpecialPower() != NULL),
  622. ("getInterfaceMask bad for MODULE_SPECIAL_POWER (%s)\n",name.str()));
  623. DEBUG_ASSERTCRASH(
  624. ((mt->m_whichInterfaces & (MODULEINTERFACE_UPDATE)) != 0) == (bm->getUpdate() != NULL),
  625. ("getInterfaceMask bad for MODULE_UPDATE (%s)\n",name.str()));
  626. DEBUG_ASSERTCRASH(
  627. ((mt->m_whichInterfaces & (MODULEINTERFACE_UPGRADE)) != 0) == (bm->getUpgrade() != NULL),
  628. ("getInterfaceMask bad for MODULE_UPGRADE (%s)\n",name.str()));
  629. }
  630. #endif
  631. return mod;
  632. }
  633. return NULL;
  634. } // end newModule
  635. //-------------------------------------------------------------------------------------------------
  636. /** Add a module template to our list of templates */
  637. //-------------------------------------------------------------------------------------------------
  638. void ModuleFactory::addModuleInternal( NewModuleProc proc, NewModuleDataProc dataproc, ModuleType type, const AsciiString& name, Int whichIntf )
  639. {
  640. NameKeyType namekey = makeDecoratedNameKey(name, type);
  641. ModuleTemplate& mtm = m_moduleTemplateMap[namekey]; // this creates it if it does not exist already
  642. mtm.m_createProc = proc;
  643. mtm.m_createDataProc = dataproc;
  644. mtm.m_whichInterfaces = whichIntf;
  645. }
  646. //-------------------------------------------------------------------------------------------------
  647. void ModuleFactory::crc( Xfer *xfer )
  648. {
  649. for (ModuleDataList::iterator mdIt = m_moduleDataList.begin(); mdIt != m_moduleDataList.end(); ++mdIt)
  650. {
  651. ((ModuleData *)(*mdIt))->crc(xfer);
  652. }
  653. }
  654. //-------------------------------------------------------------------------------------------------
  655. void ModuleFactory::xfer( Xfer *xfer )
  656. {
  657. // version
  658. XferVersion currentVersion = 1;
  659. XferVersion version = currentVersion;
  660. xfer->xferVersion( &version, currentVersion );
  661. for (ModuleDataList::iterator mdIt = m_moduleDataList.begin(); mdIt != m_moduleDataList.end(); ++mdIt)
  662. {
  663. ((ModuleData *)(*mdIt))->xfer(xfer);
  664. }
  665. }
  666. //-------------------------------------------------------------------------------------------------
  667. void ModuleFactory::loadPostProcess( void )
  668. {
  669. }