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

📄 roleaction.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#pragma warning(disable:4786)
#include "basefunc.H"
#include "3dgamemap.H"
#include "role.H"
#include "gameplayerset.H"
#include "hero.H"
#include "GameMsg.h"
#include "../NdSound/NDSound.h"

#define _USE_ASTAR

// const...
const DWORD _TIME_FAINT	=150;

//--------------------------------------------------------------
void CRole::StaticAction(int nAction, int nDir /*= -1*/)
{
	// 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;

	if (nDir != -1)
		m_Info.iDirection = nDir;

	m_Info.iActType = nAction;

	// attack?
	if (m_Info.iActType >= _ACTION_ATTACK0 && m_Info.iActType <= _ACTION_ATTACK2)
		m_tmLastAtk = ::TimeGet();
}

//--------------------------------------------------------------
BOOL CRole::StandBy(void)
{
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;

//	if (_COMMAND_STANDBY == this->GetCommandType() &&
//			::RandGet(10) == 1)
//	{
//		m_Info.iActType	= _ACTION_REST1;
///*		switch(::RandGet(3))
//		{
//			m_Info.iActType	= _ACTION_REST1;
//		case 0:
//			m_Info.iActType	= _ACTION_REST1;
//			break;
//		case 1:
//			m_Info.iActType	= _ACTION_REST2;
//			break;
//		default:
//			m_Info.iActType	= _ACTION_REST3;
//			break;
//		}*/
//	}
//	else

	m_Info.iActType	=_ACTION_STANDBY;
	// in battle?
	if (::TimeGet()-m_tmLastAtk < TIME_INBATTLE && this->IsPlayer())
		m_Info.iActType = _ACTION_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::Mine(void)
{
	MYASSERT (_COMMAND_MINE == m_Info.cmdProc.iType);

	m_Info.cmdProc.iStatus	= _CMDSTATUS_ACCOMPLISH;
	m_Info.iActType			= _ACTION_MINE;

	// 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::Bump(void)
{
	MYASSERT (m_Info.cmdProc.iType == _COMMAND_BUMP);

	if (m_Info.cmdProc.iStatus == _CMDSTATUS_BEGIN)
		m_Info.cmdProc.iStatus = _CMDSTATUS_PROGRESS;

	if (m_Info.cmdProc.iStatus == _CMDSTATUS_PROGRESS || 
			m_Info.cmdProc.iStatus == _CMDSTATUS_CONTINUE)
	{	
		m_Info.objPath.ClearStep();

		CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_Info.cmdProc.idTarget);
		if (pTarget)
		{
			CMyPos posTarget;
			pTarget->GetPos(posTarget);
			
			CMyPos posMyself;
			this->GetPos(posMyself);

			int nAtkRange = 1;//this->GetAddSize()+pTarget->GetAddSize()+1; //this->GetAtkRange();
			if (abs(posMyself.x-posTarget.x) <= nAtkRange
					&& abs(posMyself.y-posTarget.y) <= nAtkRange)
			{
				if (!(posMyself.x == posTarget.x && posMyself.y == posTarget.y))
				{
					// set dir
					this->SetDir(this->GetDir(posTarget));
					
					// set act data
					m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
					m_Info.iActType	        =_ACTION_BUMP;
					
					// set action pos
					m_Info.posActionBegin.x	=m_Info.posWorld.x;
					m_Info.posActionBegin.y	=m_Info.posWorld.y;

					// target pos
					CMyPos posDes = { posTarget.x+_DELTA_X[m_Info.iDirection], 
						posTarget.y+_DELTA_Y[m_Info.iDirection] };

					if (g_objGameMap.TestPath(pTarget, posDes) && pTarget->IsBumpBackEnable())
					{									
						g_objGameMap.Cell2World(posTarget.x,
							posTarget.y,
							m_Info.posActionEnd.x,
							m_Info.posActionEnd.y);
					}
					else
						m_Info.posActionEnd = m_Info.posActionBegin;
					
					// attack time
					m_tmLastAtk = ::TimeGet();
					return true;
				}
			}
		}
		else
		{
			m_Info.objPath.ClearStep();

			StandBy();
			m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
			return false;
		}

		CMyPos posTarget;
		pTarget->GetPos(posTarget);

		g_objGameMap.FindPath(m_Info.objPath, m_Info.posMap, posTarget);
		if (m_Info.objPath.GetStepAmount() > 0)
		{
			StepInfo infoStep;
			m_Info.iDirection = m_Info.objPath.GetNextStep(infoStep);
			this->Step();

			// reset action to running
			if (m_Info.cmdProc.iStatus == _CMDSTATUS_PROGRESS)
			{
				m_Info.iActType	=_ACTION_RUNL;
				m_Info.cmdProc.iStatus =_CMDSTATUS_CONTINUE;
			}
			else if (m_Info.cmdProc.iStatus == _CMDSTATUS_CONTINUE)
			{
				m_Info.iActType	=_ACTION_RUNR;
				m_Info.cmdProc.iStatus =_CMDSTATUS_PROGRESS;
			}		
		}
		else
		{
			m_Info.objPath.ClearStep();

			this->StandBy();

			m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
			return false;
		}
	}

	return true;
}

//--------------------------------------------------------------
BOOL CRole::Action(void)
{
	// set act data
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
	m_Info.iActType	        =m_Info.cmdProc.nData;
	// set dir
	if (_ACTION_POPOFF != m_Info.iActType)
		this->SetDir(m_Info.cmdProc.nDir);
	else
		this->SetDir((m_Info.cmdProc.nDir));//+4)%8);

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

	m_Info.nPosActionBeginZ = m_Info.nZ;
	m_Info.nPosActionEndZ = m_Info.cmdProc.nTargetZ;
	if (m_Info.cmdProc.dwData == 0)
	{
		m_Info.posActionEnd.x	=m_Info.posWorld.x;
		m_Info.posActionEnd.y	=m_Info.posWorld.y;
	}
	else if (m_Info.cmdProc.dwData == 1)
	{
		g_objGameMap.Cell2World(m_Info.posMap.x+_DELTA_X[m_Info.cmdProc.nDir],
								m_Info.posMap.y+_DELTA_Y[m_Info.cmdProc.nDir],
								m_Info.posActionEnd.x,
								m_Info.posActionEnd.y);
	}
	else if (m_Info.cmdProc.dwData == 2)
	{
		g_objGameMap.Cell2World(m_Info.cmdProc.posTarget.x,
								m_Info.cmdProc.posTarget.y,
								m_Info.posActionEnd.x,
								m_Info.posActionEnd.y);
	}
	
	// attack?
	if (m_Info.iActType == _ACTION_ATTACK0 
			|| m_Info.iActType == _ACTION_ATTACK1
			|| m_Info.iActType == _ACTION_ATTACK2
			|| m_Info.iActType == _ACTION_BUMP
			|| m_Info.iActType == _ACTION_JUMP_ATK)
		m_tmLastAtk = ::TimeGet();
	if(this->GetID() == g_objHero.GetID())
	{
		CMyPos posCell;
		g_objGameMap.World2Cell(m_Info.posActionBegin.x, m_Info.posActionBegin.y, posCell.x, posCell.y);
		::DebugMsg("BeginPos(%d, %d)\n", posCell.x, posCell.y);
		g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y, posCell.x, posCell.y);
		::DebugMsg("EndPos(%d, %d)\n", posCell.x, posCell.y);
	}

	return true;
}

//--------------------------------------------------------------
BOOL CRole::Pose(void)
{
	// set dir
	this->SetDir(m_Info.cmdProc.nDir);
	
	// set act data
	m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	m_Info.iActType	        =m_Info.cmdProc.nData;

	// 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 false;
}

//--------------------------------------------------------------
BOOL CRole::Kongfu(void)
{
	if(_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		// 重置为第0个动作
		m_Info.cmdProc.dwData = 0;
		m_Info.cmdProc.iStatus = _CMDSTATUS_CONTINUE;
	}
	if(m_Info.cmdProc.iStatus == _CMDSTATUS_CONTINUE)
	{
		KongfuAction actionKongfu = m_setKongfu[m_Info.cmdProc.dwData];
		m_Info.iActType = actionKongfu.nAction;
		m_Info.cmdProc.nDir = (actionKongfu.cDir + this->GetDir())%8;
		m_Info.iDirection = (actionKongfu.cDir + this->GetDir())%8;
		m_Info.cmdProc.dwData ++;

		m_Info.posActionBegin.x	=m_Info.posWorld.x;
		m_Info.posActionBegin.y	=m_Info.posWorld.y;

		CMyPos posEnd = m_Info.posMap;
		for(int i = 0; i < actionKongfu.setStep.size(); i ++)
		{
			posEnd.x += _DELTA_X[(actionKongfu.setStep[i] + this->GetDir())%8];
			posEnd.y += _DELTA_Y[(actionKongfu.setStep[i] + this->GetDir())%8];
		}
		g_objGameMap.Cell2World(posEnd.x, posEnd.y, m_Info.posActionEnd.x, m_Info.posActionEnd.y);
		this->m_objEffect.Add(actionKongfu.szEffect,false,0,this->GetLook());
		if(m_Info.cmdProc.dwData >= m_setKongfu.size())
		{
			m_Info.cmdProc.iStatus = _CMDSTATUS_ACCOMPLISH;
			return true;
		}
		this->SetDir(m_Info.cmdProc.nDir);
	}
	return false;
}
//--------------------------------------------------------------
BOOL CRole::Emotion(void)
{		
	// set dir
	this->SetDir(m_Info.cmdProc.nDir);

	// set action type
	BOOL bAccomplished	=false;
    switch(m_Info.cmdProc.nData)
    {
    case _ACTION_SALUTE:
	case _ACTION_BRUISE0:
	case _ACTION_DODGE0:
        m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;
	    m_Info.iActType	        =m_Info.cmdProc.nData;
        bAccomplished           =true;
        break;

	case _ACTION_DANCE1:
	case _ACTION_DANCE2:
	case _ACTION_DANCE3:
	case _ACTION_DANCE4:
	case _ACTION_DANCE5:
	case _ACTION_DANCE6:
	case _ACTION_DANCE7:
	case _ACTION_DANCE8:
    case _ACTION_SAD:
    case _ACTION_LAUGH:
    case _ACTION_GENUFLECT:
	case _ACTION_ATTACK0:
	case _ACTION_ATTACK1:
	case _ACTION_ATTACK2:
	case _ACTION_REST1:
	case _ACTION_SITDOWN_STATIC:
        m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	    m_Info.iActType	        =m_Info.cmdProc.nData;
        break;
	case _ACTION_SITDOWN:
		{
            if(_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
            {
                m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
                m_Info.iActType	        =_ACTION_SITDOWN;
            }
            else if(_CMDSTATUS_PROGRESS == m_Info.cmdProc.iStatus)
            {
				m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
				m_Info.iActType	        =_ACTION_SITDOWN_STATIC;
            }
		}
		break;
	case _ACTION_INTONE:
		{
            if(_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
            {
                m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
                m_Info.iActType	        =_ACTION_INTONE;
				m_Info.nFlyOffsetGoal   = 0;
            }
            else if(_CMDSTATUS_PROGRESS == m_Info.cmdProc.iStatus)
            {
				m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
				m_Info.iActType	        =_ACTION_INTONE_DURATION;
            }
		}
		break;
    case _ACTION_FAINT:
        {
            if(_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
            {
                m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
                m_Info.iActType	        =_ACTION_FAINT;
            }
            else if(_CMDSTATUS_PROGRESS == m_Info.cmdProc.iStatus)
            {
              	m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
	            m_Info.iActType	        =_ACTION_LIE;
            }
        }
        break;

/*	case _ACTION_COOL:
        {
            if(_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
            {
                m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
                m_Info.iActType	        =_ACTION_COOL;
            }
            else if(_CMDSTATUS_PROGRESS == m_Info.cmdProc.iStatus)
            {
              	m_Info.cmdProc.iStatus	=_CMDSTATUS_CONTINUE;
	            m_Info.iActType	        =_ACTION_COOLPOSE;
            }
        }
        break;*/

	default:
        m_Info.cmdProc.iStatus	=_CMDSTATUS_PROGRESS;
	    m_Info.iActType	        =_ACTION_STANDBY;
        bAccomplished           =true;
        break;
    }

	// 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 bAccomplished;
}

//--------------------------------------------------------------
BOOL CRole::Attack(void)
{
	// 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;
	if(m_Info.idRWeaponType/1000 == 470)
		m_Info.iActType = _ACTION_MINE;
	else
		m_Info.iActType	        =(_ACTION_ATTACK0+::RandGet(3));
	m_Info.iDirection		=m_Info.cmdProc.nDir;
	m_Info.cmdProc.iStatus	=_CMDSTATUS_ACCOMPLISH;

	// record time
	m_tmLastAtk = ::TimeGet();
	return true;
}

//--------------------------------------------------------------
BOOL CRole::RushAtk(void)
{
	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
	{
		CPlayer* pTarget	=g_objPlayerSet.GetPlayer(m_Info.cmdProc.idTarget);
		if (!pTarget)
		{
			if(g_objHero.GetID() == (OBJID)m_Info.cmdProc.idTarget)
				pTarget	=&g_objHero;
			else
			{
				this->StandBy();
				return true;
			}
		}

		// set dir
		m_Info.iDirection	=m_Info.cmdProc.nDir;

		// get jump target pos
		CMyPos posTarget;
		pTarget->GetPos(posTarget);
		posTarget.x	-=_DELTA_X[m_Info.cmdProc.nDir];
		posTarget.y	-=_DELTA_Y[m_Info.cmdProc.nDir];
		
		
		// set action pos
		m_Info.posActionBegin.x	=m_Info.posWorld.x;
		m_Info.posActionBegin.y	=m_Info.posWorld.y;

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

		// change step
		m_Info.cmdProc.iStatus	=_CMDSTATUS_DEPART;
		m_Info.cmdProc.posTarget=posTarget;

		m_Info.iActType			=_ACTION_JUMP;
		m_Info.iDirection		=this->GetDir(m_Info.cmdProc.posTarget);

⌨️ 快捷键说明

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