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