📄 ai_mgr.cpp
字号:
/****************************************************************************
;
; MODULE: AI_Mgr.cpp
; ;
; HISTORY: Created by SCHLEGZ on 3/19/98 2:48:28 PM
;
; COMMENT: Copyright (c) 1997, Monolith Productions Inc.
;
****************************************************************************/
#include <stdio.h>
#include "Destructable.h"
#include "BaseCharacter.h"
#include "PathPoint.h"
#include "AI_Mgr.h"
#include "ObjectUtilities.h"
#include "AIScriptList.h"
#include "PathMgr.h"
#include "PathListData.h"
#include "BloodServerShell.h"
//#include "clientbloodtrail.h"
#include "exithint.h"
#include "smellhint.h"
#include "ammopickups.h"
#include "playerobj.h"
#include "SFXMsgIds.h"
#include "Trigger.h"
#include "corpse.h"
#include "clientgibfx.h"
#include "ObjectUtilities.h"
#include "SParam.h"
#include "VoiceMgrDefs.h"
#include "cameraobj.h"
#include "SoundTypes.h"
#include "windows.h"
#include <mbstring.h>
#undef PlaySound
DLink AI_Mgr::m_CabalHead;
DDWORD AI_Mgr::m_dwNumCabal = 0;
DLink AI_Mgr::m_MonsterHead;
DDWORD AI_Mgr::m_dwNumMonster = 0;
DFLOAT AI_Mgr::m_fLastFrame = 0;
extern CBloodServerShell* g_pBloodServerShell;
extern CPlayerObj* g_pPlayerObj;
extern DBOOL LiquidFilterFn(HOBJECT hObj, void *pUserData);
extern DBOOL CharacterFilterFn(HOBJECT hObj, void *pUserData);
// Used by the player object to set the view if a camera is active
extern HOBJECT g_hActiveCamera;
BEGIN_CLASS(AI_Mgr)
ADD_BASEAI_AGGREGATE()
END_CLASS_DEFAULT_FLAGS(AI_Mgr, CBaseCharacter, NULL, NULL, CF_HIDDEN)
//Helper functions
DFLOAT MIN_VAL(DFLOAT a, DFLOAT b)
{
if(a <= b)
return a;
else
return b;
}
DFLOAT MAX_VAL(DFLOAT a, DFLOAT b)
{
if(a >= b)
return a;
else
return b;
}
char g_sCacheDir[256] = { "" };
// ----------------------------------------------------------------------- //
// ROUTINE : AI_Mgr::AI_Mgr
// DESCRIPTION : Constructor
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
AI_Mgr::AI_Mgr() : CBaseCharacter(OT_MODEL)
{
m_hstrSpotTriggerTarget = DNULL;
m_hstrSpotTriggerMessage = DNULL;
m_hstrTriggerRelayTarget = DNULL;
m_AIPathList.Init(DFALSE);
m_nScriptCmdIndex = 0;
// Class pointers
m_pAnim_Sound = DNULL;
_mbscpy((unsigned char*)m_szAIState, (const unsigned char*)"IDLE" );
for(int i=0; i < MAX_NUM_WEAPONS; i++)
_mbscpy((unsigned char*)m_szAIWeapon[i], (const unsigned char*)"NONE" );
m_fAIBullets = 0.0f;
m_fAIBMG = 0.0f;
m_fAIShells = 0.0f;
m_fAIGrenades = 0.0f;
m_fAIRockets = 0.0f;
m_fAIFlares = 0.0f;
m_fAICells = 0.0f;
m_fAICharges = 0.0f;
m_fAIFuel = 0.0f;
m_fProxBombs = 0.0f;
// Target object vars
m_hTarget = DNULL;
VEC_INIT(m_vTargetPos);
m_hTrackObject = DNULL;
VEC_INIT(m_vTrackObjPos);
memset(&m_fStimuli,0,sizeof(m_fStimuli));
m_nState = STATE_Idle;
m_nLastState = STATE_Idle;
// Adjustable vars
m_fHearingDist = 0;
m_fSensingDist = 0.0f;
m_fSmellingDist = 0.0f;
m_fSeeingDist = 0.0f;
m_fWalkSpeed = 5.0f;
m_fRunSpeed = 10.0f;
m_fJumpSpeed = 500.0f;
m_fRollSpeed = 2.0f;
m_fTimeStart = 0.0f;
m_fLoadTimeStart = 0.0f;
m_bAnimating = DFALSE;
m_bJumping = DFALSE;
Metacmd = 1;
m_hCurSound = DNULL;
m_pServerDE = DNULL;
m_bSetShutdown = DFALSE;
m_nInjuredLeg = 0;
VEC_SET(m_vScale, 1.0f, 1.0f, 1.0f);
if( m_dwNumCabal == 0 )
{
dl_TieOff( &m_CabalHead );
}
if( m_dwNumMonster == 0 )
{
dl_TieOff( &m_MonsterHead );
}
m_hEnemyAttach = DNULL;
// Greg 9/20/98: Set this to False for any enemies that need to start off in the air.
m_bMoveToGround = DTRUE;
// [blg] 10/05/98
m_bCabal = DTRUE;
memset(&m_Link, 0, sizeof(m_Link));
m_fAIMass = AI_DEFAULT_MASS;
m_fAIHitPoints = 10;
m_fAIRandomHP = 10;
m_fAIArmorPoints = 0;
m_nAIStrength = 5;
m_pCurSmell = DNULL;
m_hCurSmell = DNULL;
VEC_INIT(m_vSmellPos);
VEC_INIT(m_vDestPos);
m_nDodgeFlags = 0;
m_nCorpseType = 0;
m_fAttackLoadTime = 0;
m_nCurMetacmd = 1;
m_dwFlags = 0;
m_nBlockFlags = 0;
m_bUpdateScriptCmd = DFALSE;
m_dwScriptFlags = 0;
m_eScriptMovement = SM_WALK;
m_fScriptWaitEnd = 0;
m_fLastUpdate = 0.0f;
m_bRemoveMe = DFALSE;
m_fLastLedgeCheck = 0.0f;
m_nCurAnimation = 999; // Set to a large number to force a new animation.
VEC_SET(m_vDims, 1.0, 1.0, 1.0);
m_bStartFire = DFALSE;
m_hFireSource = DNULL;
m_bProceedAttach = DFALSE;
m_fWaitForIdleTime = 0.0f;
m_bHasTargeted = DFALSE;
}
// ----------------------------------------------------------------------- //
// ROUTINE : AI_Mgr::~AI_Mgr
// DESCRIPTION : Destructor
// RETURN TYPE : void
// ----------------------------------------------------------------------- //
AI_Mgr::~AI_Mgr()
{
if (!m_pServerDE) return;
if (m_hstrSpotTriggerTarget)
m_pServerDE->FreeString(m_hstrSpotTriggerTarget);
if (m_hstrSpotTriggerMessage)
m_pServerDE->FreeString(m_hstrSpotTriggerMessage);
if (m_hstrTriggerRelayTarget)
m_pServerDE->FreeString(m_hstrTriggerRelayTarget);
// 10/25/98 [gjk] added check for m_bCabal since it's only being added to one list.
if (m_bCabal)
{
if( m_Link.m_pData && m_dwNumCabal > 0 )
{
dl_Remove( &m_Link );
m_dwNumCabal--;
}
}
else
{
if( m_Link.m_pData && m_dwNumMonster > 0 )
{
dl_Remove( &m_Link );
m_dwNumMonster--;
}
}
if(m_hCurSound)
m_pServerDE->KillSound(m_hCurSound);
}
// ----------------------------------------------------------------------- //
// ROUTINE : AI_Mgr::InitStatics
// DESCRIPTION : Initialization function
// RETURN TYPE : DBOOL
// PARAMS : CAnim_Sound* pAnim_Sound
// PARAMS : float* pOutputTable
// PARAMS : float* pInternalTable
// ----------------------------------------------------------------------- //
DBOOL AI_Mgr::InitStatics(CAnim_Sound* pAnim_Sound)
{
m_pAnim_Sound = pAnim_Sound;
return DTRUE;
}
// ----------------------------------------------------------------------- //
// ROUTINE : AI_Mgr::StateStrToInt
// DESCRIPTION :
// RETURN TYPE : int
// PARAMS : char *pState
// ----------------------------------------------------------------------- //
int AI_Mgr::StateStrToInt(char *pState)
{
int m_nRetState = STATE_Inactive;
// Make sure its Upper case
_strupr(pState);
if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"INACTIVE", 8) == 0)
{
m_nRetState = STATE_Inactive;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"IDLE", 4) == 0)
{
m_nRetState = STATE_Idle;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SEARCH", 4) == 0)
{
m_nRetState = STATE_SearchVisualTarget;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"ATTACK", 6) == 0)
{
m_nRetState = STATE_AttackFar;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"HIDE", 4) == 0)
{
m_nRetState = STATE_Escape_Hide;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"GUARD", 5) == 0)
{
m_nRetState = STATE_GuardLocation;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SCRIPT", 6) == 0)
{
m_nRetState = STATE_Script;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL1", 8) == 0)
{
m_nRetState = STATE_Special1;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL2", 8) == 0)
{
m_nRetState = STATE_Special2;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL3", 8) == 0)
{
m_nRetState = STATE_Special3;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL4", 8) == 0)
{
m_nRetState = STATE_Special4;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL5", 8) == 0)
{
m_nRetState = STATE_Special5;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL6", 8) == 0)
{
m_nRetState = STATE_Special6;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL7", 8) == 0)
{
m_nRetState = STATE_Special7;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL8", 8) == 0)
{
m_nRetState = STATE_Special8;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"SPECIAL9", 8) == 0)
{
m_nRetState = STATE_Special9;
}
else if ( _mbsncmp((const unsigned char*)pState, (const unsigned char*)"PASSIVE", 7) == 0)
{
m_nRetState = STATE_Passive;
}
return m_nRetState;
}
// ----------------------------------------------------------------------- //
// ROUTINE : AI_Mgr::WeaponStrToInt
// DESCRIPTION :
// RETURN TYPE : DDWORD
// PARAMS : char *pWeapon
// ----------------------------------------------------------------------- //
DDWORD AI_Mgr::WeaponStrToInt(char *pWeapon)
{
DDWORD m_nRetWeapon = WEAP_BERETTA;
// WEAP_BERETTA,
if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"BERET", 5) == 0)
{
m_nRetWeapon = WEAP_BERETTA;
}
// WEAP_SHOTGUN,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SHOTGU", 5) == 0)
{
m_nRetWeapon = WEAP_SHOTGUN;
}
// WEAP_SNIPERRIFLE,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SNIPE", 5) == 0)
{
m_nRetWeapon = WEAP_SNIPERRIFLE;
}
// WEAP_ASSAULTRIFLE,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ASSAULTR", 8) == 0)
{
m_nRetWeapon = WEAP_ASSAULTRIFLE;
}
// WEAP_SUBMACHINEGUN,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SUBMA", 5) == 0)
{
m_nRetWeapon = WEAP_SUBMACHINEGUN;
}
// WEAP_FLAREGUN,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"FLARE", 5) == 0)
{
m_nRetWeapon = WEAP_FLAREGUN;
}
// WEAP_ASSAULTCANNON,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"HOWITZ", 6) == 0)
{
m_nRetWeapon = WEAP_HOWITZER;
}
// WEAP_BUGSPRAY,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"FLAME", 5) == 0)
{
m_nRetWeapon = WEAP_BUGSPRAY;
}
// WEAP_NAPALMCANNON,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NAPALM", 6) == 0)
{
m_nRetWeapon = WEAP_NAPALMCANNON;
}
// WEAP_MINIGUN,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"MINIG", 5) == 0)
{
m_nRetWeapon = WEAP_MINIGUN;
}
// WEAP_VOODOO,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"VOODO", 5) == 0)
{
m_nRetWeapon = WEAP_VOODOO;
}
// WEAP_ORB,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ORB", 3) == 0)
{
m_nRetWeapon = WEAP_ORB;
}
// WEAP_DEATHRAY,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"LASER", 5) == 0)
{
m_nRetWeapon = WEAP_DEATHRAY;
}
// WEAP_LIFELEECH,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"LIFEL", 5) == 0)
{
m_nRetWeapon = WEAP_LIFELEECH;
}
// WEAP_TESLACANNON,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"TESLA", 5) == 0)
{
m_nRetWeapon = WEAP_TESLACANNON;
}
// WEAP_NAPALMCANNON,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NAPALM", 6) == 0)
{
m_nRetWeapon = WEAP_NAPALMCANNON;
}
// WEAP_MELEE,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"MELEE", 5) == 0)
{
m_nRetWeapon = WEAP_MELEE;
}
#ifdef _ADD_ON
// WEAP_COMBATSHOTGUN,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"COMBAT", 6) == 0)
{
m_nRetWeapon = WEAP_COMBATSHOTGUN;
}
// WEAP_FLAYER,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"FLAYER", 6) == 0)
{
m_nRetWeapon = WEAP_FLAYER;
}
#endif
// WEAP_SINGULARITY,
else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SINGULAR", 8) == 0)
{
m_nRetWeapon = WEAP_SINGULARITY;
}
// WEAP_NONE,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -