⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ai_mgr.h

📁 Blood 2全套源码
💻 H
字号:

 /****************************************************************************
 ;
 ;	MODULE:		AI_Mgr.h
 ; ;
 ;	HISTORY:	Created by SCHLEGZ on 3/18/98 10:11:58 PM
 ;
 ;	COMMENT:	Copyright (c) 1997, Monolith Productions Inc.
 ;
 ****************************************************************************/

#ifndef __AI_MGR_H__
#define __AI_MGR_H__

#include "basecharacter.h"
#include "cpp_aggregate_de.h"
#include "InventoryMgr.h"
#include "Anim_Sound.h"

#include "AI_Shared.h"
#include "AIScriptList.h"
#include "PathList.h"
#include "physicalattributes.h"

// Don't include this here, causes conflict if you include this header in any function that uses PlaySound
// GK
//#include <windows.h> 

#define ADD_BASEAI_AGGREGATE() \
	ADD_STRINGPROP(SpotTriggerTarget, "") \
	ADD_STRINGPROP(SpotTriggerMessage, "") \
	ADD_STRINGPROP(TriggerRelayTarget, "") \

#define	SIGHT				0
#define SOUND				1
#define SMELL				2
#define SENSE				3
#define THREAT				4
#define HEALTH				5
#define NUM_STIMULI			HEALTH + 1

#define STIM_SIGHT			1
#define STIM_SOUND			2
#define STIM_SMELL			3
#define STIM_SENSE			4

#define STATE_AttackClose			0
#define STATE_AttackFar				1
#define STATE_SearchVisualTarget	2
#define STATE_Escape_Hide			3
#define STATE_Escape_RunAway		4
#define STATE_Idle					5
#define STATE_GuardLocation			6
#define STATE_FindHealth			7
#define STATE_FindAmmo				8
#define STATE_Hide					9
#define STATE_Dodge					10
#define STATE_Teleport				11
#define STATE_EnemyAttach			12
#define STATE_AssistAlly			13
#define STATE_SearchSmellTarget		14
#define STATE_Special1				15
#define STATE_Special2				16
#define STATE_Special3				17
#define STATE_Special4				18
#define STATE_Special5				19
#define STATE_Special6				20
#define STATE_Special7				21
#define STATE_Special8				22
#define STATE_Special9				23
#define STATE_Passive				24

#define STATE_Dying				100
#define STATE_Script			101
#define STATE_Recoil			102
#define STATE_JumpOverObj		103
#define STATE_CrawlUnderObj		104
#define STATE_WalkAroundObj		105
#define STATE_RunAroundObj		106
#define STATE_WalkToPos			107
#define STATE_RunToPos			108

#define STATE_Inactive			999

// Metacmds
#define	MC_IDLE				0
#define MC_WALK				1
#define MC_RUN				2
#define MC_JUMP				3
#define	MC_CROUCH			4
#define MC_CRAWL			5
#define MC_SWIM				6
#define MC_FIRE_STAND		7
#define MC_FIRE_WALK		8
#define MC_FIRE_RUN			9
#define MC_FIRE_JUMP		10
#define MC_FIRE_CROUCH		11
#define MC_FIRE_CRAWL		12
#define MC_ROLL_FORWARD		13
#define MC_ROLL_BACKWARD	14
#define MC_ROLL_LEFT		15
#define MC_ROLL_RIGHT		16
#define MC_TAUNT_BEG		17
#define MC_TAUNT_BOLD		18
#define MC_RECOIL			19
#define MC_DEAD				20
#define MC_DODGE_LEFT		21
#define MC_DODGE_RIGHT		22	
#define MC_EXTRA			23
#define MC_LAYPROXIMITY		24
#define MC_SPECIAL			25

