// AI_monster_boss_cyberdemon.h // Native state-machine replacement for ai_monster_boss_cyberdemon.script. #pragma once #ifndef CYBER_ATTACK_RATE #define CYBER_ATTACK_RATE 5 #endif #ifndef CYBER_PAIN_DELAY #define CYBER_PAIN_DELAY 0.25f #endif #ifndef CYBER_NOFOVTIME #define CYBER_NOFOVTIME 4 #endif #ifndef CYBER_PAIN_TO_IDLE #define CYBER_PAIN_TO_IDLE 2 #endif #ifndef CYBER_PAIN_TO_PAIN #define CYBER_PAIN_TO_PAIN 0 #endif #ifndef CYBER_MELEE_TO_IDLE #define CYBER_MELEE_TO_IDLE 4 #endif #ifndef CYBER_RANGE_TO_IDLE #define CYBER_RANGE_TO_IDLE 4 #endif #ifndef CYBER_IDLE_TO_PAIN #define CYBER_IDLE_TO_PAIN 0 #endif #ifndef CYBER_IDLE_TO_WALK #define CYBER_IDLE_TO_WALK 4 #endif #ifndef CYBER_WALK_TO_IDLE #define CYBER_WALK_TO_IDLE 4 #endif #ifndef CYBER_WALK_TO_RANGEATTACK #define CYBER_WALK_TO_RANGEATTACK 4 #endif #ifndef CYBER_WALK_TO_MELEE #define CYBER_WALK_TO_MELEE 4 #endif class rvmMonsterBossCyberdemon : public rvmMonsterBase { public: CLASS_PROTOTYPE( rvmMonsterBossCyberdemon ); rvmMonsterBossCyberdemon(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; protected: float nextAttack; float nextNoFOVAttack; float painNextTime; idStr range_attack_anim; idEntityPtr kick_entity; virtual stateResult_t Torso_Idle( stateParms_t* parms ); virtual stateResult_t Torso_Pain( stateParms_t* parms ); virtual stateResult_t Torso_MeleeAttack( stateParms_t* parms ); virtual stateResult_t Torso_RangeAttack( stateParms_t* parms ); virtual stateResult_t Legs_Idle( stateParms_t* parms ); virtual stateResult_t Legs_Walk( stateParms_t* parms ); virtual stateResult_t state_Begin( stateParms_t* parms ); virtual stateResult_t state_Idle( stateParms_t* parms ); virtual stateResult_t combat_range( stateParms_t* parms ); virtual stateResult_t combat_melee( stateParms_t* parms ); virtual int check_attacks() override; virtual bool do_attack( int attack_flags ) override; };