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

📄 aimanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// AIManager.cpp: implementation of the CAIManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AIManager.h"
#include "Player.h"
#include "Monster.h"
#include "CharMove.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAIManager::CAIManager()
{

}

CAIManager::~CAIManager()
{

}
DWORD CAIManager::RandCurAttackKind(BASE_MONSTER_LIST	* apr, CAIParam * aprm)
{
	switch(apr->AttackKind)
	{
	case 0:		// ·£´ý
		{
			DWORD	sRate = 0;
			DWORD	eRate = 0;
			DWORD rate = rand() % 100;
			for( DWORD i = 0 ; i < apr->AttackNum ; ++i )
			{
				eRate += apr->AttackRate[i];
				if( sRate <= rate && rate < eRate )
				{
					return (aprm->CurAttackKind=i);
				}
				sRate = eRate;
			}

			ASSERT(0);
		}
		break;
	case 1:		// ÆÐÅÏ
		{
			SMONSTER_LIST	* apr2 = (SMONSTER_LIST	*)apr;
			ATTACKPATTERNINFO * pAInfo = &apr2->AttackPatternClass.pAttackPatternInfo[aprm->CurAttackPatternNum];
			WORD tmp=aprm->CurAttackPatternIndex;
			if(++aprm->CurAttackPatternIndex == pAInfo->AttackPatternNum)
				aprm->CurAttackPatternIndex = 0;

			return (aprm->CurAttackKind=pAInfo->AttackPattern[aprm->CurAttackPatternIndex]);
		}
		break;
	}
	
	ASSERT(0);
	return (aprm->CurAttackKind=0);
}
BOOL CAIManager::IsTargetChange(CPlayer * pAttacker, CMonster * pDefender)
{
	CObject * pTObject = pDefender->GetTObject();
	if(pTObject)
	{
		BASE_MONSTER_LIST* pMonsterSInfo = pDefender->GetSMonsterList();
		if(pMonsterSInfo->TargetChange)
		{
			VECTOR3 AttackerPos	= *CCharMove::GetPosition(pAttacker);
			VECTOR3 TObjectPos	= *CCharMove::GetPosition(pTObject);
			VECTOR3 DefenderPos	= *CCharMove::GetPosition(pDefender);
			DWORD	FormerDistance1		= (DWORD)CalcDistanceXZ( &TObjectPos, &DefenderPos );
			DWORD	NewDistance2		= (DWORD)CalcDistanceXZ( &AttackerPos, &DefenderPos );
			
			LONG DistGab = FormerDistance1-NewDistance2;
			if(-50 <= DistGab && DistGab <= 50)
			{
				// °Å¸®°¡ °°À¸¸é Life üũ
				if(pAttacker->GetLife() < pTObject->GetLife())
				{
					return TRUE;
				}
				else
				{
					return FALSE;
				}
			}
			else
			{
				if(DistGab > 0)
					return TRUE;
				else
					return FALSE;
			}

		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return TRUE;
	}
}

BOOL CAIManager::IsRunawayStateChange(CMonster * pDefender, CPlayer * pAttacker)
{
	// ÀÏ¹Ý ¸ó½ºÅÍ ÀÏ °æ¿ì¸¸
	if(pDefender->GetObjectKind() != eObjectKind_Monster) return FALSE;

	MONSTEREX_LIST	* apr = (MONSTEREX_LIST	*)pDefender->GetSMonsterList();
	CAIParam * aprm = &(pDefender)->m_aiParam;
	CStateParam * pr = &(pDefender)->m_stateParam;

	if(aprm->RunawayType == eRunawayType_Terminate) return FALSE;

	// µµ¸Á »ý¸í·Â Á¶°Ç
	if( (float)pDefender->GetLife() / (float)pDefender->GetMaxLife() < apr->fRunawayLifeRate )
	{

		// µµ¸Á È®·ü
		WORD Seed = random(1, 100);
		if( Seed <= apr->RunawayRate )
		{
			WORD TypeSeed = random(0, 100);
			if( TypeSeed <= apr->RunawayHelpRate )
			{
				// 1µµ¿ò ¿äûÇü
				aprm->pHelperMonster = pDefender->DoFriendSearch(apr->RunawayDistance);
				if(!aprm->pHelperMonster) return FALSE;

				aprm->pTarget = pAttacker;
				ASSERT(aprm->pTarget);
				aprm->RunawayType = eRunawayType_Help;
			}
			else
			{
				// 2´Ü¼ø µµ¸ÁÇü
				aprm->RunawayType = eRunawayType_General;
			}
			return TRUE;
		}

	}
	return FALSE;
}

⌨️ 快捷键说明

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