📄 magiceffect.cpp
字号:
// MagicEffect.cpp: implementation of the CMagicEffect class.
//
//////////////////////////////////////////////////////////////////////
#include "MagicEffect.h"
#include "Magic.h"
#include "GamePlayerSet.h"
#include "Player.h"
#include "Hero.h"
#include "3DMapEffect.h"
#include "3DGameMap.h"
#include "../NdSound/Ndsound.h"
#include "Physics.h"
#include "3DMapSimpleObj.h"
#include "TerrainEffectManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMagicEffect::CMagicEffect()
{
m_nType = MAGICEFFECT_NONE;
m_pData = NULL;
m_bBegin = false;
m_bDelayOk = false;
m_dwBegin = ::TimeGet();
m_dwBegin = 0;
m_dwDelay = 0;
}
CMagicEffect::~CMagicEffect()
{
this->Destroy();
}
//--------------------------------------------------------------------
void CMagicEffect::Destroy()
{
int nAmount = m_setRoleInfo.size();
for(int i = 0; i < nAmount; i ++)
{
MagicEffectRoleInfo* pInfo = m_setRoleInfo[i];
SAFE_DELETE(pInfo);
}
m_setRoleInfo.clear();
}
//--------------------------------------------------------------------
CMagicEffect* CMagicEffect::CreateNew(OBJID idSender, OBJID idTarget, DWORD dwMagicType, DWORD dwLevel, int nType,int nIndex)
{
CMagicEffect* pEffect = new CMagicEffect;
MYASSERT(pEffect);
if(!pEffect->Create(idSender, idTarget, dwMagicType, dwLevel, nType,nIndex))
{
SAFE_DELETE(pEffect);
return NULL;
}
return pEffect;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::Create(OBJID idSender, OBJID idTarget, DWORD dwMagicType, DWORD dwLevel, int nType, int nIndex)
{
m_idSender = idSender;
m_idTarget = idTarget;
m_dwMagicType = dwMagicType;
m_dwLevel = dwLevel;
m_nType = nType;
m_dwBegin = 0;
if (nType == MAGICEFFECT_SOUL)
{
m_dwDelay = ::RandGet(5)*300 + 1000;
m_fSpeedA = ::RandGet(300) + 50;
m_nIndex = nIndex;
}
return true;
}
//--------------------------------------------------------------------
void CMagicEffect::AddRoleInfo(OBJID idRole, DWORD dwData)
{
MagicEffectRoleInfo* pInfo = new MagicEffectRoleInfo;
pInfo->dwData = dwData;
pInfo->idRole = idRole;
m_setRoleInfo.push_back(pInfo);
}
//--------------------------------------------------------------------
BOOL CMagicEffect::Process()
{
// return true if this effect is end
if(m_nType == MAGICEFFECT_NONE)
{
MagicTypeInfo infoMagicType;
if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
return true;
// get type ...
m_nType = infoMagicType.dwClientRepresent;
}
switch(m_nType)
{
case MAGICEFFECT_BODY_BODY:
return this->ProcessBodyBody();
break;
case MAGICEFFECT_SOUL:
return this->ProcessSoul();
break;
case MAGICEFFECT_ARROW:
return this->ProcessArrow();
break;
case MAGICEFFECT_BODY_TERRAIN_BODY:
return this->ProcessBodyTerrainBody();
break;
case MAGICEFFECT_BODY_TRACE_BODY:
return this->ProcessBodyTraceBody();
break;
case MAGICEFFECT_BODY_TRACE_POS:
return this->ProcessBodyTracePos();
break;
default:
return true;
}
}
//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessSoul()
{
if(!m_bBegin)
{
// 创建 3dmapeffect
if (m_dwBegin == 0)
m_dwBegin = ::TimeGet();
if (::TimeGet() - m_dwBegin < m_dwDelay)
return false;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
if(!pPlayer)
return true;
CMyPos posWorld, posCell;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);
m_nIndex = max(::RandGet(12)*6,40);
m_posBegin.x = posWorld.x + ::RandGet(10)*10 - 85;
m_posBegin.y = posWorld.y;
g_objGameMap.World2Cell(m_posBegin.x, m_posBegin.y, posCell.x, posCell.y);
CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
if (!pLayer)
return true;
m_pData = new MagicEffectSoulInfo;
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
for(int i = 0; i < 1; i ++)
{
C3DMapEffect* pEffect= C3DMapEffect::CreateNew(m_posBegin, "pet53", false);
pLayer->AddMapObj(pEffect);
pEffect->SetPos(posCell);
pInfo->pEffect[i] = pEffect;
}
m_bBegin = true;
m_dwMoment = 0;
m_dwBegin = ::TimeGet();
return false;
}
if(m_dwMoment == 0)
{
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
// 开始缓缓上升 1 秒上升到高度 150 // 匀速 // 只改变世界坐标
if(::TimeGet() - m_dwBegin >= m_dwDelay)
{
m_dwMoment = 1;
m_dwData = ::TimeGet();
CMyPos posBg,posWorld;
pInfo->pEffect[0]->GetWorldPos(posBg); //BG POS
g_objGameMap.Bg2World(posBg.x, posBg.y, posWorld.x, posWorld.y);
m_posBegin = posWorld;
}
else
{
int nOffsetY = m_nIndex* (::TimeGet() - m_dwBegin) / m_dwDelay;
CMyPos posCurrent = m_posBegin;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
if(!pPlayer)
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
return true;
}
{
pInfo->pEffect[0]->SetWorldPos(posCurrent);
pInfo->pEffect[0]->SetOffsetY(-nOffsetY);
CMyPos posCell;
g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
pInfo->pEffect[0]->SetPos(posCell);
return false;
}
}
}
if (m_dwMoment == 1)
{
if(::TimeGet() - m_dwData >= 800)
{
m_dwMoment = 2;
m_dwData = ::TimeGet();
}
else
return false;
}
if(m_dwMoment == 2)
{
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
}
return true;
}
// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
CMyPos posEnd, posCurrent, posCell;
int nV = 400;
float fA = (float)m_fSpeedA;
DWORD dwTime = ::TimeGet() - m_dwBegin - m_dwDelay - 800;
float fTime = dwTime*1.0/1000;
int nCurrentV = nV + fTime * fA;
float fCurrentTime = (::TimeGet() - m_dwData)*1.0/1000;;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
posEnd.y += 50;
BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
m_posBegin = posCurrent;
m_dwData = ::TimeGet();
{
pInfo->pEffect[0]->SetWorldPos(posCurrent);
}
g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->SetPos(posCell);
}
if(bOk)
{
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
}
SAFE_DELETE(m_pData);
CCommand cmd;
cmd.iType = _COMMAND_EMOTION;
cmd.iStatus = _CMDSTATUS_BEGIN;
cmd.nData = _ACTION_RELIVE;
cmd.nDir = pPlayer->GetDir();
pPlayer->SetCommand(&cmd);
pPlayer->m_objEffect.Add("pet54");
}
return bOk;
}
return true;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessSoulEx()
{
if(!m_bBegin)
{
if (m_dwBegin == 0)
m_dwBegin = ::TimeGet();
if (m_dwDelay > 0 && ::TimeGet() - m_dwBegin < m_dwDelay)
return false;
m_bBegin = true;
m_dwMoment = 0;
// 创建 3dmapeffect
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
if(!pPlayer)
return true;
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget, true);
if (pTarget )
m_nDir = pPlayer->GetDir(pTarget);
else
m_nDir = 0;
CMyPos posWorld, posCell;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);
m_posBegin = posWorld;
CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
if (!pLayer)
return true;
m_pData = new MagicEffectSoulInfo;
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
for(int i = 0; i < 1; i ++)
{
C3DMapEffect* pEffect= C3DMapEffect::CreateNew(posWorld, "soul", false);
pLayer->AddMapObj(pEffect);
pEffect->SetPos(posCell);
pInfo->pEffect[i] = pEffect;
}
m_dwBegin = ::TimeGet();
return false;
}
if(m_dwMoment == 0)
{
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
// 从sender身上冲出500 秒
if(::TimeGet() - m_dwBegin >= 200)
{
m_dwMoment = 1; //进入悬停状态
m_dwData = ::TimeGet();
CMyPos posBg,posWorld;
pInfo->pEffect[0]->GetWorldPos(posBg); //BG POS
g_objGameMap.Bg2World(posBg.x, posBg.y, posWorld.x, posWorld.y);
m_posBegin = posWorld;
}
else
{
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
if(!pPlayer)
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
return true;
}
CMyPos posCurrent ;
int nX, nY;
this->GetSoulDirectPos(m_nIndex, m_nDir, nX, nY);
int nCurrentTime = ::TimeGet() - m_dwBegin;
posCurrent.x = m_posBegin.x - nX*nCurrentTime/200;
posCurrent.y = m_posBegin.y - nY*nCurrentTime/200;
pInfo->pEffect[0]->SetWorldPos(posCurrent);
CMyPos posCell;
g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
pInfo->pEffect[0]->SetPos(posCell);
return false;
}
}
if (m_dwMoment == 1)
{
if(::TimeGet() - m_dwData >= 1000)
{
m_dwMoment = 2;
m_dwData = ::TimeGet();
}
else
return false;
}
if (m_dwMoment == 2)
{
if(!m_pData)
return true;
MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
}
return true;
}
// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
CMyPos posEnd, posCurrent, posCell;
int nV = 100;
float fA = m_fSpeedA;
DWORD dwTime = ::TimeGet() - m_dwBegin - 1200;
float fTime = dwTime*1.0/1000;
int nCurrentV = nV + fTime * fA;
float fCurrentTime = (::TimeGet() - m_dwData)*1.0/1000;;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
posEnd.y += 50;
BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
m_posBegin = posCurrent;
m_dwData = ::TimeGet();
{
pInfo->pEffect[0]->SetWorldPos(posCurrent);
}
g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->SetPos(posCell);
}
if(bOk)
{
for(int i = 0; i < 1; i ++)
{
pInfo->pEffect[i]->Die();
}
SAFE_DELETE(m_pData);
if (pPlayer->GetID() == g_objHero.GetID())
{
g_objHero.m_objEffect.Add("GreenGlow");
}
}
return bOk;
}
return true;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyBody()
{
MagicTypeInfo infoMagicType;
if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
return true;
const int nRange = 3000;
if(!m_bBegin)
{
m_dwBegin = ::TimeGet();
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
if(pPlayer)
{
if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
}
if(infoMagicType.dwSenderAction != 0)
if(!pPlayer->IsDead())
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -