📄 magicsys.cpp
字号:
// MagicSys.cpp: implementation of the CMagicSys class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MagicSys.h"
#include "Char.h"
#include "Map.h"
#include "Effect.h"
#include "Menu.h" // 030402 kyo
using namespace battle;
extern char tool_ID_EFFECT_TEST;
extern bool IsAttackAble(LPCHARACTER pTarget);
///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////
static POINT s_aPlace[8][5] =
{
{{ 0, -3}, {-2, -3}, { 2, -3}, {-4, -3}, { 4, -3}},
{{-2, -2}, {-4, 0}, { 0, -4}, {-6, 2}, { 2, -6}},
{{-3, 0}, {-3, 2}, {-3, -2}, {-3, 4}, {-3, -4}},
{{-2, 2}, { 0, 4}, {-4, 0}, { 2, 6}, {-6, -2}},
{{ 0, 3}, {-2, 3}, { 2, 3}, {-4, 3}, { 4, 3}},
{{ 2, 2}, { 4, 0}, { 0, 4}, { 6, -2}, {-2, 6}},
{{ 3, 0}, { 3, 2}, { 3, -2}, { 3, 4}, { 3, -4}},
{{ 2, -2}, { 0, -4}, { 4, 0}, {-2, -6}, { 6, 2}}
};
///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////
CMagicSys::CMagicSys()
{
}
CMagicSys::~CMagicSys()
{
}
///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////
int CMagicSys::Action(LPCHARACTER pCaster)
{
return ACTION_NONE;
}
void CMagicSys::Effect(MAGICLIST* pEffect)
{
LPCHARACTER pCaster = pEffect->lpChar_Own;
LPCHARACTER pTarget = pEffect->lpChar_Target;
if (pCaster == NULL || pTarget == NULL) return;
const int nMagic = pEffect->magicSerial;
if (pEffect->magicSubNum == 8)
{
switch (nMagic)
{
case VAMPIRE_POISON: // 轨颇捞绢狼 刀
case FEATHER_OF_CURSE: // 付厚狼 标判
case CURSE_OF_HELL: // 秋狼 历林
{
EffectLocal(pEffect, g_ClientTime);
break;
}
case OCTA_LIGHTNING:
case BLOOD_SPRINKLE:
{
break;
}
default:
{
::InsertMagic(pCaster, pTarget,
pEffect->next_Effect, 9,
pEffect->x, pEffect->y,
pEffect->tarx, pEffect->tary);
break;
}
}
}
else
{
switch (nMagic)
{
case GREAT_THUNDER_BOLT:
{
EffectDrop(pEffect, 4, g_ClientTime);
break;
}
case GREAT_METEOR:
{
EffectStorm(pEffect, g_ClientTime);
break;
}
case FLYING_SPARK:
{ // 橇扼雷 胶颇农
EffectShoot(pEffect, 3);
break;
}
case FIRE_EXPLOSION:
{ // 拳堪气惯
EffectMulti(pEffect, 5);
break;
}
case ICE_STORM:
case FIRE_STORM:
{ // 颇捞绢 胶盆
EffectStorm(pEffect, g_ClientTime);
break;
}
case SHADOW_OF_EVIL:
{ // 厩狼 弊覆磊
EffectSpread(pEffect);
break;
}
case BLITZ_SPEAR:
{ // 锅俺芒
EffectShoot(pEffect, 5);
break;
}
case LIGHTNING_CLOUD:
{ // 傈拜 备抚
EffectRound(pEffect, g_ClientTime);
break;
}
case ICE_BREATH:
{ // 倔澜 宏饭静
EffectBreath(pEffect, 60, 0);
break;
}
case LIGHTNING_BREATH:
{ // 傈拜 宏饭静
EffectBreath(pEffect, 30, 0);
break;
}
case FLAME_PILLAR:
{ // 拳堪 扁嫡
EffectPillar(pEffect, g_ClientTime);
break;
}
case FLAME_POUR:
{
EffectPillar(pEffect, g_ClientTime);
break;
}
case HOLY_RAGE:
{
EffectDrop(pEffect, 3, g_ClientTime);
break;
}
case FIRE_BREATH:
case AREA_PARALYSIS:
case AREA_POISON:
case AREA_CONFUSION:
case AREA_SLOW:
case AREA_BAT_ATTACK:
{
break;
}
case DEATH_FIRE: // 030123 kyo
{
EffectMulti(pEffect, 5);
break;
}
case AUTHORITY_OF_WHOARENCHA: // 030415 kyo
{
EffectSpreadIrregular(pEffect, g_ClientTime, 5, 7, 2 ); //5鸥老埃拜 2锅
break;
}
case ICE_BREATH2: // 030415 kyo
{
EffectPillar(pEffect, g_ClientTime, 50, true); // 030519 kyo
break;
}
case BLOOD_LIGHTNING: // 030415 kyo
{
EffectMulti(pEffect,3);
break;
}
case FLAME_ARROW:
{ //< CSD-031020
EffectMulti(pEffect, 5);
break;
} //> CSD-031020
default:
{
::InsertMagic(pCaster, pTarget,
pEffect->next_Effect,
pEffect->magicSubNum,
pEffect->x, pEffect->y,
pEffect->tarx, pEffect->tary,
false, 0, false,
pEffect->magic_Runtime);
break;
}
}
}
}
bool CMagicSys::Ready(LPCHARACTER pCaster, int nMagic, int nReady)
{
switch (pCaster->nCurrentAction)
{
case ACTION_ATTACK_BOW:
case ACTION_THROW:
case ACTION_SITDOWN:
{
return false;
}
}
// 焊咯瘤绰 付过捞 绝绊 付过 某胶泼捞 啊瓷茄 版快
if (g_lpML == NULL || pCaster->ready_Magic == 0)
{
if (Hero == pCaster)
{
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 14), g_MagicName[nMagic]);
}
pCaster->excute_MagicNum = nMagic; // 霖厚吝牢 付过狼 绊蜡锅龋甫 悸泼
pCaster->ready_Magic = 1; // 某胶泼 吝牢 惑怕 悸泼
pCaster->start_Casting = g_ClientTime + nReady + 3000;
// 焊炼拌凯苞 焊龋拌凯狼 付过荤侩 饶 老沥矫埃 饶 傈捧胶懦 荤侩 阂啊肺 汲沥
if (IsContinue(nMagic))
{
if (pCaster->continue_RunMagic < g_ClientTime + g_lpMT[nMagic].continue_Time*1000)
{
pCaster->continue_RunMagic = g_ClientTime + g_lpMT[nMagic].continue_Time*1000;
}
}
pCaster->end_Casting = g_ClientTime + nReady; // 某胶泼 肯丰矫埃 悸泼
// 某胶泼 悼累
switch (pCaster->spell)
{
case WIZARD_SPELL:
{ // 付过荤牢 版快
::InsertMagic(pCaster, pCaster, 403, 0, 0, 0, 0, 0);
break;
}
case PRIEST_SPELL:
{ // 己流磊牢 版快
::InsertMagic(pCaster, pCaster, 404, 0, 0, 0, 0, 0);
break;
}
}
return true;
}
if (Hero == pCaster)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 13));
}
return false;
}
bool CMagicSys::Apply(LPCHARACTER pCaster, LPCHARACTER pTarget, int nMagic, int nX, int nY, bool bFail)
{
if (nMagic != RELIEF_AUTHORITY) // 备盔狼 蝴捞 酒聪绊
{
if (!IsAttackAble(pTarget)) // 磷绢 乐芭唱 扁磊 葛靛老 版快
{
goto MAGIC_FIAL; // 付过 角菩
}
}
if (pTarget == NULL) pTarget = pCaster;
// 某胶泼吝 1雀 啊瓷 付过牢单 汗荐锅 荤侩内磊 且锭 blocking
if (g_lpMT[nMagic].excute_Type == 1 && pCaster->ready_Magic == 3)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 15));
goto MAGIC_FIAL;
}
if (Hero == pCaster)
{ //矫傈 努扼捞畔飘狼 儡咯 MP啊 付过阑 荤侩窍绰单 鞘夸茄 MP焊促 腹绊 磷瘤 臼篮 版快
if (SCharacterData.nCharacterHP > 0 && SCharacterData.nCharacterMP >= g_lpMT[nMagic].exhaust_MP)
{
SCharacterData.nCharacterMP -= g_lpMT[nMagic].exhaust_MP;
if (SCharacterData.nCharacterMP < 0) SCharacterData.nCharacterMP = 0;
pCaster->mp -= g_lpMT[nMagic].exhaust_MP;
if (pCaster->mp < 0) Hero->mp = 0;
}
else
{
switch (SCharacterData.nCharacterData[SPELL])
{
case WIZARD_SPELL:
{ // 付过荤扼搁
OUTPUT(MK_SHORTAGE, lan->OutputMessage(1, 9));
break;
}
case PRIEST_SPELL:
{ // 己流磊扼搁
OUTPUT(MK_SHORTAGE, lan->OutputMessage(1, 10));
break;
}
}
return false;
}
}
// 矫傈磊啊 某胶泼捞 场唱绊 付过 惯荤 霖厚登绢 乐阑矫 肚绰 甘 抛胶飘甫 困茄 皋春急琶矫
if ((g_lpMT[nMagic].excute_Type == 0 && pCaster->ready_Magic == 3) ||
pCaster->ready_Magic == 2 || tool_ID_EFFECT_TEST == 1)
{
DIRECTION dir = pCaster->direction;
if ((g_lpMT[nMagic].appoint_Type == 1 && pCaster == pTarget) || g_lpMT[nMagic].appoint_Type == 0)
{
dir = pCaster->direction;
}
else
{
::ChangeDirection(&dir, pCaster->x, pCaster->y, nX, nY); // 秦寸 努腐瘤痢栏肺 规氢 傈券
}
switch (pCaster->sprno)
{
case 83: // 轨颇捞绢
case 86: // 秋皋捞靛
{
::CharDoAni(pCaster, dir , MON1_BATTLE_MAGIC);
break;
}
default:
{
::CharDoAni(pCaster, dir , pCaster->nCurrentAction);
break;
}
}
if (!AddEffect(pCaster, pTarget, nMagic, nX, nY, bFail))
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 29));
goto MAGIC_FIAL;
}
}
if (Hero == pCaster || Hero == pTarget)
{
if (bFail)
{ // 付过捞 角菩茄 版快扼搁
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 30), g_MagicName[nMagic]);
goto MAGIC_FIAL;
}
switch (nMagic)
{
case LOW_MONSTER_RECALL:
{
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 31), pCaster->name);
break;
}
case MIDDLE_MONSTER_RECALL:
{
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 32), pCaster->name);
break;
}
default:
{
if (pCaster == pTarget)
{
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 33), pCaster->name, g_MagicName[nMagic]);
}
else
{
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 34), pCaster->name, pTarget->name, g_MagicName[nMagic]);
}
break;
}
}
}
// 付过 霖厚惑怕俊辑 付过角力备泅 窜拌肺 傈捞 悸泼
if (pCaster->ready_Magic == 2)
{
// 蜡瘤矫埃捞 粮犁窍绰 付过牢 版快
if (g_lpMT[nMagic].continue_Time != 0)
{
pCaster->ready_Magic = 3; // 付过备泅 矫累
}
// 茄锅 矫傈俊 茄锅 荤侩 啊瓷茄 付过牢 版快
if (g_lpMT[nMagic].excute_Type == 1)
{
::EndCastMagic(pCaster); // 矫傈磊狼 付过 霖厚惑怕甫 檬扁拳
}
return true;
}
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 35));
MAGIC_FIAL:
::EndCastMagic(pCaster); // 矫傈磊狼 付过 霖厚惑怕甫 檬扁拳
return false;
}
bool CMagicSys::IsEnable(int nMagic) const
{
// 乞拳葛靛 惑怕俊辑绰 付过 荤侩 阂啊
if (main_interface.data[IF_BATTLE_PEACE] == 0)
{ // 030402 kyo
OUTPUT(MK_NORMAL, lan->OutputMessage(1, 41));
return false;
}
// 捞傈 付过 荤侩饶 5檬 版苞 饶 促矫 付过 矫傈 啊瓷
if(g_ClientTime < Hero->castStartingTime)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 36));
return false;
}
// 某腐磐啊 磷绢 乐绰 版快
if (SCharacterData.nCharacterHP <= 0)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 1));
return false;
}
// 某腐磐啊 咯包俊辑 磊绊 乐绰 版快
if (SCharacterData.sleep != CSC_AWAKE)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 2));
return false;
}
// 旧酒 乐绰 惑怕俊绰 付过矫傈 阂啊
if (Hero->nCurrentAction == 17)
{
return false;
}
/*
// 傈捧胶懦 急琶 吝牢 版快
if (Hero->bSelect)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 89));
return false;
}
// 付过矫傈 吝牢 版快
if (Hero->ready_Magic != 0)
{
OUTPUT(MK_WARNING, lan->OutputMessage(1, 3));
return false;
}
*/
if (Hero->ready_Magic_rare != 0)
{
OUTPUT(MK_SHORTAGE, lan->OutputMessage(0, 81));
return false;
}
// 瓷仿摹 八荤
if (Hero_Ability[WIS] < g_lpMT[nMagic].require_WP)
{
OUTPUT(MK_SHORTAGE, lan->OutputMessage(1, 6));
return false;
}
if (Hero_Ability[INT_] < g_lpMT[nMagic].require_IT)
{
OUTPUT(MK_SHORTAGE, lan->OutputMessage(1, 6));
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -