// AI_monster_boss_guardian.h #pragma once #ifndef SPAWNER_PAIN_FADEOUT #define SPAWNER_PAIN_FADEOUT 2.5f #endif #ifndef SPAWNER_FADEOUT #define SPAWNER_FADEOUT 1.0f #endif #ifndef SPAWNER_FADEIN_TIME #define SPAWNER_FADEIN_TIME 0.25f #endif #ifndef GUARDIAN_PAIN_DELAY #define GUARDIAN_PAIN_DELAY 0.25f #endif #ifndef GUARDIAN_RANGE_ATTACK_RANGE #define GUARDIAN_RANGE_ATTACK_RANGE 1024 #endif #ifndef GUARDIAN_RANGE_ATTACK_DELAY #define GUARDIAN_RANGE_ATTACK_DELAY 7 #endif #ifndef GUARDIAN_CHARGE_ATTACK_RANGE #define GUARDIAN_CHARGE_ATTACK_RANGE 680 #endif #ifndef GUARDIAN_NUM_PROJECTILES #define GUARDIAN_NUM_PROJECTILES 12 #endif #ifndef GUARDIAN_PAIN_TO_IDLE #define GUARDIAN_PAIN_TO_IDLE 3 #endif #ifndef GUARDIAN_PAIN_TO_PAIN #define GUARDIAN_PAIN_TO_PAIN 3 #endif #ifndef GUARDIAN_SIGHT_TO_IDLE #define GUARDIAN_SIGHT_TO_IDLE 8 #endif #ifndef GUARDIAN_MELEE_TO_IDLE #define GUARDIAN_MELEE_TO_IDLE 12 #endif #ifndef GUARDIAN_IDLE_TO_PAIN #define GUARDIAN_IDLE_TO_PAIN 3 #endif #ifndef GUARDIAN_IDLE_TO_WALK #define GUARDIAN_IDLE_TO_WALK 12 #endif #ifndef GUARDIAN_IDLE_TO_CHARGE #define GUARDIAN_IDLE_TO_CHARGE 12 #endif #ifndef GUARDIAN_IDLE_TO_MELEE #define GUARDIAN_IDLE_TO_MELEE 12 #endif #ifndef GUARDIAN_IDLE_TO_RANGE #define GUARDIAN_IDLE_TO_RANGE 12 #endif #ifndef GUARDIAN_IDLE_TO_SIGHT #define GUARDIAN_IDLE_TO_SIGHT 12 #endif #ifndef GUARDIAN_IDLE_TO_LOST #define GUARDIAN_IDLE_TO_LOST 12 #endif #ifndef GUARDIAN_WALK_TO_IDLE #define GUARDIAN_WALK_TO_IDLE 12 #endif #ifndef GUARDIAN_WALK_TO_PAIN #define GUARDIAN_WALK_TO_PAIN 3 #endif #ifndef GUARDIAN_WALK_TO_CHARGE #define GUARDIAN_WALK_TO_CHARGE 8 #endif #ifndef GUARDIAN_CHARGE_TO_WALK #define GUARDIAN_CHARGE_TO_WALK 0 #endif #ifndef GUARDIAN_CHARGE_TO_IDLE #define GUARDIAN_CHARGE_TO_IDLE 12 #endif #ifndef GUARDIAN_CHARGE_TO_PAIN #define GUARDIAN_CHARGE_TO_PAIN 3 #endif #ifndef GUARDIAN_LOST_TO_IDLE #define GUARDIAN_LOST_TO_IDLE 10 #endif #ifndef GUARDIAN_LOST_TO_PAIN #define GUARDIAN_LOST_TO_PAIN 3 #endif #ifndef GUARDIAN_LOST_TO_WALK #define GUARDIAN_LOST_TO_WALK 24 #endif #ifndef GUARDIAN_LOST_TO_CHARGE #define GUARDIAN_LOST_TO_CHARGE 24 #endif #ifndef GUARDIAN_RANGEATTACK_TO_IDLE #define GUARDIAN_RANGEATTACK_TO_IDLE 4 #endif #ifndef GUARDIAN_SPAWN_TO_IDLE #define GUARDIAN_SPAWN_TO_IDLE 4 #endif #ifndef GUARDIAN_IDLE_TO_SPAWN #define GUARDIAN_IDLE_TO_SPAWN 4 #endif class rvmSeekerBase : public rvmMonsterBase { public: CLASS_PROTOTYPE( rvmSeekerBase ); rvmSeekerBase(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; virtual bool isAlive() const; protected: virtual stateResult_t respawnSeeker( stateParms_t* parms ); }; class rvmMonsterBossGuardianSpawner : public rvmMonsterBase { public: CLASS_PROTOTYPE( rvmMonsterBossGuardianSpawner ); rvmMonsterBossGuardianSpawner(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; protected: idEntityPtr guardian; float inactive_time; float active_time; float pain_time; virtual stateResult_t update_effects( stateParms_t* parms ); virtual stateResult_t setGuardian( stateParms_t* parms ); virtual stateResult_t state_Inactive( stateParms_t* parms ); virtual stateResult_t state_Active( stateParms_t* parms ); virtual stateResult_t state_Killed( stateParms_t* parms ); }; class rvmMonsterBossGuardian : public rvmMonsterBase { public: CLASS_PROTOTYPE( rvmMonsterBossGuardian ); rvmMonsterBossGuardian(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; protected: float nextAttack; float painNextTime; bool in_melee; bool rightfoot; bool charge; idEntityPtr seeker1; idEntityPtr seeker2; idEntityPtr seeker3; idEntityPtr spawner; virtual stateResult_t Legs_Sight( stateParms_t* parms ); virtual stateResult_t Legs_Death( stateParms_t* parms ); virtual stateResult_t Legs_Pain( stateParms_t* parms ); virtual stateResult_t Legs_RangeAttack( stateParms_t* parms ); virtual stateResult_t Legs_MeleeAttack( stateParms_t* parms ); virtual stateResult_t Legs_Walk_Melee_Left( stateParms_t* parms ); virtual stateResult_t Legs_Walk_Melee_Right( stateParms_t* parms ); virtual stateResult_t Legs_Walk( stateParms_t* parms ); virtual stateResult_t Legs_Run_Melee_Left( stateParms_t* parms ); virtual stateResult_t Legs_Run_Melee_Right( stateParms_t* parms ); virtual stateResult_t Legs_Charge( stateParms_t* parms ); virtual stateResult_t Legs_Lost( stateParms_t* parms ); virtual stateResult_t Legs_Idle( stateParms_t* parms ); virtual stateResult_t Legs_SpawnSeeker( stateParms_t* parms ); virtual stateResult_t addSeeker( stateParms_t* parms ); virtual stateResult_t sightEnemy( stateParms_t* parms ); virtual stateResult_t state_Idle( stateParms_t* parms ); virtual stateResult_t state_Killed( stateParms_t* parms ); virtual stateResult_t state_Combat( stateParms_t* parms ); virtual stateResult_t combat_melee( stateParms_t* parms ); virtual stateResult_t combat_range( stateParms_t* parms ); virtual stateResult_t combat_charge( stateParms_t* parms ); virtual stateResult_t pound_impact( stateParms_t* parms ); virtual stateResult_t pound_attack( stateParms_t* parms ); virtual stateResult_t pound_attack_left( stateParms_t* parms ); virtual stateResult_t pound_attack_right( stateParms_t* parms ); virtual stateResult_t smash_ground( stateParms_t* parms ); };