//========= Copyright Valve Corporation, All rights reserved. ============// // halloween_boss_base.h // Shared code for the Halloween Bosses // Michael Booth, October 2011 #ifndef HALLOWEEN_BOSS_BASE_H #define HALLOWEEN_BOSS_BASE_H #include "tf_shareddefs.h" #include "NextBot.h" #include "NextBotBehavior.h" #include "NextBotGroundLocomotion.h" #include "headless_hatman_body.h" #include "Path/NextBotPathFollow.h" class CTFPlayer; //---------------------------------------------------------------------------- class CHalloweenBaseBoss : public NextBotCombatCharacter { public: DECLARE_CLASS( CHalloweenBaseBoss, NextBotCombatCharacter ); CHalloweenBaseBoss(); virtual ~CHalloweenBaseBoss(); virtual void Spawn( void ); virtual int OnTakeDamage( const CTakeDamageInfo &rawInfo ) OVERRIDE; virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); virtual void Event_Killed( const CTakeDamageInfo &info ) OVERRIDE; virtual void UpdateOnRemove(); virtual void Update( void ); void Break( void ); // bust into gibs struct AttackerInfo { CHandle< CTFPlayer > m_attacker; float m_timestamp; bool m_wasLastHitFromMeleeWeapon; }; const CUtlVector< AttackerInfo > &GetAttackerVector( void ) const; void RememberAttacker( CTFPlayer *player, bool wasMeleeHit, float damage ); bool WasSpawnedByCheats( void ) const; virtual float GetCritInjuryMultiplier( void ) const; // when we are hit by a crit, damage is mutiplied by this float GetInjuryRate( void ) const; // return average recent damage taken per second float GetMaxInjuryRate( void ) const; // return maximum damage taken per second virtual int GetLevel() const { return 0; } virtual HalloweenBossType GetBossType() const { return HALLOWEEN_BOSS_INVALID; } static CHalloweenBaseBoss* SpawnBossAtPos( HalloweenBossType bossType, const Vector& vSpawnPos, int nTeam = TF_TEAM_HALLOWEEN, CBaseEntity* pOwner = NULL ); bool IsSpell() const { return GetTeamNumber() != TF_TEAM_HALLOWEEN; } enum HalloweenStatsEventType { HALLOWEEN_EVENT_BOSS_SPAWN = 0, }; private: CUtlVector< AttackerInfo > m_attackerVector; // list of everyone who injured me, and when void UpdateDamagePerSecond( void ); struct DamageRateInfo { float m_timestamp; float m_damage; }; CUtlVector< DamageRateInfo > m_damageVector; float m_damagePerSecond; float m_maxDamagePerSecond; bool m_wasSpawnedByCheats; }; inline float CHalloweenBaseBoss::GetInjuryRate( void ) const { return m_damagePerSecond; } inline float CHalloweenBaseBoss::GetMaxInjuryRate( void ) const { return m_maxDamagePerSecond; } inline float CHalloweenBaseBoss::GetCritInjuryMultiplier( void ) const { return TF_DAMAGE_CRIT_MULTIPLIER; } inline bool CHalloweenBaseBoss::WasSpawnedByCheats( void ) const { return m_wasSpawnedByCheats; } inline const CUtlVector< CHalloweenBaseBoss::AttackerInfo > &CHalloweenBaseBoss::GetAttackerVector( void ) const { return m_attackerVector; } #endif // HALLOWEEN_BOSS_BASE_H