//Flags
#define FLAG_CRAWL			0x00000001
#define FLAG_JUMP			0x00000002
#define FLAG_LIMP			0x00000004
#define FLAG_DODGE			0x00000008
#define FLAG_LIMBLOSS		0x00000010
#define FLAG_ALWAYSRECOIL	0x00000020
#define FLAG_ALWAYSGIB		0x00000040
#define FLAG_CANASSIST		0x00000080
#define	FLAG_ALWAYSCLEAR	0x00000100	// 10/26/1998 --Loki
#define FLAG_NOAMMOCOLLECT	0x00000200  // 02/10/1999 --Loki
#define FLAG_NIGHTMAREDEATH 0x00000400	// 02/25/1999 --Loki
#define FLAG_NEVERGIB		0x00000800	// 02/25/1999 --Loki

//obstruction flags
#define BLOCK_UPPER			0x00000001
#define BLOCK_MIDDLE		0x00000002
#define BLOCK_LOWER			0x00000004
#define BLOCK_RIGHT			0x00000010
#define BLOCK_CENTER		0x00000020
#define BLOCK_LEFT			0x00000040

//find object in radius flags
#define FIND_AVOID_TARGET	0x00000001
#define FIND_VISIBLE		0x00000002
#define FIND_FACE_OBJECT	0x00000004
#define FIND_SPECIFIC_OBJ	0x00000008

#define TRIGGER_PLAY_SOUND		        SCRIPT_PLAY_SOUND
#define TRIGGER_SET_STATE				SCRIPT_SET_STATE
#define TRIGGER_PLAY_ANIMATION			SCRIPT_PLAY_ANIMATION
#define TRIGGER_TARGET_OBJECT			SCRIPT_TARGET_OBJECT

#define TRIGGER							"TRIGGER"
#define TRIGGER_SOUND					"SOUND_TRIGGER"

#define TRIGGER_SCRIPT					"SCRIPT"
#define TRIGGER_STYPE_INTERRUPTABLE		"INTERRUPTABLE"

#define SCRIPT_MOVEMENT_WALK			"WALK"
#define SCRIPT_MOVEMENT_RUN				"RUN"
#define SCRIPT_MOVEMENT_FLY				"FLY"

//dodge flags
#define FORWARD				0x00000001
#define BACKWARD			0x00000002
#define RIGHT				0x00000004
#define LEFT				0x00000008

#define ROLL				0x00000010
#define DODGE				0x00000020

//play sound flags
#define	PLAY_INTERRUPT		0x00000001
#define PLAY_WAIT			0x00000002


#define AI_SCRFLG_LOOP					(1<<0)
#define AI_SCRFLG_INT					(1<<1)
#define AI_SCRFLG_OPPORTFIRE			(1<<2)

// Amount of time the ai must wait before going into the idle state from another state
#define WAITFORIDLETIME		120.0f

//externs
class AI_Shared;
class CInventoryMgr;
class CAnimation;

class AI_Mgr : public CBaseCharacter
{
public:

	AI_Mgr();
	~AI_Mgr();

	DBOOL		InitStatics(CAnim_Sound* pAnim_Sound);

	//efficient means to track AI in a level
	DBOOL	m_bCabal;

	static DLink	m_CabalHead;
	static DDWORD	m_dwNumCabal;

	static DLink	m_MonsterHead;
	static DDWORD	m_dwNumMonster;

	DLink			m_Link;

	static DFLOAT	m_fLastFrame;

private:

	void		Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags);
	void		Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags);

