ModuleFactory.cpp 25 KB

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