📄 patrolstate.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 + -