mendozabossgameobj.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  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. *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : combat *
  23. * *
  24. * $Archive:: /Commando/Code/Combat/mendozabossgameobj.h $*
  25. * *
  26. * Author:: Patrick Smith *
  27. * *
  28. * $Modtime:: 12/18/01 5:04p $*
  29. * *
  30. * $Revision:: 8 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #if defined(_MSC_VER)
  36. #pragma once
  37. #endif
  38. #ifndef __MENDOZABOSSGAMEOBJ_H
  39. #define __MENDOZABOSSGAMEOBJ_H
  40. #include "soldier.h"
  41. #include "statemachine.h"
  42. #include "cardinalspline.h"
  43. //////////////////////////////////////////////////////////////////////
  44. // Forward declarations
  45. //////////////////////////////////////////////////////////////////////
  46. class PowerUpGameObj;
  47. //////////////////////////////////////////////////////////////////////
  48. //
  49. // MendozaBossGameObjDefClass
  50. //
  51. //////////////////////////////////////////////////////////////////////
  52. class MendozaBossGameObjDefClass : public SoldierGameObjDef
  53. {
  54. public:
  55. DECLARE_EDITABLE (MendozaBossGameObjDefClass, SoldierGameObjDef);
  56. //////////////////////////////////////////////////////////////////////
  57. // Public constructors/destructors
  58. //////////////////////////////////////////////////////////////////////
  59. MendozaBossGameObjDefClass (void);
  60. ~MendozaBossGameObjDefClass (void);
  61. //////////////////////////////////////////////////////////////////////
  62. // Public methods
  63. //////////////////////////////////////////////////////////////////////
  64. uint32 Get_Class_ID (void) const;
  65. PersistClass * Create (void) const;
  66. bool Save (ChunkSaveClass &csave);
  67. bool Load (ChunkLoadClass &cload);
  68. const PersistFactoryClass & Get_Factory (void) const;
  69. protected:
  70. //////////////////////////////////////////////////////////////////////
  71. // Protected methods
  72. //////////////////////////////////////////////////////////////////////
  73. void Save_Variables (ChunkSaveClass &csave);
  74. void Load_Variables (ChunkLoadClass &cload);
  75. //////////////////////////////////////////////////////////////////////
  76. // Protected member data
  77. //////////////////////////////////////////////////////////////////////
  78. //////////////////////////////////////////////////////////////////////
  79. // Friends
  80. //////////////////////////////////////////////////////////////////////
  81. friend class MendozaBossGameObjClass;
  82. };
  83. //////////////////////////////////////////////////////////////////////
  84. //
  85. // MendozaBossGameObjClass
  86. //
  87. //////////////////////////////////////////////////////////////////////
  88. class MendozaBossGameObjClass : public SoldierGameObj
  89. {
  90. public:
  91. ///////////////////////////////////////////////////////////////////
  92. // Public constructors/destructors
  93. ///////////////////////////////////////////////////////////////////
  94. MendozaBossGameObjClass (void);
  95. ~MendozaBossGameObjClass (void);
  96. ///////////////////////////////////////////////////////////////////
  97. // Public methods
  98. ///////////////////////////////////////////////////////////////////
  99. //
  100. // Definitions
  101. //
  102. virtual void Init (void);
  103. void Init (const MendozaBossGameObjDefClass &definition);
  104. const MendozaBossGameObjDefClass & Get_Definition (void) const;
  105. //
  106. // From save/load
  107. //
  108. bool Save (ChunkSaveClass & csave);
  109. bool Load (ChunkLoadClass & cload);
  110. void On_Post_Load (void);
  111. const PersistFactoryClass & Get_Factory (void) const;
  112. //
  113. // Inherited
  114. //
  115. bool Wants_Powerups (void) { return true; }
  116. bool Allow_Special_Damage_State_Lock (void) { return false; }
  117. //
  118. // Think
  119. //
  120. void Think (void);
  121. void Apply_Control (void);
  122. //
  123. // Damage
  124. //
  125. virtual void Apply_Damage_Extended (const OffenseObjectClass &offense, float scale = 1.0f, const Vector3 & direction = Vector3 (0, 0, 0), const char *collision_box_name = NULL);
  126. protected:
  127. ///////////////////////////////////////////////////////////////////
  128. // Protected methods
  129. ///////////////////////////////////////////////////////////////////
  130. void Save_Variables (ChunkSaveClass &csave);
  131. void Load_Variables (ChunkLoadClass &cload);
  132. void Attach_Fire_Sound (void);
  133. void Attach_Sound (const char *sound_name, const char *bone_name);
  134. bool Apply_Bone_Collision_Damage (const char *bone_name);
  135. bool Fly_Move (const Vector3 &vector);
  136. void Initialize_Boss (void);
  137. PowerUpGameObj * Find_Best_Powerup (void);
  138. void Spawn_Health_Powerups (void);
  139. //
  140. // Taunt control
  141. //
  142. void Shuffle_Taunt_List (void);
  143. //
  144. // State support
  145. //
  146. enum
  147. {
  148. OVERALL_STATE_FLYING_SIDEKICK = 0,
  149. OVERALL_STATE_MELEE_ATTACK,
  150. OVERALL_STATE_RANGED_ATTACK,
  151. OVERALL_STATE_FIREBALL_ATTACK,
  152. OVERALL_STATE_FIND_HEALTH,
  153. OVERALL_STATE_SYDNEY_BOLTS,
  154. OVERALL_STATE_RUN_AFTER_SYDNEY,
  155. OVERALL_STATE_TOY_WITH_SYDNEY,
  156. OVERALL_STATE_DEATH_SEQUENCE
  157. };
  158. enum
  159. {
  160. MOVE_STATE_STOP = 0,
  161. MOVE_STATE_GET_CLOSE_TO_PLAYER,
  162. MOVE_STATE_ATTACK_PATTERN1,
  163. MOVE_STATE_ATTACK_PATTERN2,
  164. MOVE_STATE_GOTO_HELIPAD,
  165. MOVE_STATE_RUN_TO_HEALTH,
  166. MOVE_STATE_CHASE_SYDNEY,
  167. };
  168. enum
  169. {
  170. MENDOZA_STATE_STANDING = 0,
  171. MENDOZA_STATE_FALLING,
  172. MENDOZA_STATE_KIPPING,
  173. MENDOZA_STATE_PACK_EXPLODING,
  174. MENDOZA_STATE_DYING,
  175. MENDOZA_STATE_DEAD
  176. };
  177. enum
  178. {
  179. SYDNEY_STATE_WAITING = 0,
  180. SYDNEY_STATE_BOLTING,
  181. SYDNEY_STATE_TRIPPING,
  182. SYDNEY_STATE_GETTING_UP,
  183. SYDNEY_STATE_COWERING,
  184. SYDNEY_STATE_STRIKE_A_POSE
  185. };
  186. enum
  187. {
  188. HEAD_STATE_NONE = 0,
  189. HEAD_STATE_LOOKING_AT_STAR,
  190. HEAD_STATE_LOOKING_AT_SYDNEY,
  191. };
  192. enum
  193. {
  194. ATTACK_STATE_NONE = 0,
  195. ATTACK_STATE_MELEE,
  196. ATTACK_STATE_MELEE_FLYING_SIDEKICK_RUN,
  197. ATTACK_STATE_MELEE_FLYING_SIDEKICK,
  198. ATTACK_STATE_MELEE_CRESENT_KICK,
  199. ATTACK_STATE_MELEE_SIDE_KICK,
  200. ATTACK_STATE_MELEE_SIDE_KICK_RETRACT,
  201. ATTACK_STATE_MELEE_PUNCH,
  202. ATTACK_STATE_FLAMETHROWER,
  203. ATTACK_STATE_FIREBALL,
  204. ATTACK_STATE_HANDGUN,
  205. ATTACK_STATE_SYDNEY
  206. };
  207. enum
  208. {
  209. CAMERA_STATE_NORMAL = 0,
  210. CAMERA_STATE_FACE_ZOOM,
  211. CAMERA_STATE_WAYPATH_FOLLOW,
  212. CAMERA_STATE_LOOK_AT_DEAD_BOSS
  213. };
  214. //
  215. // Overall state handlers
  216. //
  217. DECLARE_STATE (OVERALL_STATE_FLYING_SIDEKICK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  218. DECLARE_STATE (OVERALL_STATE_MELEE_ATTACK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  219. DECLARE_STATE (OVERALL_STATE_RANGED_ATTACK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  220. DECLARE_STATE (OVERALL_STATE_FIREBALL_ATTACK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  221. DECLARE_STATE (OVERALL_STATE_FIND_HEALTH, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  222. DECLARE_STATE (OVERALL_STATE_SYDNEY_BOLTS, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  223. DECLARE_STATE (OVERALL_STATE_RUN_AFTER_SYDNEY, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  224. DECLARE_STATE (OVERALL_STATE_TOY_WITH_SYDNEY, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  225. DECLARE_STATE (OVERALL_STATE_DEATH_SEQUENCE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  226. //
  227. // Move state handlers
  228. //
  229. DECLARE_STATE (MOVE_STATE_STOP, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  230. DECLARE_STATE (MOVE_STATE_GET_CLOSE_TO_PLAYER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  231. DECLARE_STATE (MOVE_STATE_ATTACK_PATTERN1, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  232. DECLARE_STATE (MOVE_STATE_ATTACK_PATTERN2, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  233. DECLARE_STATE (MOVE_STATE_GOTO_HELIPAD, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  234. DECLARE_STATE (MOVE_STATE_RUN_TO_HEALTH, SM_BEGIN, SM_END, SM_NO_THINK, SM_NO_REQ_END);
  235. DECLARE_STATE (MOVE_STATE_CHASE_SYDNEY, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  236. //
  237. // Mendoza state handlers
  238. //
  239. DECLARE_STATE (MENDOZA_STATE_STANDING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  240. DECLARE_STATE (MENDOZA_STATE_FALLING, SM_BEGIN, SM_NO_END, SM_THINK, SM_REQ_END);
  241. DECLARE_STATE (MENDOZA_STATE_KIPPING, SM_BEGIN, SM_END, SM_THINK, SM_REQ_END);
  242. DECLARE_STATE (MENDOZA_STATE_PACK_EXPLODING, SM_BEGIN, SM_NO_END, SM_THINK, SM_REQ_END);
  243. DECLARE_STATE (MENDOZA_STATE_DYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  244. DECLARE_STATE (MENDOZA_STATE_DEAD, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  245. //
  246. // Sydney state handlers
  247. //
  248. DECLARE_STATE (SYDNEY_STATE_WAITING, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  249. DECLARE_STATE (SYDNEY_STATE_BOLTING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  250. DECLARE_STATE (SYDNEY_STATE_TRIPPING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  251. DECLARE_STATE (SYDNEY_STATE_GETTING_UP, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  252. DECLARE_STATE (SYDNEY_STATE_COWERING, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  253. DECLARE_STATE (SYDNEY_STATE_STRIKE_A_POSE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  254. //
  255. // Head state handlers
  256. //
  257. DECLARE_STATE (HEAD_STATE_NONE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
  258. DECLARE_STATE (HEAD_STATE_LOOKING_AT_STAR, SM_NO_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  259. DECLARE_STATE (HEAD_STATE_LOOKING_AT_SYDNEY, SM_NO_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  260. //
  261. // Attack state handlers
  262. //
  263. DECLARE_STATE (ATTACK_STATE_NONE, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  264. DECLARE_STATE (ATTACK_STATE_MELEE, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  265. DECLARE_STATE (ATTACK_STATE_MELEE_FLYING_SIDEKICK_RUN, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
  266. DECLARE_STATE (ATTACK_STATE_MELEE_FLYING_SIDEKICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  267. DECLARE_STATE (ATTACK_STATE_MELEE_CRESENT_KICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  268. DECLARE_STATE (ATTACK_STATE_MELEE_SIDE_KICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  269. DECLARE_STATE (ATTACK_STATE_MELEE_SIDE_KICK_RETRACT, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  270. DECLARE_STATE (ATTACK_STATE_MELEE_PUNCH, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  271. DECLARE_STATE (ATTACK_STATE_FLAMETHROWER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  272. DECLARE_STATE (ATTACK_STATE_FIREBALL, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  273. DECLARE_STATE (ATTACK_STATE_HANDGUN, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  274. DECLARE_STATE (ATTACK_STATE_SYDNEY, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
  275. //
  276. // Camera state handlers
  277. //
  278. void On_CAMERA_STATE_NORMAL_Begin (void);
  279. void On_CAMERA_STATE_FACE_ZOOM_Begin (void);
  280. void On_CAMERA_STATE_FACE_ZOOM_Think (void);
  281. void On_CAMERA_STATE_WAYPATH_FOLLOW_Begin (void);
  282. void On_CAMERA_STATE_WAYPATH_FOLLOW_Think (void);
  283. void On_CAMERA_STATE_LOOK_AT_DEAD_BOSS_Begin (void);
  284. void On_CAMERA_STATE_LOOK_AT_DEAD_BOSS_Think (void);
  285. private:
  286. ///////////////////////////////////////////////////////////////////
  287. // Private constants
  288. ///////////////////////////////////////////////////////////////////
  289. enum
  290. {
  291. MAX_TAUNTS = 6
  292. };
  293. ///////////////////////////////////////////////////////////////////
  294. // Private methods
  295. ///////////////////////////////////////////////////////////////////
  296. ///////////////////////////////////////////////////////////////////
  297. // Private member data
  298. ///////////////////////////////////////////////////////////////////
  299. float MendozaTauntTimeLeft;
  300. int TauntList[MAX_TAUNTS];
  301. int AvailableTaunts;
  302. float OverallStateTimer;
  303. float MendozaStateTimer;
  304. float CameraStateTimer;
  305. float CameraShakeTimer;
  306. float AttackStateTimer;
  307. float RandomTargetTimer;
  308. float SydneyStateTimer;
  309. float MoveStateTimer;
  310. float NextMeleeAttackTime;
  311. float FireballStartTimer;
  312. float NextKnockdownAvailableTime;
  313. bool HasMeleeAttackHit;
  314. float LastMeleeAnimFrame;
  315. float StartTimer;
  316. RenderObjClass * CameraBoneModel;
  317. GameObjReference Sydney;
  318. StringClass AttackingBoneName;
  319. Vector3 SideKickPos;
  320. Vector3 ShootGroundPos;
  321. CardinalSpline3DClass CameraSpline;
  322. Vector3 MendozaPos;
  323. Vector3 StarPos;
  324. StateMachineClass<MendozaBossGameObjClass> OverallState;
  325. StateMachineClass<MendozaBossGameObjClass> MendozaState;
  326. StateMachineClass<MendozaBossGameObjClass> SydneyState;
  327. StateMachineClass<MendozaBossGameObjClass> MoveState;
  328. StateMachineClass<MendozaBossGameObjClass> HeadState;
  329. StateMachineClass<MendozaBossGameObjClass> CameraState;
  330. StateMachineClass<MendozaBossGameObjClass> AttackState;
  331. };
  332. #endif //__MENDOZABOSSGAMEOBJ_H