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