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

📄 ai_mgr.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

 /****************************************************************************
 ;
 ;	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 + -