📄 magic.cpp
字号:
#include "StdAfx.h"
CMagic::CMagic()
{
m_bActiveState = _MAGIC_FINISH;
m_bRepeat = FALSE;
m_bFixed = FALSE;
m_bShowLight = TRUE;
m_pxOwner = NULL;
m_pxTarget = NULL;
m_pxMap = NULL;
m_shScrnX = m_shScrnY = 0;
m_shTileX = m_shTileY = 0;
m_shFireScrnX = m_shFireScrnY = 0;
m_shFireTileX = m_shFireTileY = 0;
m_shTargetScrnX = m_shTargetScrnY = 0;
m_shTargetTileX = m_shTargetTileY = 0;
m_bMagicNum = 0;
m_wCurrDelay = 0;
m_wFrmDelay = 0;
m_wMagicLife = 0;
m_dwFstFrame = 0;
m_dwEndFrame = 0;
m_dwCurrFrame = 0;
m_bBlendType = 0;
m_bOpacity = 0;
m_bSwingCnt = 0;
m_bDir16 = 0;
m_nPrevDistanceX = 10000;
m_nPrevDistanceY = 10000;
ZeroMemory(m_bLightRadius, 2);
ZeroMemory(m_bLightColor, 2*3);
ZeroMemory(m_bMagicColor, 3);
m_nDuplicateNum = MAX_DUPLE_COUNT;
ZeroMemory(m_lpddsMagicTextr, sizeof(LPDIRECTDRAWSURFACE7)*60);
}
CMagic::~CMagic()
{
}
BOOL CMagic::CreateMagic(BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY,
SHORT shTargetTileX, SHORT shTargetTileY, CActor* pxOwner, INT nTarget)
{
LPEFFECTSPRINFO pstMagicSpr = g_xSpriteInfo.GetMagicInfo(bMagicNum);
if ( pstMagicSpr )
{
//------------------------------------------------------------------------------------------------------------
// 谅钎技泼.
//------------------------------------------------------------------------------------------------------------
m_pxMap = &g_xGameProc.m_xMap;
m_pxTarget = NULL;
if ( nTarget )
{
if ( nTarget == g_xGameProc.m_xMyHero.m_dwIdentity )
{
m_pxTarget = &g_xGameProc.m_xMyHero;
}
else
{
g_xGameProc.m_xActorList.MoveCurrentToTop();
CActor* pxActor;
for ( INT nCnt = 0; nCnt < g_xGameProc.m_xActorList.GetCounter(); nCnt++ )
{
pxActor = g_xGameProc.m_xActorList.GetCurrentData();
if ( pxActor->m_dwIdentity == nTarget )
{
m_pxTarget = pxActor;
}
g_xGameProc.m_xActorList.MoveNextNode();
}
}
}
// 惯荤瘤痢.
m_shFireTileX = shFireTileX;
m_shFireTileY = shFireTileY;
m_pxMap->GetScrnPosFromTilePos(m_shFireTileX, m_shFireTileY, m_shFireScrnX, m_shFireScrnY);
// 格利瘤痢.
m_shTargetTileX = shTargetTileX;
m_shTargetTileY = shTargetTileY;
m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
// 泅犁困摹.
m_shTileX = m_shFireTileX;
m_shTileY = m_shFireTileY;
m_shScrnX = m_fFloatScrnX = m_shFireScrnX;
m_shScrnY = m_fFloatScrnY = m_shFireScrnY;
m_bMagicColor[0] = 255;
m_bMagicColor[1] = 255;
m_bMagicColor[2] = 255;
SHORT shScrnGapX, shScrnGapY;
if ( m_shFireScrnX != m_shTargetScrnX ) shScrnGapX = abs(m_shTargetScrnX-m_shFireScrnX);
else shScrnGapX = 1;
if ( m_shFireScrnY != m_shTargetScrnY ) shScrnGapY = abs(m_shTargetScrnY-m_shFireScrnY);
else shScrnGapY = 1;
FLOAT fGapRateX = (FLOAT)(500/(FLOAT)shScrnGapX);
FLOAT fGapRateY = (FLOAT)(500/(FLOAT)shScrnGapY);
if ( shScrnGapX > shScrnGapY )
{
m_nDistanceX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateX);
m_nDistanceY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateX);
}
else
{
m_nDistanceX = (m_shTargetScrnX-m_shFireScrnX) * (fGapRateY);
m_nDistanceY = (m_shTargetScrnY-m_shFireScrnY) * (fGapRateY);
}
m_bDir16 = (BYTE)m_pxMap->CalcDirection16(m_shFireTileX, m_shFireTileY, shTargetTileX, shTargetTileY);
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 扁夯沥焊涝仿.
//------------------------------------------------------------------------------------------------------------
m_pxOwner = pxOwner;
m_bActiveState= _MAGIC_ACTIVE;
m_bFixed = TRUE;
m_bRepeat = FALSE;
m_wMagicLife= 0;
m_bMagicNum = bMagicNum;
m_bCurrSwing = 0;
m_wCurrLightDelay = 0;
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 付过俊 蝶弗 沥焊技泼.
//------------------------------------------------------------------------------------------------------------
switch ( bMagicNum )
{
case _SKILL_FIRECHARM:
case _SKILL_FIREBALL2:
case _SKILL_FIREBALL:
case _SKILL_SHOOTLIGHTEN:
m_bRepeat = TRUE;
m_bFixed = FALSE;
break;
case _SKILL_SINSU:
m_bRepeat = TRUE;
m_bFixed = FALSE;
break;
case _SKILL_BIGCLOAK:
case _SKILL_HANGMAJINBUB:
case _SKILL_DEJIWONHO:
m_pxTarget = NULL;
m_bRepeat = TRUE;
m_bFixed = FALSE;
break;
// 阁胶磐.
case _MONMAGIC_MAARROW:
case _MONMAGIC_CHIM:
m_bRepeat = TRUE;
m_bFixed = FALSE;
m_bShowLight = FALSE;
break;
// 阁胶磐.
case _MONMAGIC_ANTHEAL:
case _MONMAGIC_DUALAXE:
m_bRepeat = TRUE;
m_bFixed = FALSE;
m_bDir16 = (BYTE)m_pxMap->CalcDirection8(m_shFireTileX, m_shFireTileY, shTargetTileX, shTargetTileY);
m_bShowLight = FALSE;
break;
case _SKILL_FIRE:
m_bDir16 = 0;
m_bRepeat = FALSE;
m_bFixed = TRUE;
m_pxTarget = NULL;
break;
// 阁胶磐.
case _MONMAGIC_COWGHOST:
case _MONMAGIC_SINSU:
case _MONMAGIC_ZOMBIE:
case _MONMAGIC_JUMAWANG:
case _MONMAGIC_COWFLAME:
case _MONMAGIC_SSEGI:
if ( m_pxOwner )
m_bDir16 = m_pxOwner->m_bCurrDir;
m_bRepeat = FALSE;
m_bFixed = TRUE;
m_pxTarget = NULL;
m_bShowLight = FALSE;
break;
case _SKILL_LIGHTENING:
case _SKILL_FIREBOOM:
case _SKILL_EARTHFIRE:
case _SKILL_SNOWWIND:
case _SKILL_HOLYSHIELD:
case _SKILL_BIGHEALLING:
m_bRepeat = FALSE;
m_bFixed = TRUE;
m_bDir16 = 0;
m_pxTarget = NULL;
break;
case _SKILL_AMYOUNSUL:
case _SKILL_MOOTEBO:
case _SKILL_TAMMING:
case _SKILL_KILLUNDEAD:
case _SKILL_HEALLING:
case _SKILL_SKELLETON:
case _SKILL_SHIELD:
case _SKILL_SHOWHP:
case _SKILL_SPACEMOVE2:
case _SKILL_SPACEMOVE3:
// 阁胶磐.
case _MONMAGIC_KEPAL:
case _MONMAGIC_EXPLODE:
case _MONMAGIC_EXPLODE1:
case _MONMAGIC_BLACK1:
case _MONMAGIC_BLACK2:
case _MONMAGIC_GREATANT:
case _MONMAGIC_MAGENUMA:
case _MONMAGIC_ANT:
case _MONMAGIC_WORKANT:
case _MONMAGIC_BIGGINE_CHAR:
case _MONMAGIC_RED1:
case _MONMAGIC_RED2:
case _MONMAGIC_BAODIE:
case _MONMAGIC_ZOMBIE_DIE:
case _MONMAGIC_HUSU_DIE:
case _MONMAGIC_SINGI_DIE:
case _MONMAGIC_BIGGINE_ATT:
case _MONMAGIC_SANDFISH:
m_bRepeat = FALSE;
m_bFixed = TRUE;
m_bDir16 = 0;
m_bShowLight = FALSE;
break;
}
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 捞固瘤肺爹.
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 橇饭烙沥焊掘扁.
//------------------------------------------------------------------------------------------------------------
m_dwFstFrame = pstMagicSpr->dwFstFrm+(10)*m_bDir16;
m_dwEndFrame = pstMagicSpr->dwEndFrm+(10)*m_bDir16;
m_dwCurrFrame = m_dwFstFrame;
m_wFrmDelay = pstMagicSpr->wDelay;
m_bLightRadius[0] = pstMagicSpr->bLightRadius[0];
m_bLightRadius[1] = pstMagicSpr->bLightRadius[1];
m_bLightColor[0][0] = pstMagicSpr->bLightColor[0][0];
m_bLightColor[0][1] = pstMagicSpr->bLightColor[0][1];
m_bLightColor[0][2] = pstMagicSpr->bLightColor[0][2];
m_bLightColor[1][0] = pstMagicSpr->bLightColor[1][0];
m_bLightColor[1][1] = pstMagicSpr->bLightColor[1][1];
m_bLightColor[1][2] = pstMagicSpr->bLightColor[1][2];
m_bBlendType = pstMagicSpr->bBlendType;
m_bOpacity = pstMagicSpr->bOpa;
m_bSwingCnt = pstMagicSpr->bSwingCnt;
//------------------------------------------------------------------------------------------------------------
WORD wImgIdx = pstMagicSpr->wImgIdx;
WORD wFileType;
m_pxMagicImg = &g_xGameProc.m_xImage.m_xImageList[wImgIdx];
for ( INT nCnt = m_dwFstFrame; nCnt < m_dwEndFrame; nCnt++ )
{
if ( wImgIdx == _IMAGE_MAGIC )
{
wFileType = _TEXTR_FILE_MAGIC;
}
else if ( wImgIdx == _IMAGE_MONMAGIC )
{
wFileType = _TEXTR_FILE_MONMAGIC;
}
g_xGameProc.m_xImage.AddTextr(wFileType, wImgIdx, nCnt);
m_lpddsMagicTextr[nCnt-m_dwFstFrame] = g_xGameProc.m_xImage.GetTextrImg(wFileType, wImgIdx, nCnt);
}
D3DVECTOR vNorm(0, 0, -1);
m_avMagic[0] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
m_avMagic[1] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
m_avMagic[2] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
m_avMagic[3] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);
//------------------------------------------------------------------------------------------------------------
const INT nMagicSndTbl[31] =
{
0, 6, 8, 14, 15, 9, 0, 20, 21, 32,
1, 2, 16, 29, 24, 10, 17, 33, 19, 31,
28, 22, 13, 21, 5, 0, 12, 11, 0, 18,
30,
};
INT nWaveNum = -1;
BOOL bLoop = FALSE;
if ( m_bMagicNum == _SKILL_EARTHFIRE )
bLoop = TRUE;
static DWORD dwLastTick = 0;
if ( timeGetTime() - dwLastTick > 100 )
{
if ( m_bMagicNum < 31 )
{
if ( m_bFixed )
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
else
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
}
/* if ( nWaveNum > 10010 )
m_nDuplicateNum = g_xSound.PlayActorWav(m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY, nWaveNum, 100, bLoop);
*/ }
dwLastTick = timeGetTime();
return TRUE;
}
return FALSE;
}
BOOL CMagic::DrawLight(CLightFog* xLightFog, INT nLoopTime)
{
BYTE bSwingCnt = 0; // 橇饭烙捞 函拳灯阑锭父.
m_wCurrLightDelay += nLoopTime;
if ( m_bMagicNum == _SKILL_EARTHFIRE || m_bMagicNum == _SKILL_HOLYSHIELD || m_bMagicNum == _SKILL_FIRE || m_bMagicNum == _SKILL_SPACEMOVE2 || m_bMagicNum == _SKILL_SINSU || m_bMagicNum == _SKILL_LIGHTENING )
{
if ( m_bActiveState == _MAGIC_ACTIVE )
{
if ( m_wCurrLightDelay > 200 )
{
m_wCurrLightDelay = 0;
m_bCurrSwing++;
if ( m_bCurrSwing > m_bSwingCnt )
{
m_bCurrSwing = 0;
}
}
}
else if( m_bActiveState == _LIGHT_ACTIVE )
{
m_bCurrSwing = 0;
m_bLightColor[0][0] -= 2;
if ( m_bLightColor[0][0] <= 2 ) m_bLightColor[0][0] = 2;
m_bLightColor[0][1] -= 2;
if ( m_bLightColor[0][1] <= 2 ) m_bLightColor[0][1] = 2;
m_bLightColor[0][2] -= 2;
if ( m_bLightColor[0][2] <= 2 ) m_bLightColor[0][2] = 2;
m_bLightColor[1][0] -= 2;
if ( m_bLightColor[1][0] <= 2 ) m_bLightColor[1][0] = 2;
m_bLightColor[1][1] -= 2;
if ( m_bLightColor[1][1] <= 2 ) m_bLightColor[1][1] = 2;
m_bLightColor[1][2] -= 2;
if ( m_bLightColor[1][2] <= 2 ) m_bLightColor[1][2] = 2;
if ( m_bLightColor[0][0] == 2 &&
m_bLightColor[0][1] == 2 &&
m_bLightColor[0][2] == 2 &&
m_bLightColor[1][0] == 2 &&
m_bLightColor[1][1] == 2 &&
m_bLightColor[1][2] == 2)
{
m_bActiveState = _MAGIC_FINISH;
return FALSE;
}
}
}
else
{
if ( m_wCurrLightDelay > 200 )
{
if ( m_bActiveState == _MAGIC_ACTIVE )
{
m_wCurrLightDelay = 0;
m_bCurrSwing++;
if ( m_bCurrSwing > m_bSwingCnt )
{
m_bCurrSwing = 0;
}
}
else if( m_bActiveState == _LIGHT_ACTIVE )
{
m_bCurrSwing = 0;
m_wCurrLightDelay = 150;
if ( m_bLightRadius[0] > 1 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -