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

📄 roleaction.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	double dMinDistance		=65535;
	int	iStepDir	=-1;
	for(int i=0;i<_MAX_DIRECTION;i++)
	{
		int iStepX	=m_Info.posMap.x+_DELTA_X[i];
		int iStepY	=m_Info.posMap.y+_DELTA_Y[i];

		if (IsMapAttainable(iStepX,iStepY))
		{
			int iTargetX	=m_Info.cmdProc.posTarget.x;
			int iTargetY	=m_Info.cmdProc.posTarget.y;
			double  dDistance	=CGameMap::GetPreciseDistance(iStepX,iStepY,iTargetX,iTargetY);
			if (dDistance<dMinDistance)
			{
				dMinDistance	=dDistance;
				iStepDir		=i;
			}
		}
	}

	return iStepDir;
}

//--------------------------------------------------------------
BOOL CRole::Jump(void)
{
	// clear a* path
	m_Info.objPath.ClearStep();

	// clear lstdir
	m_lstStepDir.clear();
	
	// set action type
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
	m_Info.iActType			=_ACTION_JUMP;
/*
	if(this->TestStatus(USERSTATUS_FLY))
		m_Info.iActType			=_ACTION_FLY_MOVE;
*/
	m_Info.iDirection		=this->GetDir(m_Info.cmdProc.posTarget);

	// set pos
	//m_Info.posMap.x	=m_Info.cmdProc.posTarget.x;
	//m_Info.posMap.y	=m_Info.cmdProc.posTarget.y;

	// g_objGameMap.SetObj(m_Info.posMap.x,m_Info.posMap.y,_OBJ_NULL);

	// set action pos
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;

	g_objGameMap.Cell2World(m_Info.cmdProc.posTarget.x, m_Info.cmdProc.posTarget.y, m_Info.posActionEnd.x, m_Info.posActionEnd.y);

	return true;
}
//--------------------------------------------------------------
BOOL	CRole::Float(void)
{
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;

//	if (_COMMAND_FLOAT == this->GetCommandType())
//		m_Info.iActType	=_ACTION_FLY_STANDBY;

	// in battle?
/*	if (::TimeGet()-m_tmLastAtk < TIME_INBATTLE)
		m_Info.iActType = _ACTION_FLY_ALERT;
*/
	// set action pos
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;
	m_Info.posActionEnd.x	=m_Info.posWorld.x;
	m_Info.posActionEnd.y	=m_Info.posWorld.y;

	return true;
}
//--------------------------------------------------------------
BOOL	CRole::TakeOff(void)
{
	// clear a* path
	m_Info.objPath.ClearStep();

	// clear lstdir
	m_lstStepDir.clear();
	
	// set action type
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
	m_Info.iActType			=_ACTION_FLY_UP;
	m_Info.iDirection		=this->GetDir(m_Info.cmdProc.posTarget);
	this->SetFlyOffsetGoal(100);
	return true;
}
//--------------------------------------------------------------
BOOL	CRole::Landing(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// clear a* path
		m_Info.objPath.ClearStep();

		// clear lstdir
		m_lstStepDir.clear();
	
		// set action type
		m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
		m_Info.iActType			=_ACTION_FLY_DOWN;
		m_Info.iDirection		=this->GetDir(m_Info.cmdProc.posTarget);
		this->SetFlyOffsetGoal(0);
	}
	return true;
}
//--------------------------------------------------------------
BOOL CRole::Die(void)
{
	enum 
	{
			DIE_NORMAL			= 1,
			DIE_CRITICALHIT		= 2,
			DIE_MAGIC			= 3,
			DIE_FLOAT			= 4,
			DIE_ARROWSHOOT		= 5,
	};

	BOOL bReturn = false;
//	if(m_Info.nFlyOffset != 0)
//		m_Info.cmdProc.dwData = DIE_FLOAT;
	switch(m_Info.cmdProc.dwData)
	{
//	case DIE_CRITICALHIT:
//		bReturn = this->DieFlying();
//		break;

	case DIE_MAGIC:
		bReturn = this->DieDelay();
		break;
	case DIE_FLOAT:
		bReturn = this->DieFloat();
		break;
	case DIE_ARROWSHOOT:
		bReturn = this->DieDelay();
		break;
	default:		
		bReturn = this->DieNormal();
		break;
	}

	return bReturn;
}

//--------------------------------------------------------------
BOOL CRole::DieNormal(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// set action
		m_Info.iActType		=_ACTION_DIE0;
/*		if (::RandGet(2) == 1)
			m_Info.iActType		=_ACTION_DIE0;
		else
			m_Info.iActType		=_ACTION_DIE1;
*/
		m_Info.iDirection	=m_Info.cmdProc.nDir;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
	}
	else if (m_Info.cmdProc.iStatus	== _CMDSTATUS_CONTINUE)
	{
		if (m_Info.iActType == _ACTION_DIE0)
			m_Info.iActType = _ACTION_BODY0;
		else
			m_Info.iActType = _ACTION_BODY1;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	}

	// set action pos
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;
	m_Info.posActionEnd.x	=m_Info.posWorld.x;
	m_Info.posActionEnd.y	=m_Info.posWorld.y;

	// never end
	return false;
}

//--------------------------------------------------------------
BOOL CRole::DieFloat(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// set action
		m_Info.iActType		=_ACTION_FLY_DIE;

		m_Info.iDirection	=m_Info.cmdProc.nDir;
		m_Info.nFlyOffsetGoal = 0;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
	}
	else if (m_Info.cmdProc.iStatus	== _CMDSTATUS_CONTINUE)
	{
		m_Info.iActType = _ACTION_BODY0;
		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	}

	// set action pos
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;
	m_Info.posActionEnd.x	=m_Info.posWorld.x;
	m_Info.posActionEnd.y	=m_Info.posWorld.y;

	// never end
	return false;
}

//--------------------------------------------------------------
BOOL CRole::DieDelay(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// set action
		m_Info.iActType		=_ACTION_BRUISE0;
		m_Info.iDirection	=m_Info.cmdProc.nDir;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_DEPART;
	}
	else if (m_Info.cmdProc.iStatus	== _CMDSTATUS_DEPART)
	{
		// set action
		m_Info.iActType		=_ACTION_DIE0;
/*		if (::RandGet(2) == 1)
			m_Info.iActType		=_ACTION_DIE0;
		else
			m_Info.iActType		=_ACTION_DIE1;
*/
		m_Info.iDirection	=m_Info.cmdProc.nDir;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
	}
	else if (m_Info.cmdProc.iStatus	== _CMDSTATUS_CONTINUE)
	{
		m_Info.iActType = _ACTION_BODY0;
/*		if (m_Info.iActType == _ACTION_DIE0)
			m_Info.iActType = _ACTION_BODY0;
		else
			m_Info.iActType = _ACTION_BODY1;
*/
		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	}

	// set action pos
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;
	m_Info.posActionEnd.x	=m_Info.posWorld.x;
	m_Info.posActionEnd.y	=m_Info.posWorld.y;

	// never end
	return false;
}

//--------------------------------------------------------------
BOOL CRole::DieFlying(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// set action pos
		m_Info.posActionBegin.x	=m_Info.posWorld.x;
		m_Info.posActionBegin.y	=m_Info.posWorld.y;

		CMyPos posTarget;
		this->GetPos(posTarget);
		posTarget.x	-=2*_DELTA_X[m_Info.cmdProc.nDir];
		posTarget.y	-=2*_DELTA_Y[m_Info.cmdProc.nDir];
		posTarget.x	-=2*_DELTA_X[m_Info.cmdProc.nDir];
		posTarget.y	-=2*_DELTA_Y[m_Info.cmdProc.nDir];

		g_objGameMap.Cell2World(posTarget.x, posTarget.y, m_Info.posActionEnd.x, m_Info.posActionEnd.y);

		// set action
		if(this->IsPlayer())
			m_Info.iActType		=_ACTION_DIEFLY;
		else
			m_Info.iActType		=_ACTION_DIE0;

		m_Info.iDirection	=m_Info.cmdProc.nDir;
		m_Info.cmdProc.iStatus	= _CMDSTATUS_DEPART;
	}
	else if (m_Info.cmdProc.iStatus	== _CMDSTATUS_DEPART)
	{
		if(this->IsPlayer())
			m_Info.iActType	= _ACTION_DIEFLYEND;
		else
			m_Info.iActType = _ACTION_BODY0;

		// set action pos
		m_Info.posActionBegin.x	=m_Info.posWorld.x;
		m_Info.posActionBegin.y	=m_Info.posWorld.y;
		m_Info.posActionEnd.x	=m_Info.posWorld.x;
		m_Info.posActionEnd.y	=m_Info.posWorld.y;

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	}

	// never end
	return false;
}

//--------------------------------------------------------------
void CRole::ResetStepDir()
{
	if (true)
		return;
	/*
	if (this->GetID() == g_objHero.GetID())
		return;
	*/

	this->ResetActionData();

	int nSteps	=m_lstStepDir.size();
	if (nSteps <= 0)
		return;

	CMyPos posRole;
	this->GetPos(posRole);

	for (int i=0; i<nSteps; i++)
	{
		int nDirection	=m_lstStepDir.front();
		posRole.x	+=_DELTA_X[nDirection];
		posRole.y	+=_DELTA_Y[nDirection];
		
		m_lstStepDir.pop_front();
	}

	this->SetPos(posRole.x, posRole.y);
}

//--------------------------------------------------------------
// implement role step in map, set objid at new pos and del clr objid at old place
// must set m_Info.iDirection before call this function
BOOL CRole::Step(void)
{
	// set action type
	if(m_Info.id == g_objHero.GetID())
	{
		CMyPos posHero, posAligne;
		g_objHero.GetPos(posHero);
		g_objHero.GetPos(posAligne);
		if(abs(posAligne.x - posHero.x) >= 2 || abs(posAligne.x - posHero.x) >= 2)
		{
			if(m_nWhichLeg == 1)
			{
				m_Info.iActType	=_ACTION_WALKL;
				m_nWhichLeg = 0;
			}
			else
			{
				m_Info.iActType	=_ACTION_WALKR;
				m_nWhichLeg = 1;
			}
			m_Info.posActionBegin.x	=m_Info.posWorld.x;
			m_Info.posActionBegin.y	=m_Info.posWorld.y;
			m_Info.posActionEnd.x =m_Info.posWorld.x;
			m_Info.posActionEnd.y =m_Info.posWorld.y;
			return true;
		}
	}
	BOOL bDoubleStep = false;
	if(m_Info.objPath.TestNextStep() != -1)
		bDoubleStep = true;
	int nStepAmount = 1;
	if(m_Info.bAdjustRun)
		bDoubleStep = false;
	BOOL bFollowRun = false;
	{
		CMyPos posHero, posAligne;
		g_objHero.GetPos(posHero);
		g_objHero.GetPos(posAligne);
		
		if(_COMMAND_TEAMFOLLOW == m_Info.cmdProc.iType && m_Info.objPath.GetStepAmount() >= 4)
			bFollowRun = true;
	}
	if(this->GetID() == g_objHero.GetID() && g_objHero.m_nFastRunSetp < 2
		&& this->TestStatus(USERSTATUS_PELT))
	{
		bDoubleStep = false;
		g_objHero.m_nFastRunSetp ++;
	}
	if(bDoubleStep && (m_Info.cmdProc.iType == _COMMAND_RUNFORWARD || _COMMAND_RUN == m_Info.cmdProc.iType
		|| _COMMAND_PICKUP == m_Info.cmdProc.iType || _COMMAND_LOCKATK ==  m_Info.cmdProc.iType || bFollowRun))
	{
		if(m_nWhichLeg == 1)
		{
			m_Info.iActType	=_ACTION_RUNL;
			m_nWhichLeg = 0;
		}
		else
		{
			m_Info.iActType	=_ACTION_RUNR;
			m_nWhichLeg = 1;
		}
		nStepAmount = 2;
	}
	else
	{
		if(m_nWhichLeg == 1)
		{
			m_Info.iActType	=_ACTION_WALKL;
			m_nWhichLeg = 0;
		}
		else
		{
			m_Info.iActType	=_ACTION_WALKR;
			m_nWhichLeg = 1;
		}
	}
	m_Info.posActionBegin.x	=m_Info.posWorld.x;
	m_Info.posActionBegin.y	=m_Info.posWorld.y;
	
	if(nStepAmount == 2)
	{
		StepInfo info;
		m_Info.objPath.GetNextStep(info);
		m_Info.nNextStep = info.cStepDir%8;
		g_objGameMap.Cell2World(m_Info.posMap.x+_DELTA_X[m_Info.iDirection]+_DELTA_X[m_Info.nNextStep], 
			m_Info.posMap.y+_DELTA_Y[m_Info.iDirection]+_DELTA_Y[m_Info.nNextStep], 
			m_Info.posActionEnd.x, 
			m_Info.posActionEnd.y);
		const int RUNDIRIDADDITION = 20;
		m_Info.nNextStep += RUNDIRIDADDITION;
		
		m_Info.bAdjustDir = true;
		m_Info.posDir.x = m_Info.posActionEnd.x;
		m_Info.posDir.y = m_Info.posActionEnd.y;
	}
	else
	{
		
		g_objGameMap.Cell2World(m_Info.posMap.x+_DELTA_X[m_Info.iDirection], 
			m_Info.posMap.y+_DELTA_Y[m_Info.iDirection], 
			m_Info.posActionEnd.x, 
			m_Info.posActionEnd.y);
	}

	
	return true;
}

//--------------------------------------------------------------
// return true if reached target place
BOOL CRole::Walk(void)
{
	assert(m_Info.cmdProc.iType==_COMMAND_WALK);
	
#ifdef	_USE_ASTAR
	if (m_Info.cmdProc.iStatus==_CMDSTATUS_BEGIN)
	{
		m_Info.objPath.ClearStep();
		
		g_objGameMap.FindPath(m_Info.objPath, m_Info.posMap, m_Info.cmdProc.posTarget);
		
		if(m_Info.objPath.GetStepAmount() > 0)
		{
			m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
		}
		else
		{
			m_Info.objPath.ClearStep();
			m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
			
			StandBy();

⌨️ 快捷键说明

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