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

📄 wanderstate.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include <Timer.h>
#include "WanderState.h"
#include "Field.h"
#include <SinTable.h>
#include "AIParamParser.h"
#include "Monster.h"


WanderState::WanderState()
{
	m_pSearchTimer = new util::Timer;
}

WanderState::~WanderState()
{
	SAFE_DELETE( m_pSearchTimer );
}

VOID WanderState::Init()
{	
}

VOID WanderState::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
	State::OnEnter( param1, param2, param3 );

	m_bDestSelected		= FALSE;
	m_bTouchedSomething	= FALSE;
	m_pSearchTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wSEARCH_PERIOD );
}

VOID WanderState::OnExit()
{
	State::OnExit();
}

VOID WanderState::OnUpdate( DWORD dwDeltaTick )
{
	__UNUSED(dwDeltaTick);

	if( m_pSearchTimer->IsExpired() )
	{
		// 林函俊 利捞 乐绰瘤 沤祸
		Character* pTargetChar = m_pMonster->SearchTarget();
		if( pTargetChar )
		{
			// 弊缝狼 老盔捞搁 糕滚甸俊霸 利 惯斑 皋技瘤甫 焊辰促.
			if( m_pMonster->IsMemberOfGroup() )
			{
				AI_MSG_ENEMY_FOUND aiMsg;
				aiMsg.dwTargetObjectKey = pTargetChar->GetObjectKey();
				m_pMonster->SendAIMessageToGroupExceptMe( &aiMsg, sizeof(aiMsg) );
			}

			m_pMonster->SetTargetChar( pTargetChar );
			m_pMonster->ChangeState( STATE_ID_TRACK );
			return;
		}

		// 格利瘤啊 绝绰 惑怕捞搁 格利瘤 急琶
		if( !m_bDestSelected )
		{
			m_bDestSelected = m_pMonster->IsFollowerOfGroup() && m_pMonster->IsLeaderAlive() ? DoWanderAsFollower() : DoWander();
		}
	}

	// 格利瘤俊 档崔茄 惑怕牢啊
	if( m_bDestSelected && m_pMonster->IsMoving() == FALSE )
	{
		m_bDestSelected	= FALSE;

		// 厘局拱俊 吧妨辑 炼陛观俊 捞悼阑 给茄 惑怕啊 酒聪扼搁 IDLE肺 傈券茄促.
		if( !m_bTouchedSomething )
		{
			m_pMonster->ChangeState( STATE_ID_IDLE );
		}
	}
}

// 格利瘤 急琶俊 己傍窍搁 TRUE甫 府畔
BOOL WanderState::DoWander()
{
	// 捞悼且 芭府甫 备茄促.
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	float MOVE_DISTANCE = random( stAIParamInfo.m_fMIN_MOVE_DISTANCE*10, stAIParamInfo.m_fMAX_MOVE_DISTANCE*10 ) / 10.f;


	WzVector wvCurPos, wvDestPos, wvMovement;
	
	m_pMonster->GetPos( &wvCurPos );

	Field *pField = m_pMonster->GetField();
	if( !pField ) return FALSE;

	// 格利瘤 谅钎甫 茫绰促.
	if( m_bTouchedSomething )
	{
		// 捞傈 辨茫扁俊辑 公攫啊俊 搓篮 版快 49档 雀傈矫虐绊
		m_bTouchedSomething = FALSE;
		wvMovement = m_wvRotatedVector;		
	}
	else if( m_pMonster->IsOutOfWanderRadius() )
	{
		// 规炔 裹困甫 哈绢车栏搁 救率栏肺 捞悼
		WzVector wvNormal;
		VectorNormalize( &wvNormal, &( m_pMonster->GetRegenPos() - wvCurPos ) );
		wvMovement = wvNormal * MOVE_DISTANCE;
	}
	else
	{
		// 罚待茄 规氢栏肺 器牢泼
		int iAngle = rand() % 360;
		wvMovement.x = (float)( MOVE_DISTANCE * FCOS(iAngle) );
		wvMovement.y = (float)( MOVE_DISTANCE * FSIN(iAngle) );
		wvMovement.z = 0.0f;
	}
	wvDestPos = wvCurPos + wvMovement;

	// 捞悼啊瓷 咯何甫 眉农饶 菩哦阑 朝赴促.
	if( !m_pMonster->ThrustMoveAndBroadcast( &wvDestPos, CMS_WALK, m_bTouchedSomething, m_wvRotatedVector ) )
	{
		return FALSE;
	}

	// 弊缝狼 府歹捞搁 弊缝 绿蝶备甸茄抛 AI 皋技瘤甫 焊辰促.
	if( m_pMonster->IsLeaderOfGroup() )
	{
		AI_MSG_LETSGO letsgoMsg;
		letsgoMsg.wvDestPos = wvDestPos;
		letsgoMsg.byMoveState = CMS_WALK;

		m_pMonster->SendAIMessageToGroupExceptMe( &letsgoMsg, sizeof(letsgoMsg), random(stAIParamInfo.m_wGROUP_AIMESSAGE_MIN_DELAY, stAIParamInfo.m_wGROUP_AIMESSAGE_MAX_DELAY) );
	}

	return TRUE;
}

BOOL WanderState::DoWanderAsFollower()
{
	Field *pField = m_pMonster->GetField();
	if( !pField )	return FALSE;

	Character *pLeader = pField->FindCharacter( m_pMonster->GetGroup()->GetLeaderObjKey() );
	if( !pLeader )	return FALSE;

	// 府歹啊 捞悼屈 各捞搁 规炔窍瘤 富绊 府歹啊 矫虐绰措肺父 框流咯具 窍骨肺 府畔
	if( static_cast<NPC*>(pLeader)->GetBaseInfo()->m_wMoveAttitude ) return FALSE;

	WzVector wvCurPos, wvDestPos, wvLeaderPos;
	m_pMonster->GetPos( &wvCurPos );
	pLeader->GetPos( &wvLeaderPos );

	WzVector wvMovement;
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	float fDistance = random( stAIParamInfo.m_fGROUP_FOLLOWER_MIN_RADIUS*100, stAIParamInfo.m_fGROUP_FOLLOWER_MAX_RADIUS*100 ) / 100.f;

	if( pLeader->IsMoving() )
	{
		// 府歹狼 格利瘤 林函 利寸茄 镑阑 嘛绰促.
		int iAngle = rand() % 360;
		wvMovement.x = (float)( fDistance * FCOS(iAngle) );
		wvMovement.y = (float)( fDistance * FSIN(iAngle) );
		wvMovement.z = 0.0f;
		wvDestPos = pLeader->GetPathExplorer()->GetTargetPos() + wvMovement;
	}
	else
	{
		// 府歹啊 肛苗乐阑 锭 面盒洒 啊鳖捞 乐栏搁 捞悼窍瘤 臼绰促.
		if( m_pMonster->GetDist( pLeader ) < 2.0f ) return FALSE;

		// 府歹 林函 利寸茄 镑阑 嘛绰促.
		int iAngle = rand() % 360;
		wvMovement.x = (float)( fDistance * FCOS(iAngle) );
		wvMovement.y = (float)( fDistance * FSIN(iAngle) );
		wvMovement.z = 0.0f;
		wvDestPos = wvLeaderPos + wvMovement;
	}

	// 捞悼 芭府啊 呈公 陋栏搁 捞悼窍瘤 臼绰促.
	if( VectorLength2( &(wvDestPos - wvCurPos) ) < stAIParamInfo.m_fMIN_MOVABLE_DISTANCE ) return FALSE;

	return m_pMonster->ThrustMoveAndBroadcast( &wvDestPos, CMS_WALK, m_bTouchedSomething, m_wvRotatedVector );
}

VOID WanderState::OnMsgAttacked( AI_MSG *pMsg )
{
	State::OnMsgAttacked( pMsg );

	AI_MSG_ATTACKED *pAttackMsg = (AI_MSG_ATTACKED*)pMsg;

	Field* pField = m_pMonster->GetField();
	if( !pField )		return;

	Character* pAttacker = pField->FindCharacter( pAttackMsg->dwAttackerKey );
	if( !pAttacker )	return;

	// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
	if( !m_pMonster->IsFriend( pAttacker ) )
	{
		m_pMonster->SetTargetChar( pAttacker );
		m_pMonster->ChangeState( STATE_ID_TRACK );
	}
}

VOID WanderState::OnMsgLetsGo( AI_MSG *pMsg )
{
	State::OnMsgLetsGo( pMsg );
	m_bDestSelected = TRUE;
}

VOID WanderState::OnMsgEnemyFound( AI_MSG *pMsg )
{
	State::OnMsgEnemyFound( pMsg );
}

⌨️ 快捷键说明

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