📄 role.cpp
字号:
#pragma warning(disable:4786)
#include "basefunc.H"
#include "nd_bitmap.H"
#include "ani.H"
#include "3dgamemap.H"
#include "3droledata.H"
#include "3DRole.h"
#include "role.H"
#include "Hero.H"
#include "GameMsg.H"
#include "GameDataSet.H"
#include "GamePlayerSet.h"
#include "3DStatuary.h"
#include "3DTarget.h"
#include "3DTaskNpc.h"
#include "SynStone.h"
#include "BoothNpc.h"
#include "MagicItem.h"
#include "DiceView.h"
#include "TerrainNpcView.h"
#include "Item.h"
#include "Physics.h"
const int _MAX_ROLEDATA =2;
const int _DEFAULT_JUMP_HEIGH = 120;
// static member
int CRole::s_nShadowType = SHADOW_REAL;//SHADOW_SIMPLE;//CRole::SHADOW_REAL;//SHADOW_SIMPLE;
float CRole::s_fBaseScale = 0.75f;
//--------------------------------------------------------------
void CRole::Init(void)
{
memset(&m_Info, 0L, sizeof(m_Info));
this->InitCommand();
m_Info.iSize = 1;
m_Info.iAddSize = 0;
m_Info.iZoomPercent = 100;
m_Info.objPath.SetSearchMethod(_ASTAR_CLOSE);
m_pIRoleView =NULL;
m_dwStatus =USERSTATUS_NORMAL;
m_tmLastAtk = 0;
m_tmDisappear = 0;
m_dwRoleAttribute = 0;
m_Info.nFlyOffset = 0;
m_nWhichLeg = 0;
m_Info.bAdjustRun = false;
m_Info.ucSprite = 255 ;
m_Info.dwSpeed = 100;
m_setCmd.clear();
m_dwDisappear = 0;
m_dwDisappearLast = 0;
m_dwCommandIndex = 0;
}
//--------------------------------------------------------------
BOOL CRole::Create(UINT uLook, int nViewType)
{
if(uLook%2 == 0)
m_Info.nSex = 1;
else
m_Info.nSex = 2;
if(uLook > 6)
this->SetRace(RACE_NONE);
else
this->SetRace((uLook+1)/2);
m_Info.usLook = uLook;
m_nViewType = nViewType;
this->Disappear(500);
switch(nViewType)
{
case _ROLE_VIEW_ROLE:
{
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
C3DRole* pRole =(C3DRole* )C3DRole::CreateNewView();
pRole->SetGame3DEffectEx(&m_objEffect);
m_pIRoleView = pRole;
if (!m_pIRoleView)
return false;
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
}
return true;
case _ROLE_VIEW_STATUARY:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView =C3DStatuary::CreateNewView();
if (!m_pIRoleView)
return false;
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_TARGET:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = C3DTarget::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_TASKNPC:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = C3DTaskNpc::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_DICENPC:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = CDiceView::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_SYNSTONE:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = CSynStone::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_BOOTH:
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = CBoothNpc::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
case _ROLE_VIEW_MAPMAGICOBJ:
if(m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = CMagicItem::CreateNewView();
m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
return true;
default:
return false;
}
return true;
}
//--------------------------------------------------------------
BOOL CRole::Create(UINT uLook, int nViewType, OBJID id, CMyPos pos)
{
m_Info.usLook = uLook;
m_nViewType = nViewType;
switch(nViewType)
{
case _ROLE_VIEW_TERRAIN:
if(m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_pIRoleView = CTerrainNpcView::CreateNewView(uLook, id, pos);
break;
}
this->Disappear(500);
return true;
}
//--------------------------------------------------------------
void CRole::Destroy(void)
{
if (m_pIRoleView)
SAFE_DELETE(m_pIRoleView);
m_objEffect.Clear();
this->ClrAniEffect(NULL);
int nAmount = m_setCmd.size();
for(int i = 0; i < nAmount; i ++)
{
delete m_setCmd[i];
}
m_setCmd.clear();
this->Init();
}
//--------------------------------------------------------------
void CRole::SetFace(USHORT usFace)
{
m_Info.usFace=usFace;
if(m_pIRoleView)
m_pIRoleView->SetVariable(_VAR_HEAD, usFace);
}
//--------------------------------------------------------------
void CRole::AllotRes()
{
if(!m_pIRoleView)
m_pIRoleView = C3DRole::CreateNewView();
MYASSERT(m_pIRoleView);
this->SetLook(m_Info.usLook);
this->Transform(m_Info.nTransformLook);
this->SetHair(m_Info.usHair);
this->SetArmor(m_Info.idArmorType);
this->SetRWeapon(m_Info.idRWeaponType);
this->SetLWeapon(m_Info.idLWeaponType);
this->SetMount(m_Info.idMountType);
this->SetArmet(m_Info.idArmetType);
}
//--------------------------------------------------------------
void CRole::SetLook(USHORT usLook)
{
m_Info.usLook =usLook;
if(m_pIRoleView)
m_pIRoleView->SetVariable(_VAR_LOOK, usLook);
}
//--------------------------------------------------------------
void CRole::SetHair(USHORT usHair)
{
// if ((usHair%100) == 0)
// usHair = 0;
m_Info.usHair =usHair;
if(m_pIRoleView)
m_pIRoleView->SetVariable(_VAR_HAIR, usHair);
}
//--------------------------------------------------------------
void CRole::InitCommand(void)
{
m_Info.cmdProc.iType =_COMMAND_STANDBY;
m_Info.cmdProc.iStatus =_CMDSTATUS_BEGIN;
m_Info.cmdProc.posTarget.x =0;
m_Info.cmdProc.posTarget.y =0;
}
//--------------------------------------------------------------
DWORD CRole::SetCommand(CCommand* pCommand)
{
if (!pCommand)
return 0;
m_dwCommandIndex++;
pCommand->dwIndex = m_dwCommandIndex;
/*
// reset action...
if (_COMMAND_STANDBY != pCommand->iType)
{
// emotion, standby and action can be interrupted at any time.
if (_COMMAND_STANDBY == m_Info.cmdProc.iType
|| _COMMAND_EMOTION == m_Info.cmdProc.iType)
this->ResetActionData();
// cmd accomplished can be interrupted at andy time
if (_CMDSTATUS_ACCOMPLISH == m_Info.cmdProc.iStatus)
{
if (_ACTION_STANDBY == m_Info.iActType
|| _ACTION_ALERT == m_Info.iActType
|| _ACTION_REST1 == m_Info.iActType
|| _ACTION_REST2 == m_Info.iActType
|| _ACTION_REST3 == m_Info.iActType)
this->ResetActionData();
}
// die command can interrupt any command
if (_COMMAND_DIE == pCommand->iType)
this->ResetActionData();
}
*/
// set command now
if(pCommand->iType == _COMMAND_INTONE || pCommand->iType == _COMMAND_EMOTION || pCommand->iType == _COMMAND_ACTION)
{
if(((pCommand->nData == _ACTION_BRUISE0) || (pCommand->nData == _ACTION_DODGE0)) && (this->m_Info.cmdProc.iType == _COMMAND_EMOTION) &&
(m_Info.cmdProc.nData == _ACTION_INTONE || m_Info.cmdProc.nData == _ACTION_INTONE_DURATION))
return m_dwCommandIndex;
}
memcpy(&(m_Info.cmdProc), pCommand, sizeof(CCommand));
return m_dwCommandIndex;
}
//--------------------------------------------------------------
int CRole::GetCommandType(void)
{
if (_CMDSTATUS_ACCOMPLISH == this->GetCommandStatus())
{
if(m_Info.nFlyOffset == 0)
return _COMMAND_STANDBY;
else
return _COMMAND_FLOAT;
}
return m_Info.cmdProc.iType;
}
//--------------------------------------------------------------
DWORD CRole::GetFrameInterval(int nActType)
{
DWORD dwMyIndex, dwInterval;
if(m_pIRoleView)
{
dwMyIndex = this->GetLook()*1000000 + m_pIRoleView->GetVariable(_VAR_WEAPON_ACTION_DATA)*1000 + nActType;
dwInterval = g_obj3DRoleData.GetActionTimeInterval(dwMyIndex);
}
else
{
dwInterval = 33;
}
// if (this->IsAttacking())
// {
// if (this->TestStatus(USERSTATUS_ATKSPEED)
// || this->TestStatus(USERSTATUS_XPFULL)
/*|| this->TestStatus(USERSTATUS_TORNADO))*/
// dwInterval = dwInterval*2/3;
// }
/*else*/ if (this->IsMoving())
{
if(this->GetActionType() == _ACTION_JUMP)
{
// 取得跳跃距离
double dbDicAll = sqrt(
(m_Info.posActionBegin.x- m_Info.posActionEnd.x) *
(m_Info.posActionBegin.x - m_Info.posActionEnd.x) +
(m_Info.posActionBegin.y - m_Info.posActionEnd.y) *
(m_Info.posActionBegin.y - m_Info.posActionEnd.y)
);
dwInterval = __max(33, (DWORD) (dwInterval*dbDicAll/300+1));
}
if(m_dwSpeedRate == 0)
m_dwSpeedRate = 100;
if(IsRunning())
{
if(this->TestStatus(USERSTATUS_TEAMLEADER)&&
(
this->TestStatus(USERSTATUS_TEAM_HEALTH)||
this->TestStatus(USERSTATUS_TEAM_ATTACK)||
this->TestStatus(USERSTATUS_TEAM_DEFENCE)||
this->TestStatus(USERSTATUS_TEAM_SPEED)||
this->TestStatus(USERSTATUS_TEAM_EXP)||
this->TestStatus(USERSTATUS_TEAM_SPIRIT)||
this->TestStatus(USERSTATUS_TEAM_CLEAN)
)
)
dwInterval = dwInterval*100/80;
else
dwInterval = dwInterval*100/m_dwSpeedRate;
}
}
if( this->GetActionType() == _ACTION_RUNL ||
this->GetActionType() == _ACTION_RUNR)
dwInterval = dwInterval*100/m_Info.dwSpeed;
// if(this->TestStatus(USERSTATUS_XPFULL) && this->GetCommandType() == _COMMAND_LOCKATK)
// {
// dwInterval = dwInterval*1/2;
// }
if(dwInterval < 5)
dwInterval = 5;
return dwInterval;
}
//--------------------------------------------------------------
void CRole::SetActionData(void)
{
/*
if (m_Info.posRush.x != 0 || m_Info.posRush.y != 0) // speed up!
m_Info.timeFrameInterval /=2;
*/
CMyPos posRole;
g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, posRole.x, posRole.y);
BOOL bPlaySound = g_objGameMap.IsPosVisible(posRole, 4);
m_Info.iActFrameIndex =0;
BOOL bAccelerate = false;
/* if(this->TestStatus(USERSTATUS_FLY))
{
switch(m_Info.iActType)
{
case _ACTION_JUMP:
m_Info.iActType = _ACTION_FLY_MOVE;
break;
case _ACTION_STANDBY:
m_Info.iActType = _ACTION_FLY_STANDBY;
break;
case _ACTION_WALKL:
case _ACTION_WALKR:
case _ACTION_WALKR_I:
case _ACTION_WALKL_I:
case _ACTION_RUNL:
case _ACTION_RUNR:
bAccelerate = true;
m_Info.iActType = _ACTION_FLY_MOVE;
break;
case _ACTION_ATTACK0:
case _ACTION_ATTACK1:
case _ACTION_ATTACK2:
m_Info.iActType = _ACTION_FLY_ATTACK;
break;
case _ACTION_FLY_STANDBY:
case _ACTION_FLY_ALERT:
case _ACTION_FLY_MOVE:
case _ACTION_FLY_ATTACK:
case _ACTION_FLY_DOWN:
case _ACTION_FLY_UP:
case _ACTION_FLY_DIE:
case _ACTION_FLY_WOUND:
case _ACTION_BODY0:
break;
case _ACTION_BRUISE0:
m_Info.iActType = _ACTION_FLY_WOUND;
break;
default:
m_Info.iActType = _ACTION_FLY_STANDBY;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -