⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magicsys.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -