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

📄 patrolstate.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include <Timer.h>
#include "PatrolState.h"
#include "Field.h"
#include <3DEngine/3DTerrain/PathExplorer.h>
#include "AIParamParser.h"
#include "Monster.h"
#include "PublicMath.h"

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

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

VOID PatrolState::Init()
{	
}

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

	m_pSearchTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wSEARCH_PERIOD );

	// 泅犁 鸥老 困摹尔 啊厘 啊鳖款 菩飘费 谅钎甫 茫酒辑 捞悼茄促.
	m_bRandomPatrol = FALSE;
	DoPatrol( TRUE );
}

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

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

	if( m_pSearchTimer->IsExpired() )
	{
		// 林函俊 利捞 乐绰瘤 沤祸
		Character* pTargetChar = m_pMonster->SearchTarget();
		if( pTargetChar )
		{
			m_pMonster->SetTargetChar( pTargetChar );
			m_pMonster->ChangeState( STATE_ID_TRACK );
		}
	}

	// 格利瘤俊 档崔茄 惑怕牢啊
	if( !m_pMonster->IsMoving() )
	{
		DoPatrol( FALSE );
	}
}

// 格利瘤 急琶俊 己傍窍搁 TRUE甫 府畔
BOOL PatrolState::DoPatrol( BOOL bFirst )
{
	BOOL bFindPos;

	// 捞傈 辨茫扁俊辑 炼陛究 唱床辑 啊带 吝牢瘤
	if( m_bRandomPatrol )
	{
		// 泅犁 困摹俊辑 啊厘 啊鳖款 菩飘费 谅钎甫 茫绰促.
		bFindPos = FindNextPos( TRUE );
	}
	else
	{
		// 促澜 菩飘费 谅钎甫 茫绰促.
		bFindPos = FindNextPos( bFirst );
	}

	if( !bFindPos )		return FALSE;

	// 捞悼啊瓷 咯何甫 眉农饶 菩哦阑 朝赴促.
	if( m_pMonster->MoveAndBroadcast( &m_vDestPos, CMS_WALK ) )
	{
		m_bRandomPatrol = FALSE;
	}
	else
	{
		// 菩飘费 瘤痢 规氢狼 罚待 谅钎肺 捞悼阑 矫档秦 夯促.
		int i;
		for( i = 0; i < 5; ++i )
		{
			FindNextRandomPos();
			if( m_pMonster->MoveAndBroadcast( &m_vDestPos, CMS_WALK ) )
			{
				m_bRandomPatrol = TRUE;
				break;
			}
		}

		// 5锅狼 矫档肺档 辨阑 茫瘤 给且 版快俊绰 啊厘 啊鳖款 菩飘费 谅钎肺 况橇茄促.
		if( i == 5 )
		{
			Field* pField = m_pMonster->GetField();
			if( !pField )	return FALSE;

			FindNextPos( TRUE );

			// 蜡瓤茄 困摹牢啊 眉农
			if( !pField->IsMovableCoordinates( &m_vDestPos ) ) return FALSE;

			pField->TeleportObject( m_pMonster, &m_vDestPos );
		}
	}

	return TRUE;
}

VOID PatrolState::FindNextRandomPos()
{
	Field *pField = m_pMonster->GetField();

	// 泅犁困摹
	WzVector wvCurPos, wvNormal;
	m_pMonster->GetPos( &wvCurPos );

	// 捞悼秦具且 菩飘费 困摹
	WzSpecialArea *pBaseAreaInfo = pField->GetFieldInfo()->GetAreaInfo( m_pMonster->GetBaseInfo()->m_dwMoveAreaID );
	DWORD *pdwTileIndex = pBaseAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_pdwData;
	m_vDestPos = pField->GetFieldInfo()->GetWorldBase()->GetRandomPosInTile( pdwTileIndex[m_iIndexOfTileIndex] );

	// 捞悼且 芭府
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	float MOVE_DISTANCE = random( stAIParamInfo.m_fMIN_MOVE_DISTANCE*10, stAIParamInfo.m_fMAX_MOVE_DISTANCE*10 ) / 10.f;
	VectorNormalize( &wvNormal, &( m_vDestPos-wvCurPos ) );

	// 捞悼秦具且 规氢狼 90档 救婆栏肺 罚待茄 困摹甫 掘绢柯促.
	int iRotateAngle = random( 0, 180 );
	if( iRotateAngle > 90 )		iRotateAngle = 450 - iRotateAngle;
	Math_ZRotateVector( &wvNormal, m_vDestPos, iRotateAngle );

	m_vDestPos = wvCurPos + m_vDestPos * MOVE_DISTANCE;

	// 府畔惑怕甫 规瘤窍扁 困秦辑 格利瘤 谅钎甫 府哩谅钎肺 悸泼茄促.
	m_pMonster->SetRegenPos( m_vDestPos );
}

BOOL PatrolState::FindNextPos( BOOL bFirst )
{
	WzVector wvCurPos;	m_pMonster->GetPos( &wvCurPos );

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

	// 阁胶磐啊 菩飘费秦具且 康开 沥焊甫 掘绰促.
	WzSpecialArea *pBaseAreaInfo = pField->GetFieldInfo()->GetAreaInfo( m_pMonster->GetBaseInfo()->m_dwMoveAreaID );
	if( !pBaseAreaInfo )
	{
//		SUNLOG( eFULL_LOG, "[PatrolState::FindNextPos] MonsterCode[%d] MoveAreaInfo doesn't exist!", m_pMonster->GetBaseInfo()->m_MonsterCode );
		return FALSE;
	}

	//康开 沥焊
	DWORD dwAreaTileCnt = pBaseAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_nCount;
	if( !dwAreaTileCnt )
	{
//		SUNLOG( eFULL_LOG, "[PatrolState::FindNextPos] MonsterCode[%d] dwAreaTileCnt is Zero!", m_pMonster->GetBaseInfo()->m_MonsterCode );
		return FALSE;
	}

	DWORD *pdwTileIndex = pBaseAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_pdwData;

	// 贸澜栏肺 格利瘤 谅钎甫 茫绰芭扼搁
	if( bFirst )
	{
		// 泅犁 鸥老苞 啊厘 啊鳖款 鸥老牢郸胶甫 备茄促.
		int iCurTileIndex = m_pMonster->GetPathExplorer()->GetTile();
		DWORD dwMinDiff, dwCurDiff;
		for( DWORD index = 0; index < dwAreaTileCnt; ++index )
		{
			if( iCurTileIndex == index )	continue;

			dwCurDiff = abs((int)(pdwTileIndex[index] - iCurTileIndex));

			if( index == 0 || dwCurDiff < dwMinDiff )
			{
				dwMinDiff = dwCurDiff;
				m_iIndexOfTileIndex = index;
			}
		}
	}
	else
	{
		m_iIndexOfTileIndex = ++m_iIndexOfTileIndex % dwAreaTileCnt;
	}

	// 急琶等 鸥老 救俊辑 罚待 谅钎甫 掘绢柯促.
	m_vDestPos = pField->GetFieldInfo()->GetWorldBase()->GetRandomPosInTile( pdwTileIndex[m_iIndexOfTileIndex] );

	// 府畔惑怕甫 规瘤窍扁 困秦辑 格利瘤 谅钎甫 府哩谅钎肺 悸泼茄促.
	m_pMonster->SetRegenPos( m_vDestPos );

	return TRUE;
}

VOID PatrolState::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 );
	}
}

⌨️ 快捷键说明

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