This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Combat/raveshawbossgameobj.h

508 lines
17 KiB
C
Raw Permalink Normal View History

/*
** 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 <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** 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/raveshawbossgameobj.h $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 1/13/02 11:42a $*
* *
* $Revision:: 8 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef __RAVESHAWBOSSGAMEOBJ_H
#define __RAVESHAWBOSSGAMEOBJ_H
#include "soldier.h"
#include "statemachine.h"
//////////////////////////////////////////////////////////////////////
// Forward declarations
//////////////////////////////////////////////////////////////////////
class ManualTransitionEffectClass;
class StealthEffectClass;
class SimpleGameObj;
//////////////////////////////////////////////////////////////////////
//
// RaveshawBossGameObjDefClass
//
//////////////////////////////////////////////////////////////////////
class RaveshawBossGameObjDefClass : public SoldierGameObjDef
{
public:
DECLARE_EDITABLE (RaveshawBossGameObjDefClass, SoldierGameObjDef);
//////////////////////////////////////////////////////////////////////
// Public constructors/destructors
//////////////////////////////////////////////////////////////////////
RaveshawBossGameObjDefClass (void);
~RaveshawBossGameObjDefClass (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 RaveshawBossGameObjClass;
};
//////////////////////////////////////////////////////////////////////
//
// RaveshawBossGameObjClass
//
//////////////////////////////////////////////////////////////////////
class RaveshawBossGameObjClass : public SoldierGameObj
{
public:
///////////////////////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////////////////////
RaveshawBossGameObjClass (void);
~RaveshawBossGameObjClass (void);
///////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////
//
// Definitions
//
virtual void Init (void);
void Init (const RaveshawBossGameObjDefClass &definition);
const RaveshawBossGameObjDefClass & 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 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
///////////////////////////////////////////////////////////////////
//
// Save/load support
//
void Save_Variables (ChunkSaveClass &csave);
void Load_Variables (ChunkLoadClass &cload);
//
// Misc
//
void Attach_Sound (const char *sound_name, const char *bone_name);
void Find_Closest_Catwalk_Pos (const Vector3 &curr_pos, Vector3 *catwalk_pos);
bool Apply_Bone_Collision_Damage (float damage_scale, const char *bone_name);
void Determine_New_Overall_State (void);
void Find_Death_Facing_Pos (Vector3 *facing_pos);
//
// Movement support
//
float Get_Distance_From_Ground (void);
bool Fly_Move (PhysicalGameObj *game_obj, const Vector3 &vector);
void Jump_To_Point (const Vector3 &pos);
//
// Lightning rod support
//
void Add_Lightning_Arc (const Vector3 &start_point, const Vector3 &end_point);
void Collect_Lightning_Rods (void);
void Create_Arc_Effects (void);
void Prepare_Arc_Effect_Data (void);
//
// Stealth and thrown object support
//
void Create_Stealth_Soldier (const Matrix3D &tm);
void Link_Stealth_Soldier_To_Hand (void);
void Link_Thrown_Object_To_Hands (void);
SimpleGameObj * Find_Object_To_Throw (void);
WWINLINE SoldierGameObj * Peek_Stealth_Soldier (void);
void Verify_Stealth_Soldier (void);
void Link_Player_To_Hands (void);
//
// Taunt control
//
void Shuffle_Taunt_List (void);
//
// State support
//
enum
{
OVERALL_STATE_NOTHING = 0,
OVERALL_STATE_HEALING,
OVERALL_STATE_THROWING_OBJECT,
OVERALL_STATE_THROWING_SOLDIER,
OVERALL_STATE_THROWING_STAR,
OVERALL_STATE_GRAB_STAR,
OVERALL_STATE_JUMP_TO_CATWALK,
OVERALL_STATE_ON_CATWALK,
OVERALL_STATE_BODYSLAM,
OVERALL_STATE_CHASE_STAR,
OVERALL_STATE_DAZED,
OVERALL_STATE_FLEE,
OVERALL_STATE_DEATH_SEQUENCE
};
enum
{
RAVESHAW_STATE_NOTHING = 0,
RAVESHAW_STATE_ROAR,
RAVESHAW_STATE_GRAB_TIBERIUM,
RAVESHAW_STATE_GRAB_SOLDIER,
RAVESHAW_STATE_THROW_SOLDIER,
RAVESHAW_STATE_GRAB_OBJECT,
RAVESHAW_STATE_THROW_OBJECT,
RAVESHAW_STATE_GRAB_STAR,
RAVESHAW_STATE_BODYSLAM,
RAVESHAW_STATE_JUMP_DOWN,
RAVESHAW_STATE_STUMBLE,
RAVESHAW_STATE_LOOK_CONFUSED,
RAVESHAW_STATE_DYING,
RAVESHAW_STATE_FALL,
RAVESHAW_STATE_DEATH_LANDING
};
enum
{
MOVE_STATE_STOP = 0,
MOVE_STATE_GOTO_TIBERIUM,
MOVE_STATE_GOTO_CATWALK,
MOVE_STATE_JUMP_TO_CATWALK,
MOVE_STATE_CIRCLE_CATWALK,
MOVE_STATE_GOTO_THROW_OBJECT,
MOVE_STATE_JUMP_TO_STAR,
MOVE_STATE_FOLLOW_STAR,
};
enum
{
ENGORGED_STATE_NONE = 0,
ENGORGED_STATE_ABSORBING_TIBERIUM,
ENGORGED_STATE_FADING
};
enum
{
JUMP_STATE_NONE = 0,
JUMP_STATE_CROUCHING,
JUMP_STATE_JUMPING,
JUMP_STATE_LANDING
};
enum
{
HAVOC_STATE_NONE = 0,
HAVOC_STATE_GRABBED,
HAVOC_STATE_FLYING
};
enum
{
STEALTH_SOLDIER_STATE_NONE = 0,
STEALTH_SOLDIER_STATE_DISPLAY,
STEALTH_SOLDIER_STATE_FLYING
};
enum
{
THROWN_OBJECT_STATE_NONE = 0,
THROWN_OBJECT_STATE_PICKUP,
THROWN_OBJECT_STATE_FLYING
};
enum
{
LIGHTNING_ROD_STATE_NONE = 0,
LIGHTNING_ROD_STATE_ACTIVE,
};
//
// Overall state handlers
//
DECLARE_STATE (OVERALL_STATE_NOTHING, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_HEALING, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_THROWING_OBJECT, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_THROWING_SOLDIER, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_THROWING_STAR, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_GRAB_STAR, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_JUMP_TO_CATWALK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_ON_CATWALK, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_BODYSLAM, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_CHASE_STAR, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_DAZED, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_FLEE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (OVERALL_STATE_DEATH_SEQUENCE, SM_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
//
// Raveshaw state handlers
//
DECLARE_STATE (RAVESHAW_STATE_NOTHING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_ROAR, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_GRAB_TIBERIUM, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_GRAB_SOLDIER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_THROW_SOLDIER, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_GRAB_OBJECT, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_THROW_OBJECT, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_GRAB_STAR, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_BODYSLAM, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_JUMP_DOWN, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_STUMBLE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_LOOK_CONFUSED, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_DYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_FALL, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (RAVESHAW_STATE_DEATH_LANDING, SM_BEGIN, SM_NO_END, SM_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_GOTO_TIBERIUM, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_GOTO_CATWALK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_JUMP_TO_CATWALK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_CIRCLE_CATWALK, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_GOTO_THROW_OBJECT, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_JUMP_TO_STAR, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (MOVE_STATE_FOLLOW_STAR, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
//
// Engorged state handlers
//
DECLARE_STATE (ENGORGED_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (ENGORGED_STATE_ABSORBING_TIBERIUM, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (ENGORGED_STATE_FADING, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
//
// Jump state handlers
//
DECLARE_STATE (JUMP_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (JUMP_STATE_CROUCHING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (JUMP_STATE_JUMPING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (JUMP_STATE_LANDING, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
//
// Stealth soldier state handlers
//
DECLARE_STATE (STEALTH_SOLDIER_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (STEALTH_SOLDIER_STATE_DISPLAY, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (STEALTH_SOLDIER_STATE_FLYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
//
// Havoc state handlers
//
DECLARE_STATE (HAVOC_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (HAVOC_STATE_GRABBED, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (HAVOC_STATE_FLYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
//
// Thrown object state handlers
//
DECLARE_STATE (THROWN_OBJECT_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (THROWN_OBJECT_STATE_PICKUP, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
DECLARE_STATE (THROWN_OBJECT_STATE_FLYING, SM_BEGIN, SM_NO_END, SM_THINK, SM_NO_REQ_END);
//
// Lightning rod state handlers
//
DECLARE_STATE (LIGHTNING_ROD_STATE_NONE, SM_NO_BEGIN, SM_NO_END, SM_NO_THINK, SM_NO_REQ_END);
DECLARE_STATE (LIGHTNING_ROD_STATE_ACTIVE, SM_BEGIN, SM_END, SM_THINK, SM_NO_REQ_END);
private:
///////////////////////////////////////////////////////////////////
// Private constants
///////////////////////////////////////////////////////////////////
enum
{
MAX_TAUNTS = 6
};
///////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////
static int __cdecl fnSortLightningRodsCallback (const void *elem1, const void *elem2);
///////////////////////////////////////////////////////////////////
// Private member data
///////////////////////////////////////////////////////////////////
//
// Taunts
//
float RaveshawTauntTimeLeft;
int TauntList[MAX_TAUNTS];
int AvailableTaunts;
//
// Timers
//
float OverallStateTimer;
float EngorgedStateTimer;
float MoveStateTimer;
float BodySlamTimer;
float RaveshawStateTimer;
float StealthSoldierStateTimer;
float LightningRodStateTimer;
float StartTimer;
//
// Melee data
//
float LastMeleeAnimFrame;
bool HasMeleeAttackHit;
//
// Thrown object data
//
GameObjReference StealthSoldier;
StealthEffectClass * StealthEffect;
SimpleGameObj * ThrownObject;
Vector3 FlyingObjectVector;
Vector3 FlyingObjectDest;
float FlyingDist;
Matrix3D RelObjTM;
RenderObjClass * CameraBoneModel;
bool RestoreFirstPerson;
//
// Effects data
//
ManualTransitionEffectClass * TiberiumEffect;
DynamicVectorClass<DamageableStaticPhysClass *> LightningRodList;
bool IsTiberiumEffectApplied;
//
// Positions
//
Vector3 RaveshawPos;
Vector3 StarPos;
Vector3 CurrentDestPos;
Vector3 CurrentJumpToPos;
//
// State machines
//
StateMachineClass<RaveshawBossGameObjClass> OverallState;
StateMachineClass<RaveshawBossGameObjClass> RaveshawState;
StateMachineClass<RaveshawBossGameObjClass> MoveState;
StateMachineClass<RaveshawBossGameObjClass> EngorgedState;
StateMachineClass<RaveshawBossGameObjClass> StealthSoldierState;
StateMachineClass<RaveshawBossGameObjClass> HavocState;
StateMachineClass<RaveshawBossGameObjClass> ThrownObjectState;
StateMachineClass<RaveshawBossGameObjClass> JumpState;
StateMachineClass<RaveshawBossGameObjClass> LightningRodState;
enum
{
ARC_OBJ_COUNT = 10,
BONE_COUNT = 6
};
SimpleGameObj * ArcObjects[ARC_OBJ_COUNT];
float ArcLifeRemaining[ARC_OBJ_COUNT];
Matrix3D EndTM;
Matrix3D Bones[BONE_COUNT];
};
///////////////////////////////////////////////////////////////////
// Peek_Stealth_Soldier
///////////////////////////////////////////////////////////////////
WWINLINE SoldierGameObj *
RaveshawBossGameObjClass::Peek_Stealth_Soldier (void)
{
SoldierGameObj *soldier = NULL;
//
// Dig the soldier out of the game object reference
//
if (StealthSoldier != NULL) {
PhysicalGameObj *phys_game_obj = StealthSoldier.Get_Ptr ()->As_PhysicalGameObj ();
if (phys_game_obj != NULL) {
soldier = phys_game_obj->As_SoldierGameObj ();
}
}
return soldier;
}
#endif //__RAVESHAWBOSSGAMEOBJ_H