basegameobj.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. ** Command & Conquer Renegade(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. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Commando *
  23. * *
  24. * $Archive:: /Commando/Code/Combat/basegameobj.cpp $*
  25. * *
  26. * $Author:: Byon_g $*
  27. * *
  28. * $Modtime:: 8/23/01 10:52a $*
  29. * *
  30. * $Revision:: 27 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "basegameobj.h"
  36. #include "combat.h"
  37. #include "pscene.h"
  38. #include "gameobjmanager.h"
  39. #include "phys.h"
  40. #include "timemgr.h"
  41. #include "chunkio.h"
  42. #include "debug.h"
  43. #include "assets.h"
  44. #include "matinfo.h"
  45. #include "definitionclassids.h"
  46. #include "networkobjectfactory.h"
  47. //////////////////////////////////////////////////////////////
  48. // NetworkGameObjectFactoryClass
  49. //////////////////////////////////////////////////////////////
  50. class NetworkGameObjectFactoryClass : public NetworkObjectFactoryClass
  51. {
  52. public:
  53. virtual NetworkObjectClass * Create (cPacket &packet) const;
  54. virtual void Prep_Packet (NetworkObjectClass *object, cPacket &packet) const;
  55. virtual uint32 Get_Class_ID (void) const { return NETCLASSID_GAMEOBJ; }
  56. };
  57. //////////////////////////////////////////////////////////////
  58. // Prep_Packet
  59. //////////////////////////////////////////////////////////////
  60. void
  61. NetworkGameObjectFactoryClass::Prep_Packet (NetworkObjectClass *object, cPacket &packet) const
  62. {
  63. WWASSERT (object != NULL);
  64. BaseGameObj *game_obj = (BaseGameObj *)(object);
  65. //
  66. // Add the definition ID of the object to the packet
  67. //
  68. packet.Add (game_obj->Get_Definition ().Get_ID ());
  69. return ;
  70. }
  71. //////////////////////////////////////////////////////////////
  72. // Create
  73. //////////////////////////////////////////////////////////////
  74. NetworkObjectClass *
  75. NetworkGameObjectFactoryClass::Create (cPacket &packet) const
  76. {
  77. int definition_id = packet.Get (definition_id);
  78. //
  79. // Lookup the definition for this object
  80. //
  81. DefinitionClass *definition = DefinitionMgrClass::Find_Definition (definition_id);
  82. WWASSERT (definition != NULL);
  83. //
  84. // Create the new object
  85. //
  86. BaseGameObj *new_game_obj = (BaseGameObj *)definition->Create();
  87. //
  88. // Convert the game object to a network object
  89. //
  90. return static_cast<NetworkObjectClass *> (new_game_obj);
  91. }
  92. //////////////////////////////////////////////////////////////
  93. // Static data
  94. //////////////////////////////////////////////////////////////
  95. static NetworkGameObjectFactoryClass _NetworkGameObjectFactory;
  96. /*
  97. ** BaseGameObjDef
  98. */
  99. enum {
  100. CHUNKID_DEF_PARENT = 1111991123,
  101. };
  102. bool BaseGameObjDef::Save( ChunkSaveClass & csave )
  103. {
  104. csave.Begin_Chunk( CHUNKID_DEF_PARENT );
  105. DefinitionClass::Save( csave );
  106. csave.End_Chunk();
  107. return true;
  108. }
  109. bool BaseGameObjDef::Load( ChunkLoadClass &cload )
  110. {
  111. cload.Open_Chunk();
  112. WWASSERT( cload.Cur_Chunk_ID() == CHUNKID_DEF_PARENT );
  113. DefinitionClass::Load( cload );
  114. cload.Close_Chunk();
  115. return true;
  116. }
  117. /*
  118. **
  119. */
  120. BaseGameObj::BaseGameObj( void ) :
  121. Definition( NULL ),
  122. //DestroyType( DESTROY_NONE ),
  123. //ID( 0 ),
  124. IsPostThinkAllowed( false ),
  125. EnableCinematicFreeze( true )
  126. {
  127. GameObjManager::Add( this );
  128. Set_Object_Dirty_Bit (NetworkObjectClass::BIT_CREATION, true);
  129. }
  130. /*
  131. **
  132. */
  133. BaseGameObj::~BaseGameObj( void )
  134. {
  135. GameObjManager::Remove( this );
  136. }
  137. /*
  138. **
  139. */
  140. void BaseGameObj::Init( const BaseGameObjDef & definition )
  141. {
  142. Definition = &definition;
  143. }
  144. const BaseGameObjDef & BaseGameObj::Get_Definition( void ) const
  145. {
  146. return *Definition;
  147. };
  148. /*
  149. ** BaseGameObj Save and Load
  150. */
  151. enum {
  152. CHUNKID_VARIABLES = 910991407,
  153. XXX_MICROCHUNKID_DESTROY_TYPE = 1,
  154. MICROCHUNKID_DEFINITION_ID,
  155. MICROCHUNKID_INSTANCE_ID,
  156. MICROCHUNKID_IS_PENDING_DELETE,
  157. MICROCHUNKID_ENABLE_CINEMATIC_FREEZE,
  158. };
  159. bool BaseGameObj::Save( ChunkSaveClass & csave )
  160. {
  161. csave.Begin_Chunk( CHUNKID_VARIABLES );
  162. bool is_delete_pending = Is_Delete_Pending ();
  163. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_IS_PENDING_DELETE, is_delete_pending );
  164. int definition_id = Definition->Get_ID();
  165. WWASSERT( SuperClassID_From_ClassID( Definition->Get_Class_ID () ) == CLASSID_GAME_OBJECTS ||
  166. SuperClassID_From_ClassID( Definition->Get_Class_ID () ) == CLASSID_BUILDINGS );
  167. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_DEFINITION_ID, definition_id );
  168. int id = Get_Network_ID ();
  169. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_INSTANCE_ID, id );
  170. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_ENABLE_CINEMATIC_FREEZE, EnableCinematicFreeze );
  171. csave.End_Chunk();
  172. return true;
  173. }
  174. bool BaseGameObj::Load( ChunkLoadClass &cload )
  175. {
  176. int id = 0;
  177. cload.Open_Chunk();
  178. WWASSERT( cload.Cur_Chunk_ID() == CHUNKID_VARIABLES );
  179. while (cload.Open_Micro_Chunk()) {
  180. switch(cload.Cur_Micro_Chunk_ID()) {
  181. case MICROCHUNKID_IS_PENDING_DELETE:
  182. {
  183. bool is_delete_pending = false;
  184. LOAD_MICRO_CHUNK( cload, is_delete_pending );
  185. if (is_delete_pending) {
  186. Set_Delete_Pending ();
  187. }
  188. break;
  189. }
  190. case MICROCHUNKID_INSTANCE_ID:
  191. {
  192. LOAD_MICRO_CHUNK( cload, id );
  193. //TSS
  194. //Set_Network_ID( id );
  195. break;
  196. }
  197. case MICROCHUNKID_DEFINITION_ID:
  198. int definition_id;
  199. LOAD_MICRO_CHUNK( cload, definition_id );
  200. WWASSERT( Definition == NULL );
  201. Definition = (const BaseGameObjDef*)DefinitionMgrClass::Find_Definition( definition_id );
  202. if ( Definition == NULL ) {
  203. Debug_Say(( "Definition %d not found\n. Re-Export needed\n", definition_id ));
  204. }
  205. //
  206. // 07/30/01 attempting to load a level with temps will presently assert here.
  207. //
  208. WWASSERT( Definition != NULL );
  209. break;
  210. READ_MICRO_CHUNK( cload, MICROCHUNKID_ENABLE_CINEMATIC_FREEZE, EnableCinematicFreeze );
  211. default:
  212. Debug_Say(( "Unrecognized BaseGameObj Variable chunkID\n" ));
  213. break;
  214. }
  215. cload.Close_Micro_Chunk();
  216. }
  217. cload.Close_Chunk();
  218. //
  219. // Set the ID if necessary
  220. //
  221. if (id == 0) {
  222. id = Get_ID ();
  223. if (id == 0) {
  224. Set_Network_ID (NetworkObjectMgrClass::Get_New_Dynamic_ID ());
  225. } else {
  226. WWASSERT(id >= NETID_DYNAMIC_OBJECT_MIN && id <= NETID_DYNAMIC_OBJECT_MAX);
  227. }
  228. } else {
  229. Set_Network_ID (id);
  230. }
  231. return true;
  232. }