/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*********************************************************************************************** *** 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 *** *********************************************************************************************** * * * Project Name : combat * * * * $Archive:: /Commando/Code/Combat/mendozabossgameobj.h $* * * * Author:: Patrick Smith * * * * $Modtime:: 12/18/01 5:04p $* * * * $Revision:: 8 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if defined(_MSC_VER) #pragma once #endif #ifndef __MENDOZABOSSGAMEOBJ_H #define __MENDOZABOSSGAMEOBJ_H #include "soldier.h" #include "statemachine.h" #include "cardinalspline.h" ////////////////////////////////////////////////////////////////////// // Forward declarations ////////////////////////////////////////////////////////////////////// class PowerUpGameObj; ////////////////////////////////////////////////////////////////////// // // MendozaBossGameObjDefClass // ////////////////////////////////////////////////////////////////////// class MendozaBossGameObjDefClass : public SoldierGameObjDef { public: DECLARE_EDITABLE (MendozaBossGameObjDefClass, SoldierGameObjDef); ////////////////////////////////////////////////////////////////////// // Public constructors/destructors ////////////////////////////////////////////////////////////////////// MendozaBossGameObjDefClass (void); ~MendozaBossGameObjDefClass (void); ////////////////////////////////////////////////////////////////////// // Public methods ////////////////////////////////////////////////////////////////////// uint32 Get_Class_ID (void) const; PersistClass * Create (void) const; bool Save (ChunkSaveClass &csave); bool Load (ChunkLoadClass &cload); const PersistFactoryClass & Get_Factory (void) const; protected: ////////////////////////////////////////////////////////////////////// // Protected methods ////////////////////////////////////////////////////////////////////// void Save_Variables (ChunkSaveClass &csave); void Load_Variables (ChunkLoadClass &cload); ////////////////////////////////////////////////////////////////////// // Protected member data ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Friends ////////////////////////////////////////////////////////////////////// friend class MendozaBossGameObjClass; }; ////////////////////////////////////////////////////////////////////// // // MendozaBossGameObjClass // ////////////////////////////////////////////////////////////////////// class MendozaBossGameObjClass : public SoldierGameObj { public: /////////////////////////////////////////////////////////////////// // Public constructors/destructors /////////////////////////////////////////////////////////////////// MendozaBossGameObjClass (void); ~MendozaBossGameObjClass (void); /////////////////////////////////////////////////////////////////// // Public methods /////////////////////////////////////////////////////////////////// // // Definitions // virtual void Init (void); void Init (const MendozaBossGameObjDefClass &definition); const MendozaBossGameObjDefClass & Get_Definition (void) const; // // From save/load // bool Save (ChunkSaveClass & csave); bool Load (ChunkLoadClass & cload); void On_Post_Load (void); const PersistFactoryClass & Get_Factory (void) const; // // Inherited // bool Wants_Powerups (void) { return true; } bool Allow_Special_Damage_State_Lock (void) { return false; } // // Think // void Think (void); void Apply_Control (void); // // Damage // 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); protected: /////////////////////////////////////////////////////////////////// // Protected methods /////////////////////////////////////////////////////////////////// void Save_Variables (ChunkSaveClass &csave); void Load_Variables (ChunkLoadClass &cload); void Attach_Fire_Sound (void); void Attach_Sound (const char *sound_name, const char *bone_name); bool Apply_Bone_Collision_Damage (const char *bone_name); bool Fly_Move (const Vector3 &vector); void Initialize_Boss (void); PowerUpGameObj * Find_Best_Powerup (void); void Spawn_Health_Powerups (void); // // Taunt control // void Shuffle_Taunt_List (void); // // State support // enum { OVERALL_STATE_FLYING_SIDEKICK = 0, OVERALL_STATE_MELEE_ATTACK, OVERALL_STATE_RANGED_ATTACK, OVERALL_STATE_FIREBALL_ATTACK, OVERALL_STATE_FIND_HEALTH, OVERALL_STATE_SYDNEY_BOLTS, OVERALL_STATE_RUN_AFTER_SYDNEY, OVERALL_STATE_TOY_WITH_SYDNEY, OVERALL_STATE_DEATH_SEQUENCE }; enum { MOVE_STATE_STOP = 0, MOVE_STATE_GET_CLOSE_TO_PLAYER, MOVE_STATE_ATTACK_PATTERN1, MOVE_STATE_ATTACK_PATTERN2, MOVE_STATE_GOTO_HELIPAD, MOVE_STATE_RUN_TO_HEALTH, MOVE_STATE_CHASE_SYDNEY, }; enum { MENDOZA_STATE_STANDING = 0, MENDOZA_STATE_FALLING, MENDOZA_STATE_KIPPING, MENDOZA_STATE_PACK_EXPLODING, MENDOZA_STATE_DYING, MENDOZA_STATE_DEAD }; enum { SYDNEY_STATE_WAITING = 0, SYDNEY_STATE_BOLTING, SYDNEY_STATE_TRIPPING, SYDNEY_STATE_GETTING_UP, SYDNEY_STATE_COWERING, SYDNEY_STATE_STRIKE_A_POSE }; enum { HEAD_STATE_NONE = 0, HEAD_STATE_LOOKING_AT_STAR, HEAD_STATE_LOOKING_AT_SYDNEY, }; enum { ATTACK_STATE_NONE = 0, ATTACK_STATE_MELEE, ATTACK_STATE_MELEE_FLYING_SIDEKICK_RUN, ATTACK_STATE_MELEE_FLYING_SIDEKICK, ATTACK_STATE_MELEE_CRESENT_KICK, ATTACK_STATE_MELEE_SIDE_KICK, ATTACK_STATE_MELEE_SIDE_KICK_RETRACT, ATTACK_STATE_MELEE_PUNCH, ATTACK_STATE_FLAMETHROWER, ATTACK_STATE_FIREBALL, ATTACK_STATE_HANDGUN, ATTACK_STATE_SYDNEY }; enum { CAMERA_STATE_NORMAL = 0, CAMERA_STATE_FACE_ZOOM, CAMERA_STATE_WAYPATH_FOLLOW, CAMERA_STATE_LOOK_AT_DEAD_BOSS }; // // Overall state handlers // DECLARE_STATE (OVERALL_STATE_FLYING_SIDEKICK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_MELEE_ATTACK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_RANGED_ATTACK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_FIREBALL_ATTACK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_FIND_HEALTH, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_SYDNEY_BOLTS, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_RUN_AFTER_SYDNEY, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_TOY_WITH_SYDNEY, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (OVERALL_STATE_DEATH_SEQUENCE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); // // Move state handlers // DECLARE_STATE (MOVE_STATE_STOP, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_GET_CLOSE_TO_PLAYER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_ATTACK_PATTERN1, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_ATTACK_PATTERN2, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_GOTO_HELIPAD, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_RUN_TO_HEALTH, SM_BEGIN, SM_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (MOVE_STATE_CHASE_SYDNEY, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); // // Mendoza state handlers // DECLARE_STATE (MENDOZA_STATE_STANDING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MENDOZA_STATE_FALLING, SM_BEGIN, SM_NO_END, SM_THINK, SM_REQ_END); DECLARE_STATE (MENDOZA_STATE_KIPPING, SM_BEGIN, SM_END, SM_THINK, SM_REQ_END); DECLARE_STATE (MENDOZA_STATE_PACK_EXPLODING, SM_BEGIN, SM_NO_END, SM_THINK, SM_REQ_END); DECLARE_STATE (MENDOZA_STATE_DYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (MENDOZA_STATE_DEAD, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); // // Sydney state handlers // DECLARE_STATE (SYDNEY_STATE_WAITING, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (SYDNEY_STATE_BOLTING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (SYDNEY_STATE_TRIPPING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (SYDNEY_STATE_GETTING_UP, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (SYDNEY_STATE_COWERING, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (SYDNEY_STATE_STRIKE_A_POSE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); // // Head state handlers // DECLARE_STATE (HEAD_STATE_NONE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END); DECLARE_STATE (HEAD_STATE_LOOKING_AT_STAR, SM_NO_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (HEAD_STATE_LOOKING_AT_SYDNEY, SM_NO_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); // // Attack state handlers // DECLARE_STATE (ATTACK_STATE_NONE, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_FLYING_SIDEKICK_RUN, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_FLYING_SIDEKICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_CRESENT_KICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_SIDE_KICK, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_SIDE_KICK_RETRACT, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_MELEE_PUNCH, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_FLAMETHROWER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_FIREBALL, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_HANDGUN, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); DECLARE_STATE (ATTACK_STATE_SYDNEY, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END); // // Camera state handlers // void On_CAMERA_STATE_NORMAL_Begin (void); void On_CAMERA_STATE_FACE_ZOOM_Begin (void); void On_CAMERA_STATE_FACE_ZOOM_Think (void); void On_CAMERA_STATE_WAYPATH_FOLLOW_Begin (void); void On_CAMERA_STATE_WAYPATH_FOLLOW_Think (void); void On_CAMERA_STATE_LOOK_AT_DEAD_BOSS_Begin (void); void On_CAMERA_STATE_LOOK_AT_DEAD_BOSS_Think (void); private: /////////////////////////////////////////////////////////////////// // Private constants /////////////////////////////////////////////////////////////////// enum { MAX_TAUNTS = 6 }; /////////////////////////////////////////////////////////////////// // Private methods /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // Private member data /////////////////////////////////////////////////////////////////// float MendozaTauntTimeLeft; int TauntList[MAX_TAUNTS]; int AvailableTaunts; float OverallStateTimer; float MendozaStateTimer; float CameraStateTimer; float CameraShakeTimer; float AttackStateTimer; float RandomTargetTimer; float SydneyStateTimer; float MoveStateTimer; float NextMeleeAttackTime; float FireballStartTimer; float NextKnockdownAvailableTime; bool HasMeleeAttackHit; float LastMeleeAnimFrame; float StartTimer; RenderObjClass * CameraBoneModel; GameObjReference Sydney; StringClass AttackingBoneName; Vector3 SideKickPos; Vector3 ShootGroundPos; CardinalSpline3DClass CameraSpline; Vector3 MendozaPos; Vector3 StarPos; StateMachineClass OverallState; StateMachineClass MendozaState; StateMachineClass SydneyState; StateMachineClass MoveState; StateMachineClass HeadState; StateMachineClass CameraState; StateMachineClass AttackState; }; #endif //__MENDOZABOSSGAMEOBJ_H