// AI_base.h // Native state-machine replacement for ai_base.script. // Root object mirrors DoomScript object "ai" and owns an idAI native actor. #pragma once #ifndef ATTACK_DODGE_LEFT #define ATTACK_DODGE_LEFT 1 #define ATTACK_DODGE_RIGHT 2 #define ATTACK_COMBAT_NODE 4 #define ATTACK_MELEE 8 #define ATTACK_LEAP 16 #define ATTACK_MISSILE 32 #define ATTACK_SPECIAL1 64 #define ATTACK_SPECIAL2 128 #define ATTACK_SPECIAL3 256 #define ATTACK_SPECIAL4 512 #endif #ifndef AI_NOT_ACTIVATED #define AI_NOT_ACTIVATED 0 #define AI_CHASING_ENEMY 1 #define AI_LOST 2 #define AI_PATH_FOLLOWING 3 #define AI_ATTACK_NODE 4 #endif // The weapon native scripts use stateResult_t/stateParms_t. If this port is dropped // into a branch where those are only declared in the weapon layer, include that header // before this one or move the enum/struct into a shared script-state header. class rvmAIObject : public idClass { public: CLASS_PROTOTYPE( rvmAIObject ); rvmAIObject(); virtual ~rvmAIObject(); virtual void Init( idAI* aiOwner ); virtual void Destroy(); virtual void Update(); virtual void SetState( const char* stateName ); virtual void SetAnimState( int channel, const char* stateName, int blendFrames ); virtual bool InAnimState( int channel, const char* stateName ) const; virtual void StartAction( const char* actionName ); virtual bool InAction() const; virtual void FinishAction( const char* actionName ); virtual bool ActionDone( const char* actionName ) const; virtual stateResult_t RunStateByName( const char* stateName, stateParms_t* parms ); protected: static const int AI_NATIVE_MAX_CHANNELS = 4; idAI* owner; idStr currentState; idStr currentAction; idStr currentAnimState[AI_NATIVE_MAX_CHANNELS]; idStr waitActionName; stateParms_t stateParms; stateParms_t actionParms; stateParms_t animParms[AI_NATIVE_MAX_CHANNELS]; float scratchEndTime; float scratchMinTime; float scratchNextTime; float scratchCount; float scratchFlags; bool scratchBool; idEntityPtr scratchEntity; idStr scratchString; virtual int ChannelIndex( int channel ) const; virtual void ClearParms( stateParms_t& parms ); virtual float Time() const; virtual float FrameTime() const; virtual float RandomFloat( float max = 1.0f ) const; virtual float RandomDelay( float minSeconds, float maxSeconds ) const; virtual float DelayTime( float seconds ) const; virtual float RandomTime( float seconds ) const; virtual bool InfluenceActive() const; virtual idPlayer* Player() const; virtual void IdleAnim( int channel, const char* animName ); virtual void PlayCycle( int channel, const char* animName ); virtual void PlayAnim( int channel, const char* animName, bool blend = false ); virtual void StopAnim( int channel, int frames ); virtual bool AnimDone( int channel, int blendFrames ) const; virtual bool HasAnim( int channel, const char* animName ) const; virtual const char* GetPainAnim() const; virtual void SetBlendFrames( int channel, int blendFrames ); virtual void OverrideAnim( int channel ); virtual void SetAnimPrefix( const char* prefix ); virtual void PreventPain( float seconds ); virtual void LookAtEnemy( float seconds ); virtual void LookAtEntity( idEntity* ent, float seconds ); virtual void FaceEnemy(); virtual void FaceEntity( idEntity* ent ); virtual bool FacingIdeal() const; virtual void StopMove(); virtual void MoveToEnemy(); virtual void MoveToEnemyHeight(); virtual void MoveToEntity( idEntity* ent ); virtual void MoveToPosition( const idVec3& pos ); virtual void MoveToAttackPosition( idEntity* ent, const char* animName ); virtual void MoveOutOfRange( idEntity* ent, float range ); virtual void MoveToCover(); virtual void Wander(); virtual bool MoveDone() const; virtual int MoveStatus() const; virtual bool DestinationUnreachable() const; virtual idActor* GetEnemy() const; virtual void SetEnemy( idEntity* ent ); virtual void ClearEnemy(); virtual bool EnemyVisible() const; virtual bool EnemyInFOV() const; virtual bool EnemyDead() const; virtual float EnemyRange() const; virtual bool CheckForMelee() const; virtual bool CanHitEnemy() const; virtual bool CanHitEnemyFromAnim( const char* animName ) const; virtual bool EntityInAttackCone( idEntity* ent ) const; virtual bool CanReachEnemy() const; virtual bool CanReachEntity( idEntity* ent ) const; virtual bool CanSeeEntity( idEntity* ent ) const; virtual void LocateEnemy(); virtual bool AttackMelee( const char* meleeDefName ); virtual idEntity* AttackMissile( const char* jointName ); virtual void MuzzleFlash( const char* jointName ); virtual idEntity* GetCombatNode(); virtual bool Pain() const; virtual bool Activated() const; virtual void ClearActivated(); virtual bool MovingForward() const; virtual bool Blocked() const; virtual bool ObstacleInPath() const; virtual void AllowMovement( bool allow ); virtual void SetMoveType( int moveType ); virtual float GetTurnDelta() const; virtual void TurnTo( float yaw ); virtual void TurnToPos( const idVec3& pos ); virtual float CurrentYaw() const; virtual idVec3 GetOrigin() const; virtual idVec3 GetEnemyPos() const; virtual idVec3 PredictEnemyPos( float seconds ) const; virtual idVec3 GetLinearVelocity() const; virtual void SetLinearVelocity( const idVec3& velocity ); virtual float AnimLength( int channel, const char* animName ) const; virtual const char* ChooseAnim( int channel, const char* animName ) const; virtual bool TestAnimMove( const char* animName ) const; virtual bool TestAnimMoveTowardEnemy( const char* animName ) const; virtual bool TestAnimAttack( const char* animName ) const; virtual bool TestMoveToPosition( const idVec3& pos ) const; virtual float TravelDistanceToPoint( const idVec3& pos ) const; virtual float TravelDistanceToEntity( idEntity* ent ) const; virtual float TravelDistanceBetweenPoints( const idVec3& source, const idVec3& dest ) const; virtual idVec3 GetReachableEntityPosition( idEntity* ent ) const; virtual idVec3 GetJumpVelocity( const idVec3& pos, float speed, float maxHeight ) const; virtual void AttackBegin( const char* damageDefName ); virtual void AttackEnd(); virtual void ChargeAttack( const char* damageDefName ); virtual float TestChargeAttack() const; virtual idEntity* CreateMissile( const char* jointName ); virtual idEntity* FireMissileAtTarget( const char* jointName, const char* targetName ); virtual idEntity* LaunchMissile( const idVec3& origin, const idAngles& angles ); virtual void DirectDamage( idEntity* target, const char* damageDefName ); virtual void RadiusDamageFromJoint( const char* jointName, const char* damageDefName ); virtual void SetFlySpeed( float speed ); virtual void SetFlyOffset( int offset ); virtual void ClearFlyOffset(); virtual void SetHealth( float value ); virtual float GetHealth() const; virtual void AllowDamage(); virtual void IgnoreDamage(); virtual void BecomeSolid(); virtual void BecomeNonSolid(); virtual void PreBurn(); virtual void Burn(); virtual void ClearBurn(); virtual void KillEntity( idEntity* ent ); virtual idEntity* RandomPathFrom( idEntity* from ) const; virtual idEntity* FindEnemy( bool useFOV ); virtual idEntity* FindEnemyAI( bool useFOV ); virtual idEntity* HeardSound( bool ignoreTeam ); virtual idEntity* FindActorsInBounds( const idVec3& mins, const idVec3& maxs ); virtual idEntity* ClosestReachableEnemyOfEntity( idEntity* teamMate ); virtual idEntity* GetRandomTarget( const char* type ); virtual idVec3 GetVectorKey( const char* key, const char* defaultValue = "0 0 0" ) const; virtual void HideEntity( idEntity* ent ); virtual void ShowEntity( idEntity* ent ); virtual void RemoveEntity( idEntity* ent ); virtual int GetIntKey( const char* key, const char* defaultValue = "0" ) const; virtual int GetIntKey( const char* key, int defaultValue ) const; virtual float GetFloatKey( const char* key, const char* defaultValue = "0" ) const; virtual float GetFloatKey( const char* key, float defaultValue ) const; virtual const char* GetKey( const char* key, const char* defaultValue = "" ) const; virtual idEntity* GetEntityKey( const char* key ) const; virtual void HideOwner(); virtual void ShowOwner(); virtual bool CanBecomeSolid() const; virtual void SetNeverDormant( bool value ); virtual void WakeOnFlashlight( bool value ); virtual void StartSoundKey( const char* key, int channel, bool netSync = false ); virtual void StartFx( const char* fx ); virtual void SetSmokeVisibility( int index, bool visible ); virtual void TriggerParticles( const char* jointName ); virtual void BecomeRagdoll(); virtual void StopThinking(); virtual void RemoveOwner(); }; #define AI_DISPATCH_STATE( stateNameLiteral, methodName ) \ if ( !idStr::Icmp( stateName, stateNameLiteral ) ) { return methodName( parms ); }