📄 roleaction.cpp
字号:
#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 + -