// AI_monster_boss_sabaoth.h // Native state-machine replacement for ai_monster_boss_sabaoth.script. #pragma once #ifndef SABAOTH_ATTACK_RATE #define SABAOTH_ATTACK_RATE 4 #endif #ifndef SABAOTH_ATTACK_RATE_MELEE #define SABAOTH_ATTACK_RATE_MELEE 1 #endif #ifndef SABAOTH_SLOW_DIST #define SABAOTH_SLOW_DIST 64 #endif #ifndef SECTION_MOVE_DIST #define SECTION_MOVE_DIST 190 #endif #ifndef CENTER_DIST #define CENTER_DIST 304 #endif #ifndef MELEE_INIT #define MELEE_INIT 290 #endif class rvmMonsterBossSabaoth : public rvmMonsterBase { public: CLASS_PROTOTYPE( rvmMonsterBossSabaoth ); rvmMonsterBossSabaoth(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; protected: float nextAttack; float nextMeleeAttack; float pathSpeed; bool noSlowToStop; idEntityPtr currentPath; idEntityPtr nextPath; virtual stateResult_t Torso_Idle( 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_Killed( stateParms_t* parms ); virtual stateResult_t state_Begin( stateParms_t* parms ); virtual stateResult_t state_Idle( stateParms_t* parms ); virtual stateResult_t move_to_corner( stateParms_t* parms ); virtual stateResult_t turn_to_corner( stateParms_t* parms ); virtual stateResult_t closeSection( stateParms_t* parms ); virtual stateResult_t openSection( stateParms_t* parms ); virtual stateResult_t state_Combat( stateParms_t* parms ); virtual stateResult_t combat_range( stateParms_t* parms ); virtual stateResult_t combat_melee( stateParms_t* parms ); virtual stateResult_t fire_bfg( stateParms_t* parms ); virtual stateResult_t open_section_1( stateParms_t* parms ); virtual stateResult_t close_section_1( stateParms_t* parms ); virtual stateResult_t open_section_2( stateParms_t* parms ); virtual stateResult_t close_section_2( stateParms_t* parms ); virtual stateResult_t open_section_3( stateParms_t* parms ); virtual stateResult_t close_section_3( stateParms_t* parms ); virtual stateResult_t open_section_4( stateParms_t* parms ); virtual stateResult_t close_section_4( stateParms_t* parms ); virtual stateResult_t open_section_5( stateParms_t* parms ); virtual stateResult_t close_section_5( stateParms_t* parms ); virtual stateResult_t open_section_6( stateParms_t* parms ); virtual stateResult_t close_section_6( stateParms_t* parms ); virtual stateResult_t open_section_7( stateParms_t* parms ); virtual stateResult_t close_section_7( stateParms_t* parms ); virtual stateResult_t open_section_8( stateParms_t* parms ); virtual stateResult_t close_section_8( stateParms_t* parms ); virtual int check_attacks( bool meleeOnly ); virtual int check_attacks() override; virtual bool do_attack( int attack_flags ) override; stateResult_t set_section_open( stateParms_t* parms, int section, bool open ); };