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

📄 summonidle.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "SummonIdle.h"
#include "Field.h"
#include <Timer.h>
#include "AIParamParser.h"
#include "Summoned.h"
#include "PublicMath.h"
#include "MoveStateControl.h"

SummonIdle::SummonIdle()
{
	m_pTrackTimer = new util::Timer;
	m_pSpawnTimer = new util::Timer;
}

SummonIdle::~SummonIdle()
{
	SAFE_DELETE( m_pTrackTimer );
	SAFE_DELETE( m_pSpawnTimer );
}

VOID SummonIdle::Init()
{
}

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

	m_pTrackTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wTRACK_PERIOD );
	m_pSpawnTimer->SetTimer( param1 );

	m_pSummoner = m_pSummoned->GetSummoner();

	m_pSummoned->SetTargetChar( NULL );
	m_pSummoned->SetSkillUseDelegate( FALSE );

// test
//m_dwPrevTick = GetTickCount();
}

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

VOID SummonIdle::OnUpdate( DWORD dwDeltaTick )
{
	// 弥檬 胶迄矫埃阑 困秦辑 老沥矫埃 扁促妨霖促.
	if( !m_pSpawnTimer->IsExpired( FALSE ) )		return;

	m_pSummoner = m_pSummoned->GetSummoner();
	if( !m_pSummoner )	return;

	m_pSummoned->GetPos( &m_vSummonedPos );	
	m_pSummoner->GetPos( &m_vSummonerPos );

	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();

	if( m_pTrackTimer->IsExpired( FALSE ) && m_pSummoned->IsOffensive() )
	{
		// 林函俊 利捞 乐绰瘤 沤祸
		Character* pTargetChar = m_pSummoned->SearchTarget();
		if( pTargetChar )
		{
			m_pSummoned->SetTargetChar( pTargetChar );
			m_pSummoned->ChangeState( STATE_ID_TRACK );
			return;
		}
	}

	// 家券磊客狼 芭府啊 老沥裹困 郴捞搁 捞悼阑 窍瘤 臼绰促.
	float fDistance2 = Math_Vector2DLength2( &(m_vSummonedPos-m_vSummonerPos) );
	if( fDistance2 <= stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE )
	{
		return;
	}

	// 家券眉啊 酒流 格钎痢俊 档崔窍瘤 臼疽歹扼档, 沤祸林扁啊 促 登菌绊 家券磊啊 框流捞绊 乐促搁 促矫 格钎痢阑 棱绰促.
	if( m_pSummoned->IsMoving() )
	{
		if( !m_pTrackTimer->IsExpired() )	return;

		// 家券磊啊 肛苗滚府搁 格钎痢阑 促矫 茫绰促.
		if( !m_pSummoner->IsMoving() )
		{
			FollowSummoner( m_pSummoner );
		}
		else
		{
			m_vSummonerDestPos = m_pSummoned->GetPathExplorer()->GetTargetPos();

			// 家券磊啊 家券眉啊 顿妨绰 规氢狼 何盲裁阑 哈绢抄 阿俊 困摹窍绰啊?
			BOOL bOutOfAngle = !Math_IsPositionInFanshapedArea( &m_vSummonerPos, &m_vSummonedPos, &(m_vSummonerDestPos - m_vSummonedPos), stAIParamInfo.m_wTRACK_INNER_ANGLE );

			// 家券磊啊 家券眉啊 顿妨绰 格利瘤俊辑 钢府乐绰啊?
			BOOL bOutOfRange = Math_VectorLength2( m_vSummonerDestPos, m_vSummonerPos ) > stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE;

			if( bOutOfAngle && bOutOfRange )
			{
				FollowSummoner( m_pSummoner );

				// printf( "Moving Track!! DiffTick[%d]\n", GetTickCount()-m_dwPrevTick );
				// m_dwPrevTick = GetTickCount();
			}
		}
	}
	else
	{
		FollowSummoner( m_pSummoner );
//		printf( "Stop Track!! DiffTick[%d]\n", GetTickCount()-m_dwPrevTick );
//		m_dwPrevTick = GetTickCount();
	}
}

VOID SummonIdle::DecideMovement()
{
	// 家券磊啊 捞悼窍绊 乐绰 版快俊父 捞悼抗惑 格钎痢(TargetPos)阑 捞侩茄促.
	if( m_pSummoner->IsMoving() )
	{
		m_vSummonerDestPos = m_pSummoner->GetPathExplorer()->GetTargetPos();
	}
	else
	{
		m_vSummonerDestPos = m_vSummonerPos;
	}

	// 格利瘤 谅钎啊 蜡瓤茄 谅钎牢瘤 眉农
	Field* pField = m_pSummoned->GetField();
	if( pField )
	{
		if( !pField->IsMovableCoordinates( &m_vSummonerDestPos ) ) 
		{
			SUNLOG( eMIDDLE_LOG, "[DecideMovement] Is Not MovableCoordinates!" );
			m_vSummonerDestPos = m_vSummonerPos;
		}
	}

	// 规氢阿 搬沥(家券眉客 家券磊狼 弥窜芭府 规氢栏肺 搬沥)
	WzVector wvNormal;
	VectorNormalize( &wvNormal, &( m_vSummonedPos - m_vSummonerDestPos ) );

	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	float fDistance = random( stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE*50, stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE*100 ) / 100.f;
	m_vMovement = wvNormal * fDistance;
}

VOID SummonIdle::FollowSummoner( Character *m_pSummoner )
{
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();

	// 家券磊俊措茄 惑措 谅钎甫 备茄促.
	DecideMovement();

	WzVector vDestPos = m_vSummonerDestPos + m_vMovement;

	eCHAR_MOVE_STATE eMoveState = m_pSummoner->GetMoveStateControl()->GetMoveState();
	if( eMoveState != CMS_WALK )
	{
		eMoveState = CMS_RUN;
	}

	// 老沥芭府甫 哈绢唱搁 炮饭器飘茄促.
    if( m_pSummoner->GetDist2( m_pSummoned ) > stAIParamInfo.m_fSUMMON_MAX_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_MAX_FOLLOW_DISTANCE )
	{
		Teleport( vDestPos );
	}

	// 捞悼 芭府啊 呈公 陋栏搁 捞悼窍瘤 富绊(菩哦 价脚 绝捞) 弊成 府畔
	float fMoveLength = VectorLength2( &(vDestPos - m_vSummonedPos) );
	if( fMoveLength < stAIParamInfo.m_fMIN_MOVABLE_DISTANCE*stAIParamInfo.m_fMIN_MOVABLE_DISTANCE )
	{
		m_pSummoned->StopMoving();
		return;
	}

	// 辨茫扁
	if( !m_pSummoned->MoveAndBroadcast( &vDestPos, eMoveState ) )
	{
		// 角菩矫 格钎痢阑 促矫 沥茄促.
		DecideMovement();
		return;

		// 弊贰档 角菩矫俊绰 弊 困摹肺 况橇茄促.
//		Teleport( vDestPos );
	}

	m_pTrackTimer->SetTimer( stAIParamInfo.m_wTRACK_PERIOD );
}

VOID SummonIdle::Teleport( WzVector &vDestPos )
{
	Field* pField = m_pSummoned->GetField();
	if( !pField )	return;

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

	pField->TeleportObject( m_pSummoned, &vDestPos );
}


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

	// 第蝶抚 惑怕捞搁 馆览窍瘤 臼绰促.
	if( m_pSummoned->IsFollowing() )
	{
		return;
	}

	AI_MSG_ATTACKED *pAttackMsg = (AI_MSG_ATTACKED*)pMsg;

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

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

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

VOID SummonIdle::OnMsgLeaveField( AI_MSG *pMsg )
{
	AI_MSG_LEAVE_FIELD *pLeaveMsg = (AI_MSG_LEAVE_FIELD*)pMsg;

	m_pSummoned->RemoveEnemy( pLeaveMsg->dwObjectKey );
}




⌨️ 快捷键说明

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