protected:

    AI_Shared   AIShared;					// Shared functions

    // Class pointers
    CAnim_Sound*    m_pAnim_Sound;			// Animation Class

    DFLOAT m_fAIMass;

    DFLOAT m_fAIHitPoints;
	DFLOAT m_fAIRandomHP;
    DFLOAT m_fAIArmorPoints;

    char	m_szAIState[32];
    char	m_szAIWeapon[5][32];
	DFLOAT	m_fAIBullets;
	DFLOAT	m_fAIBMG;
	DFLOAT	m_fAIShells;
	DFLOAT	m_fAIGrenades;
	DFLOAT	m_fAIRockets;
	DFLOAT	m_fAIFlares;
	DFLOAT	m_fAICells;
	DFLOAT	m_fAICharges;
	DFLOAT	m_fAIFuel;
	DFLOAT	m_fProxBombs;
	int		m_nAIStrength;

    // Target object vars					
	HOBJECT		m_hTarget;					
    DVector     m_vTargetPos;				
	HOBJECT		m_hTrackObject;				// Object to Track! Smells for now, could be Weapons,Ammo,Health
    DVector		m_vTrackObjPos;
	DVector		m_vGuardPos;

	DLink*		m_pCurSmell;
	HOBJECT		m_hCurSmell;
	DVector		m_vSmellPos;

	DVector		m_vDestPos;

	float		m_fStimuli[NUM_STIMULI];				//Stimuli set

    int			m_nState;
    int			m_nLastState;
    
	//conditions
	int			m_nDodgeFlags;

	HSTRING		m_hstrSpotTriggerTarget;
	HSTRING		m_hstrSpotTriggerMessage;
	HSTRING		m_hstrTriggerRelayTarget;

    // Adjustable vars
    DFLOAT		m_fHearingDist;				// How far can we hear 
    DFLOAT		m_fSensingDist;				// How far can we sense a player
    DFLOAT		m_fSmellingDist;			// How far can we smell
    DFLOAT		m_fSeeingDist;				// How far can we see
				
  	DFLOAT		m_fWalkSpeed;				// How fast AI walks
	DFLOAT		m_fRunSpeed;			    // How fast AI runs
	DFLOAT		m_fJumpSpeed;				// How fast AI jumps
	DFLOAT		m_fRollSpeed;			
																
    DFLOAT		m_fTimeStart;				// Temp Var
    DFLOAT		m_fLoadTimeStart;			// Temp Var

	DDWORD		m_nCorpseType;

	DFLOAT		m_fAttackLoadTime;
									
    DBOOL		m_bAnimating;
	DBOOL		m_bJumping;

    int			Metacmd;
	int			m_nCurMetacmd;

	DDWORD		m_dwFlags;

	int			m_nBlockFlags;

	HSOUNDDE	m_hCurSound;

	CServerDE*	m_pServerDE;
	DBOOL		m_bSetShutdown;

	DFLOAT		m_fLastUpdate;

	int			m_nInjuredLeg;

	HOBJECT		m_hEnemyAttach;

	DVector		m_vScale;				//size and weight of AI...adds variety

	DBOOL		m_bMoveToGround;

	DBOOL		m_bRemoveMe;			// Remove this object on the next update

	DFLOAT		m_fLastLedgeCheck;

    DDWORD		m_nCurAnimation;		// The current animation
	DVector		m_vDims;

	DBOOL		m_bStartFire;
	HOBJECT		m_hFireSource;

	DBOOL		m_bProceedAttach;

	float		m_fWaitForIdleTime;
	DBOOL		m_bHasTargeted;

	// Scripting
    
	enum AIScriptMovement
	{
		SM_WALK=0, SM_RUN
	};
    
	DBOOL				m_bUpdateScriptCmd;		// Time to get next script command
	AISCRIPTCMD			m_curScriptCmd;			// The current script command
	CAIScriptList		m_scriptCmdList;		// List of all script commands
	int					m_nScriptCmdIndex;		// Index into m_scriptCmdList
	DDWORD				m_dwScriptFlags;		// Flags used in scripting state

	PathList			m_AIPathList;			// Current list of path points
	AIScriptMovement	m_eScriptMovement;		// Current mode of script movement
	DFLOAT				m_fScriptWaitEnd;		// Time when script wait should end

	
public : // Member functions

	void			SetListenDistance(DFLOAT fDistance)			{ m_fHearingDist = fDistance; }
	void			SetSightDistance(DFLOAT fDistance)			{ m_fSeeingDist = fDistance; }
	void			SetSenseDistance(DFLOAT fDistance)			{ m_fSensingDist = fDistance; }
	void			SetSmellDistance(DFLOAT fDistance)			{ m_fSmellingDist = fDistance; }
					
	void			SetWalkSpeed(DFLOAT fSpeed)					{ m_fWalkSpeed = fSpeed; }
	void			SetRunSpeed(DFLOAT fSpeed)					{ m_fRunSpeed = fSpeed; }
	void			SetJumpSpeed(DFLOAT fSpeed)					{ m_fJumpSpeed = fSpeed; }
	void			SetRollSpeed(DFLOAT fSpeed)					{ m_fRollSpeed = fSpeed; }
					
    virtual int		StateStrToInt(char *pState);
    virtual DDWORD	WeaponStrToInt(char *pWeapon);

	void			DetachFromEnemy()							{ m_hEnemyAttach = DNULL; }
	void			ProceedToAttach()							{ m_bProceedAttach = DTRUE; }

	void			SetCacheDirectory(char* sDir);
	void			CacheSoundFileRange(char* sBase, int nFirst, int nLast);
	void			CacheSoundFile(char* sBase);

	HOBJECT			GetTarget()									{ return m_hTarget; }
protected :

	DDWORD			EngineMessageFn(DDWORD messageID, void *pData, DFLOAT lData);
	DDWORD			ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead);
					
	DBOOL			ReadProp(ObjectCreateStruct *pStruct);
	void			OnStringKey(ArgList* pArgList);
	DBOOL			HandleTrigger( HOBJECT hSender, HMESSAGEREAD hRead );
	virtual DBOOL	HandleDamage();
	void			HandleTouch(HOBJECT hObj);

	virtual	void	SetNewState(int nState);
    DBOOL			SetAnimation(DDWORD nAni);

	void			StopVelocity()
					{
						DVector vVel;
						m_pServerDE->GetVelocity(m_hObject, &vVel);
						vVel.x = vVel.z = 0.0f;
						Move(vVel, MATH_EPSILON);
					}

	//Scripting functions
    void			PlayAnimation(char* pAniName);
    void			SetTarget(char* pTargetName);
    void			SetNewTarget(HOBJECT hNewTarget);
    // Scripting Stuff
    void			UpdateScriptCommand();
    void			SetSetMovementCmd();
    void			SetFollowPathCmd();
    void			UpdateFollowPathCmd();
    void			SetMoveToObjectCmd();
    void			UpdateMoveToObjectCmd();
    void			SetPlaysoundCmd();
    void			SetSetStateCmd();
    void			SetTargetCmd();
    void			SetWaitCmd();
    void			UpdateWaitCmd();
    void			SetPlayAnimationCmd(DBOOL bLooping = DFALSE);
    void			UpdatePlayAnimationCmd();
    // Utility stuff
    void			FacePos(DVector vTargetPos);
    void			FaceObject(HOBJECT hObj);

	void			InsertMe();
               
  	virtual void	InitialUpdate(int nData);
	virtual	DBOOL	AI_Update();

	//State computations
	int				ComputeStimuli();
	DFLOAT			ComputeThreat();
	virtual void	ComputeState(int nStimType = -1)		{ }

	DBOOL			ChooseOpportunityTarget();

	//Helper functions
	DBOOL			CheckObstructed(DVector vDir, DFLOAT fSpeed);
	int				CalculateObstruction(IntersectInfo* IInfo = DNULL);
	DFLOAT			CalculateTurn(IntersectInfo* IInfo = DNULL);
	DBOOL			NavigateObstacle();
	HOBJECT			FindObjectInRadius(HCLASS hObjectTest, DFLOAT fRange, DDWORD dwFlags = 0);
	DBOOL			CanSee( HOBJECT hTarget );
	DBOOL			Move(DVector &vDir, DFLOAT fSpeed);
	DBOOL			Jump(DFLOAT m_fYSpeed, DFLOAT m_fZSpeed);
	virtual DBOOL	Fire(DBOOL bAltFire = DFALSE);
	DBOOL			CheckClearShot(DVector &vPos, DRotation &rRot, DBOOL bAltFire, DDWORD dwFlags = 0);
	DBOOL			IsClearXZ(DVector vDir, DFLOAT fDist);
	int				CalculateDodge(DVector vPos);
	DBOOL			IsLedge(DVector vDir);
	DBOOL			CreateBloodSpurt(int nNodeHit);
	DBOOL			CreateCorpse();
	DBOOL			CreateLimb(DVector vDir, int nLimbType = 0);
	DBOOL			CreateGibs(DVector vDir, int nNumGibs, int nType, DFLOAT fDamage);
	void			RemoveMe();

	//Action functions
	virtual void	MC_Idle();
	virtual	void	MC_Talk();
	virtual void	MC_Walk();
	virtual void	MC_Run();
	virtual void	MC_Jump();
	virtual void	MC_Crouch();
	virtual void	MC_Crawl();
	virtual void	MC_Swim();
	virtual void	MC_Fire_Stand();
	virtual void	MC_Fire_Walk();
	virtual void	MC_Fire_Run();
	virtual void	MC_Fire_Jump();
	virtual void	MC_Fire_Crouch();
	virtual void	MC_Fire_Crawl();
	virtual void	MC_Roll_Forward(DBOOL bLoop = DFALSE);
	virtual void	MC_Roll_Backward();
	virtual void	MC_Roll_Left();
	virtual void	MC_Roll_Right();
	virtual void	MC_Dodge_Left();
	virtual void	MC_Dodge_Right();
	virtual void	MC_Taunt_Beg();
	virtual void	MC_Taunt_Bold();
	virtual void	MC_Recoil();
	virtual void	MC_Dead();
	virtual void	MC_Special(int nIndex = 0);

	virtual void	MC_FaceTarget();
	virtual void	MC_FaceTrackObj();
	virtual void	MC_FacePos(DVector vPos);
	virtual void	MC_BestWeapon();
	virtual void	MC_LayProximity();

	virtual void	MC_Extra(const char *lpszParam = DNULL);

	virtual void	Script_Walk();
	virtual void	Script_Fire_Walk();
	virtual void	Script_Run();
	virtual void	Script_Fire_Run();
	virtual DBOOL	Script_Fire_Stand();

	//State functions
	virtual void	AI_STATE_Dying();
    virtual void	AI_STATE_Script();
	virtual void	AI_STATE_Recoil();
	virtual void	AI_STATE_WalkAroundObj();
	virtual void	AI_STATE_RunAroundObj();
	virtual void	AI_STATE_JumpOverObj();
	virtual void	AI_STATE_CrawlUnderObj();
	virtual void	AI_STATE_WalkToPos();
	virtual void	AI_STATE_RunToPos();

	virtual void	AI_STATE_AttackClose()				{ AI_STATE_AttackFar(); }
	virtual void	AI_STATE_AttackFar()				{ AI_STATE_AttackClose(); }
	virtual void	AI_STATE_SearchVisualTarget();
	virtual void	AI_STATE_SearchSmellTarget();
	virtual void	AI_STATE_Escape_Hide()				{ }
	virtual void	AI_STATE_Escape_RunAway()			{ }
	virtual void	AI_STATE_GuardLocation();
	virtual void	AI_STATE_Idle();
	virtual void	AI_STATE_Dodge()					{ }
	virtual void	AI_STATE_Teleport()					{ }
	virtual void	AI_STATE_EnemyAttach()				{ }
	virtual void	AI_STATE_AssistAlly();
	virtual void	AI_STATE_FindAmmo();
	virtual void	AI_STATE_FindHealth();
	virtual void	AI_STATE_Special1()					{ }
	virtual void	AI_STATE_Special2()					{ }
	virtual void	AI_STATE_Special3()					{ }
	virtual void	AI_STATE_Special4()					{ }
	virtual void	AI_STATE_Special5()					{ }
	virtual void	AI_STATE_Special6()					{ }
	virtual void	AI_STATE_Special7()					{ }
	virtual void	AI_STATE_Special8()					{ }
	virtual void	AI_STATE_Passive();
};

#endif __AI_MGR_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -