// AI_monster_base.h // Native state-machine replacement for ai_monster_base.script. #pragma once class rvmMonsterBase : public rvmAIObject { public: CLASS_PROTOTYPE( rvmMonsterBase ); rvmMonsterBase(); virtual void Init( idAI* aiOwner ) override; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ) override; protected: float run_distance; float walk_turn; bool run; bool ambush; bool ignoreEnemies; bool stay_on_attackpath; bool idle_sight_fov; float customBlendOut; idEntityPtr current_path; idEntityPtr next_path; bool resurrect; bool ignore_lostcombat; bool blocked; bool ignore_sight; // Animation state machines. virtual stateResult_t Torso_CustomCycle( stateParms_t* parms ); virtual stateResult_t Torso_CustomAnim( stateParms_t* parms ); virtual stateResult_t Torso_Sight( stateParms_t* parms ); virtual stateResult_t Torso_Death( stateParms_t* parms ); virtual stateResult_t Torso_Idle( stateParms_t* parms ); virtual stateResult_t Legs_Idle( stateParms_t* parms ); virtual stateResult_t Legs_Death( stateParms_t* parms ); // Main/action state machines. virtual stateResult_t state_Begin( stateParms_t* parms ); virtual stateResult_t state_Spawner( stateParms_t* parms ); virtual stateResult_t state_Resurrect( stateParms_t* parms ); virtual stateResult_t state_Killed( stateParms_t* parms ); virtual stateResult_t state_Dead( stateParms_t* parms ); virtual stateResult_t state_Combat( stateParms_t* parms ); virtual stateResult_t state_LostCombat( stateParms_t* parms ); virtual stateResult_t state_FollowAlternatePath( stateParms_t* parms ); virtual stateResult_t monster_begin( stateParms_t* parms ); virtual stateResult_t wait_for_enemy( stateParms_t* parms ); virtual stateResult_t sight_enemy( stateParms_t* parms ); virtual stateResult_t walk_on_trigger( stateParms_t* parms ); virtual stateResult_t wake_on_trigger( stateParms_t* parms ); virtual stateResult_t wake_on_enemy( stateParms_t* parms ); virtual stateResult_t wake_on_attackcone( stateParms_t* parms ); virtual stateResult_t idle_followPathEntities( stateParms_t* parms ); virtual stateResult_t path_corner( stateParms_t* parms ); virtual stateResult_t path_anim( stateParms_t* parms ); virtual stateResult_t path_cycleanim( stateParms_t* parms ); virtual stateResult_t path_turn( stateParms_t* parms ); virtual stateResult_t path_wait( stateParms_t* parms ); virtual stateResult_t path_waitfortrigger( stateParms_t* parms ); virtual stateResult_t path_hide( stateParms_t* parms ); virtual stateResult_t path_show( stateParms_t* parms ); virtual stateResult_t path_attack( stateParms_t* parms ); virtual stateResult_t combat_wander( stateParms_t* parms ); virtual stateResult_t combat_turret_node( stateParms_t* parms ); virtual stateResult_t combat_attack_cone( stateParms_t* parms ); virtual stateResult_t combat_ainode( stateParms_t* parms ); // Non-blocking helpers. virtual int check_attacks(); virtual bool do_attack( int attack_flags ); virtual bool checkTurretAttack(); virtual void playCustomCycle( const char* animname, float blendTime ); virtual void playCustomAnim( const char* animname, float blendIn, float blendOut ); virtual void trigger_wakeup_targets(); virtual bool checkForEnemy( bool use_fov ); virtual void archvile_minion(); virtual bool can_resurrect(); virtual void monster_resurrect( idEntity* enemy ); virtual void enemy_dead(); virtual bool check_blocked(); virtual bool combat_chase(); virtual void combat_lost(); virtual void monster_base_lost_combat(); virtual void checkNodeAnim( idEntity* node, const char* prefix, const char* anim ); virtual void follow_alternate_path1(); virtual void follow_alternate_path2(); virtual void follow_alternate_path3(); };