TerrainRoads.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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: TerrainRoads.h ///////////////////////////////////////////////////////////////////////////
  24. // Author: Colin Day, December 2001
  25. // Desc: Terrain road descriptions
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27. #pragma once
  28. #ifndef __TERRAINROADS_H_
  29. #define __TERRAINROADS_H_
  30. // INCLUDES ///////////////////////////////////////////////////////////////////////////////////////
  31. #include "Common/GameMemory.h"
  32. #include "Common/SubsystemInterface.h"
  33. #include "GameLogic/Module/BodyModule.h"
  34. // FORWARD DECLARATIONS ///////////////////////////////////////////////////////////////////////////
  35. struct FieldParse;
  36. class AsciiString;
  37. // ------------------------------------------------------------------------------------------------
  38. /** Bridges have 4 towers around it that the player can attack or use to repair the bridge */
  39. // ------------------------------------------------------------------------------------------------
  40. enum BridgeTowerType
  41. {
  42. BRIDGE_TOWER_FROM_LEFT = 0,
  43. BRIDGE_TOWER_FROM_RIGHT,
  44. BRIDGE_TOWER_TO_LEFT,
  45. BRIDGE_TOWER_TO_RIGHT,
  46. BRIDGE_MAX_TOWERS ///< keep this last
  47. };
  48. // ------------------------------------------------------------------------------------------------
  49. enum { MAX_BRIDGE_BODY_FX = 3 };
  50. //-------------------------------------------------------------------------------------------------
  51. /** Terrain road description, good for roads and bridges */
  52. //-------------------------------------------------------------------------------------------------
  53. class TerrainRoadType : public MemoryPoolObject
  54. {
  55. MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( TerrainRoadType, "TerrainRoadType" )
  56. public:
  57. TerrainRoadType( void );
  58. // destructor prototypes defined by memory pool object
  59. inline AsciiString getName( void ) { return m_name; }
  60. inline AsciiString getTexture( void ) { return m_texture; }
  61. inline Bool isBridge( void ) { return m_isBridge; }
  62. inline UnsignedInt getID( void ) { return m_id; }
  63. inline Real getRoadWidth( void ) { return m_roadWidth; }
  64. inline Real getRoadWidthInTexture( void ) { return m_roadWidthInTexture; }
  65. inline Real getBridgeScale( void ) { return m_bridgeScale; }
  66. inline AsciiString getScaffoldObjectName( void ) { return m_scaffoldObjectName; }
  67. inline AsciiString getScaffoldSupportObjectName( void ) { return m_scaffoldSupportObjectName; }
  68. inline RGBColor getRadarColor( void ) { return m_radarColor; }
  69. inline AsciiString getBridgeModel( void ) { return m_bridgeModelName; }
  70. inline AsciiString getBridgeModelNameDamaged( void ) { return m_bridgeModelNameDamaged; }
  71. inline AsciiString getBridgeModelNameReallyDamaged( void ) { return m_bridgeModelNameReallyDamaged; }
  72. inline AsciiString getBridgeModelNameBroken( void ) { return m_bridgeModelNameBroken; }
  73. inline AsciiString getTextureDamaged( void ) { return m_textureDamaged; }
  74. inline AsciiString getTextureReallyDamaged( void ) { return m_textureReallyDamaged; }
  75. inline AsciiString getTextureBroken( void ) { return m_textureBroken; }
  76. inline AsciiString getTowerObjectName( BridgeTowerType tower ) { return m_towerObjectName[ tower ]; }
  77. inline AsciiString getDamageToSoundString( BodyDamageType state ) { return m_damageToSoundString[ state ]; }
  78. inline AsciiString getDamageToOCLString( BodyDamageType state, Int index ) { return m_damageToOCLString[ state ][ index ]; }
  79. inline AsciiString getDamageToFXString( BodyDamageType state, Int index ) { return m_damageToFXString[ state ][ index ]; }
  80. inline AsciiString getRepairedToSoundString( BodyDamageType state ) { return m_repairedToSoundString[ state ]; }
  81. inline AsciiString getRepairedToOCLString( BodyDamageType state, Int index ) { return m_repairedToOCLString[ state ][ index ]; }
  82. inline AsciiString getRepairedToFXString( BodyDamageType state, Int index ) { return m_repairedToFXString[ state ][ index ]; }
  83. inline Real getTransitionEffectsHeight( void ) { return m_transitionEffectsHeight; }
  84. inline Int getNumFXPerType( void ) { return m_numFXPerType; }
  85. // friend access methods to be used by the road collection only!
  86. inline void friend_setName( AsciiString name ) { m_name = name; }
  87. inline void friend_setTexture( AsciiString texture ) { m_texture = texture; }
  88. inline void friend_setBridge( Bool isBridge ) { m_isBridge = isBridge; }
  89. inline void friend_setID( UnsignedInt id ) { m_id = id; }
  90. inline void friend_setNext( TerrainRoadType *next ) { m_next = next; }
  91. inline TerrainRoadType *friend_getNext( void ) { return m_next; }
  92. inline void friend_setRoadWidth( Real width ) { m_roadWidth = width; }
  93. inline void friend_setRoadWidthInTexture( Real width ) { m_roadWidthInTexture = width; }
  94. inline void friend_setBridgeScale( Real scale ) { m_bridgeScale = scale; }
  95. inline void friend_setScaffoldObjectName( AsciiString name ) { m_scaffoldObjectName = name; }
  96. inline void friend_setScaffoldSupportObjectName( AsciiString name ) { m_scaffoldSupportObjectName = name; }
  97. inline void friend_setBridgeModelName( AsciiString name ) { m_bridgeModelName = name; }
  98. inline void friend_setBridgeModelNameDamaged( AsciiString name ) { m_bridgeModelNameDamaged = name; }
  99. inline void friend_setBridgeModelNameReallyDamaged( AsciiString name ) { m_bridgeModelNameReallyDamaged = name; }
  100. inline void friend_setBridgeModelNameBroken( AsciiString name ) { m_bridgeModelNameBroken = name; }
  101. inline void friend_setTextureDamaged( AsciiString texture ) { m_textureDamaged = texture; }
  102. inline void friend_setTextureReallyDamaged( AsciiString texture ) { m_textureReallyDamaged = texture; }
  103. inline void friend_setTextureBroken( AsciiString texture ) { m_textureBroken = texture; }
  104. inline void friend_setTowerObjectName( BridgeTowerType tower, AsciiString name ) { m_towerObjectName[ tower ] = name; }
  105. inline void friend_setDamageToSoundString( BodyDamageType state, AsciiString s ) { m_damageToSoundString[ state ] = s; }
  106. inline void friend_setDamageToOCLString( BodyDamageType state, Int index, AsciiString s ) { m_damageToOCLString[ state ][ index ] = s; }
  107. inline void friend_setDamageToFXString( BodyDamageType state, Int index, AsciiString s ) { m_damageToFXString[ state ][ index ] = s; }
  108. inline void friend_setRepairedToSoundString( BodyDamageType state, AsciiString s ) { m_repairedToSoundString[ state ] = s; }
  109. inline void friend_setRepairedToOCLString( BodyDamageType state, Int index, AsciiString s ) { m_repairedToOCLString[ state ][ index ] = s; }
  110. inline void friend_setRepairedToFXString( BodyDamageType state, Int index, AsciiString s ) { m_repairedToFXString[ state ][ index ] = s; }
  111. inline void friend_setTransitionEffectsHeight( Real height ) { m_transitionEffectsHeight = height; }
  112. inline void friend_setNumFXPerType( Int num ) { m_numFXPerType = num; }
  113. /// get the parsing table for INI
  114. const FieldParse *getRoadFieldParse( void ) { return m_terrainRoadFieldParseTable; }
  115. const FieldParse *getBridgeFieldParse( void ) { return m_terrainBridgeFieldParseTable; }
  116. protected:
  117. AsciiString m_name; ///< entry name
  118. Bool m_isBridge; ///< true if entry is for a bridge
  119. UnsignedInt m_id; ///< unique id
  120. TerrainRoadType *m_next; ///< next in road list
  121. // for parsing from INI
  122. static const FieldParse m_terrainRoadFieldParseTable[]; ///< the parse table for INI definition
  123. static const FieldParse m_terrainBridgeFieldParseTable[]; ///< the parse table for INI definition
  124. static void parseTransitionToOCL( INI *ini, void *instance, void *store, const void *userData );
  125. static void parseTransitionToFX( INI *ini, void *instance, void *store, const void *userData );
  126. //
  127. // *note* I would union the road and bridge data, but unions can't have a copy
  128. // constructor such as the AsciiString does
  129. //
  130. // road data
  131. Real m_roadWidth; ///< width of road
  132. Real m_roadWidthInTexture; ///< width of road in the texture
  133. // bridge data
  134. Real m_bridgeScale; ///< scale for bridge
  135. AsciiString m_scaffoldObjectName; ///< scaffold object name
  136. AsciiString m_scaffoldSupportObjectName; ///< scaffold support object name
  137. RGBColor m_radarColor; ///< color for this bridge on the radar
  138. AsciiString m_bridgeModelName; ///< model name for bridge
  139. AsciiString m_texture; ///< texture filename
  140. AsciiString m_bridgeModelNameDamaged; ///< model name for bridge
  141. AsciiString m_textureDamaged; ///< model name for bridge
  142. AsciiString m_bridgeModelNameReallyDamaged; ///< model name for bridge
  143. AsciiString m_textureReallyDamaged; ///< model name for bridge
  144. AsciiString m_bridgeModelNameBroken; ///< model name for bridge
  145. AsciiString m_textureBroken; ///< model name for bridge
  146. AsciiString m_towerObjectName[ BRIDGE_MAX_TOWERS ]; ///< object names for the targetable towers on the bridge
  147. //
  148. // the following strings are for repair/damage transition events, what sounds to
  149. // play and a collection of OCL and FX lists to play over the bridge area
  150. //
  151. AsciiString m_damageToSoundString[ BODYDAMAGETYPE_COUNT ];
  152. AsciiString m_damageToOCLString[ BODYDAMAGETYPE_COUNT ][ MAX_BRIDGE_BODY_FX ];
  153. AsciiString m_damageToFXString[ BODYDAMAGETYPE_COUNT ][ MAX_BRIDGE_BODY_FX ];
  154. AsciiString m_repairedToSoundString[ BODYDAMAGETYPE_COUNT ];
  155. AsciiString m_repairedToOCLString[ BODYDAMAGETYPE_COUNT ][ MAX_BRIDGE_BODY_FX ];
  156. AsciiString m_repairedToFXString[ BODYDAMAGETYPE_COUNT ][ MAX_BRIDGE_BODY_FX ];
  157. Real m_transitionEffectsHeight;
  158. Int m_numFXPerType; ///< for *each* fx/ocl we will make this many of them on the bridge area
  159. };
  160. //-------------------------------------------------------------------------------------------------
  161. /** Collection of all roads and bridges */
  162. //-------------------------------------------------------------------------------------------------
  163. class TerrainRoadCollection : public SubsystemInterface
  164. {
  165. public:
  166. TerrainRoadCollection( void );
  167. ~TerrainRoadCollection( void );
  168. void init() { }
  169. void reset() { }
  170. void update() { }
  171. TerrainRoadType *findRoad( AsciiString name ); ///< find road with matching name
  172. TerrainRoadType *newRoad( AsciiString name ); ///< allocate new road, assing name, and link to list
  173. TerrainRoadType *firstRoad( void ) { return m_roadList; } ///< return first road
  174. TerrainRoadType *nextRoad( TerrainRoadType *road ); ///< get next road
  175. TerrainRoadType *findBridge( AsciiString name ); ///< find bridge with matching name
  176. TerrainRoadType *newBridge( AsciiString name ); ///< allocate new bridge, assign name, and link
  177. TerrainRoadType *firstBridge( void ) { return m_bridgeList; } ///< return first bridge
  178. TerrainRoadType *nextBridge( TerrainRoadType *bridge ); ///< get next bridge
  179. TerrainRoadType *findRoadOrBridge( AsciiString name ); ///< search roads and bridges
  180. protected:
  181. TerrainRoadType *m_roadList; ///< list of available roads
  182. TerrainRoadType *m_bridgeList; ///< list of available bridges
  183. static UnsignedInt m_idCounter; ///< unique id counter when allocating roads/bridges
  184. };
  185. // EXTERNAL ////////////////////////////////////////////////////////////////////////////////////////
  186. extern TerrainRoadCollection *TheTerrainRoads;
  187. #endif // __TERRAINROADS_H_