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

📄 combatsys.cpp

📁 DragonRaja Client source version 1.4+ this source allow players join in (Hades Warfield or Monsters
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// CombatSys.cpp: implementation of the CCombatSys class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CombatSys.h"

#include "Char.h"
#include "Map.h"
#include "Menu.h"
#include "Effect.h"
#include "gameproc.h"
using namespace battle;

extern int g_CurrCharStatus;
extern char tool_ID_EFFECT_TEST;
extern bool IsAttackAble(LPCHARACTER pTarget);
extern void DoLButtonDown();

static bool g_aDirection[8] =
{
	false, true,  true,  true,
		true,  false, false, false
};

///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////

CCombatSys::CCombatSys()
{
	
}

CCombatSys::~CCombatSys()
{
	
}

///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////

int CCombatSys::Action(LPCHARACTER pCaster)
{ 
	//const int nCombat = pCaster->nActiveCombat; //Thralas
	
	switch(pCaster->nActiveCombat.GetDecrypted())//switch (nCombat)
	{
    case LIGHTNING_BOOM:    return ACTION_ATTACK_BONG_DOWN;
    case THUNDER_BLOW:      return ACTION_ATTACK_ONESWORD2;
    case LIGHTNING_SHOCK:   return ACTION_ATTACK_BONG_JJIRKI;
    case THUNDER_STRIKE:    return ACTION_ATTACK_ONESWORD1;
    case GROUND_ATTACK:     return ACTION_ATTACK_BONG_DOWN;
    case BLOOD_WILL:        return ACTION_ATTACK_ONESWORD1; 
    case SWORD_N_ROSES:     return ACTION_ATTACK_ONESWORD2;
    case HORN_OF_ICEBERG:   return ACTION_ATTACK_BONG_JJIRKI;
    case CHARGING:          return ACTION_ATTACK_BONG_DOWN;
    case DOUBLE_ATTACK:     return ACTION_ATTACK_ONESWORD2;
    case DARK_BLADE:        return ACTION_ATTACK_ONESWORD1;
    case LIGHTNING_EXTREME: return ACTION_ATTACK_BONG_ROUND;	// 030513 kyo
    case EARTH_EXTREME:     return ACTION_ATTACK_BONG_DOWN;
    case DARK_EXTREME:      return ACTION_ATTACK_BONG_ROUND;
    case WIND_EXTREME:      return ACTION_ATTACK_BONG_ROUND;
	}
	
	return ACTION_NONE;
} 

void CCombatSys::Effect(MAGICLIST* pEffect)
{
	LPCHARACTER pCaster = pEffect->lpChar_Own;
	LPCHARACTER pTarget = pEffect->lpChar_Target;
	if (pCaster == NULL || pTarget == NULL)  return;
	
	const int nCombat = pEffect->magicSerial;
	
	if (pEffect->magicSubNum == 8)
	{
		switch (nCombat)
		{
		case BLOOD_EARTH:
			{
				break;
			}
		default:
			{
				::InsertMagic(pCaster, pTarget, 
					pEffect->next_Effect, 9,
					pEffect->x, pEffect->y,
					pEffect->tarx, pEffect->tary);
				break;
			}
		}
	}
	else
	{
		switch (nCombat)
		{
		case MULTIPLE_FIRE:
			{
				switch (pCaster->nActiveLevel.GetDecrypted())
				{
				case 1:
				case 2: EffectShoot(pEffect, 3); break;
				case 3: EffectShoot(pEffect, 5); break;
				}
				
				break;
			}
		case ICING_BLAST:
			{
				switch (pCaster->nActiveLevel.GetDecrypted())
				{
				case 1:
				case 2: EffectMulti(pEffect, 3); break;
				case 3: EffectMulti(pEffect, 5); break;
				}
				
				break;
			}
		case LIGHTNING_EXTREME:
			{
				//EffectSpread(pEffect);
				EffectSpreadIrregular(pEffect, g_ClientTime, 5, 7, 2 );	//5鸥老埃拜 2锅 // 030328 kyo
				break;
			}
		case EARTH_EXTREME:
			{
				const int nMax = pCaster->nActiveLevel.GetDecrypted() + 1; 
				EffectQuake(pEffect, nMax, g_ClientTime);
				break;
			}
		case FIRE_EXTREME:
		case ICE_EXTREME:
			{
				EffectSpread(pEffect);
				break;
			}
		case DARK_EXTREME:
			{
				const int nMax = pCaster->nActiveLevel.GetDecrypted() + 1; 
				EffectQuake(pEffect, nMax, g_ClientTime);
				break;
			}
		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 CCombatSys::Ready(LPCHARACTER pCaster, int nCombat, int nReady)
{
	switch (pCaster->nCurrentAction)
	{	//< CSD-030423
	case ACTION_ATTACK_BOW:
	case ACTION_THROW:
	case ACTION_SITDOWN:
		{
			return false;
		}
	}	//> CSD-030423
	// 焊咯瘤绰 付过捞 绝绊 付过 某胶泼捞 啊瓷茄 版快
	if (g_lpML == NULL || pCaster->ready_Magic == 0 || pCaster->ready_Magic == 2)
	{
		if (Hero == pCaster)
		{
			const int nNumber = nCombat - 100;
			
			if (nNumber >= 114 && nNumber <= 150)
			{
				OUTPUT(MK_NORMAL, lan->OutputMessage(1, 60), CombatSkillExplain[nNumber].LocalName);
			}
		}
		
		pCaster->excute_MagicNum = nCombat;  		      // 霖厚吝牢 付过狼 绊蜡锅龋甫 悸泼
		pCaster->ready_Magic = 1;					            // 某胶泼 吝牢 惑怕 悸泼
		pCaster->start_Casting  = g_ClientTime + 3000;
		pCaster->end_Casting = g_ClientTime + nReady;	// 某胶泼 肯丰矫埃 悸泼
		// 傈捧胶懦 霖厚 悼累
		const int nType = g_lpMT[nCombat].order_Type;
		const int nCast = 500 + (nType/10) + (nType%10);
		::InsertMagic(pCaster, pCaster, nCast, 0, 0, 0, 0, 0); 
		return true;
	}	
	
	if (Hero == pCaster)
	{
		OUTPUT(MK_WARNING, lan->OutputMessage(1, 59));
	}
	
	return false;
}

bool CCombatSys::Apply(LPCHARACTER pCaster, LPCHARACTER pTarget, int nCombat, int nX, int nY, bool bFail)
{
	if (!IsAttackAble(pTarget))	// 磷绢 乐芭唱 扁磊 葛靛老 版快 
	{		
		goto COMBAT_FIAL;			// 付过 角菩
	}
	
	if (pTarget == NULL)  pTarget = pCaster;

	if (Hero == pCaster || Hero == pTarget) // 030516 kyo 困摹捞悼 刚历 付过狼 己傍咯何甫 汞绰促. 
	{
		const int nNumber = nCombat - 100;
		
		if (nNumber >= 114 && nNumber <= 150)
		{
			if (bFail) 
			{ // 付过捞 角菩茄 版快扼搁
				OUTPUT(MK_NORMAL, lan->OutputMessage(1, 62), CombatSkillExplain[nNumber].LocalName);
				goto COMBAT_FIAL;
			}
			
			if (pCaster == pTarget)
			{
				OUTPUT(MK_NORMAL, lan->OutputMessage(1, 63), pCaster->name, 
					CombatSkillExplain[nNumber].LocalName);
			}
			else
			{
				OUTPUT(MK_NORMAL, lan->OutputMessage(1, 64), pCaster->name, 
					pTarget->name, 
					CombatSkillExplain[nNumber].LocalName);
			}
		}
	}

	// 矫傈磊啊 某胶泼捞 场唱绊 付过 惯荤 霖厚登绢 乐阑矫 肚绰 甘 抛胶飘甫 困茄 皋春急琶矫		
	if ((g_lpMT[nCombat].excute_Type == 0 && pCaster->ready_Magic == 3) ||
		pCaster->ready_Magic == 2 || tool_ID_EFFECT_TEST == 1)
	{
		DIRECTION	dir = pCaster->direction;
		
		if ((g_lpMT[nCombat].appoint_Type == 1 && pCaster == pTarget) || g_lpMT[nCombat].appoint_Type == 0)
		{
			dir = pCaster->direction;
		}
		else
		{
			::ChangeDirection(&dir, pCaster->x, pCaster->y, nX, nY); // 秦寸 努腐瘤痢栏肺 规氢 傈券
		}
		
		switch (nCombat)
		{ 
		case LIGHTNING_SHIELD:
		case BURNING_BLOODY:	// 030415 kyo
		case ICE_SHIELD:
		case LIGHTNING_BOOM:
		case GROUND_ATTACK:
		case THUNDER_BLOW:
		case LIGHTNING_SHOCK:
		case THUNDER_STRIKE:
		case STONE_ARMOR:
		case CRITICAL_HIDING:
		case HORN_OF_ICEBERG:
		case CHARGING:
		case TWISTER:
		case TYBERN_GIFT:
		case ACUQUIRE_DARK:	// 030415 kyo
		case DARK_BLADE:
		case MULTIPLE_FIRE:
		case ICING_BLAST:
		case SIMUNIAN_BOSOM:
		case LIGHTNING_EXTREME: //030513 kyo 
		case EARTH_EXTREME:
		case FIRE_EXTREME:
		case DARK_EXTREME:
		case ICE_EXTREME:
		case WIND_EXTREME:
			{
				::CharDoAni(pCaster, dir, ACTION_BATTLE_NONE);
				break;
			}
		case WHILWIND:
			{	//< CSD-TW-030701
				::CharDoAni(pCaster, dir, ACTION_MAGIC_CASTING);
				break;
			}	//> CSD-TW-030701
		case BLOOD_EARTH:
		case POISONING_NOVA:
			{
				ClearCrash();
				::CharDoAni(pCaster, dir, ACTION_MAGIC_BEFORE);
				break;
			}
		} 
		
		if (!AddEffect(pCaster, pTarget, nCombat, nX, nY, bFail))
		{
			OUTPUT(MK_WARNING, lan->OutputMessage(1, 61));	
			goto COMBAT_FIAL;
		}
	}
	
	// 付过 霖厚惑怕俊辑 付过角力备泅 窜拌肺 傈捞 悸泼
	if (pCaster->ready_Magic == 2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -