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

📄 battle.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
	return nDamage;
}

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

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

bool CCombat::AttackShort()
{	//< CSD-030723
	switch (m_pTarget->SprNo)
	{
    case 94:
	case 95: return false;
	}
	
	const int nAttack = CalcAttack(WR_SHORT); 
	const int nDefense = CalcDefense(nAttack);
	// 窜芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(WR_SHORT, nAttack - nDefense);
	Correct(WR_SHORT, nDamage); 
	// 荤侩 公扁狼 郴备档 皑家
	::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
	return Result(nDamage);
}	//> CSD-030723

bool CCombat::AttackMiddle()
{	//< CSD-030723
	switch (m_pTarget->SprNo)
	{					
	case 92:
	case 93:
	case 94: return false;
	}
	
	const int nAttack = CalcAttack(WR_MIDDLE); 
	const int nDefense = CalcDefense(nAttack);
	// 吝芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(WR_MIDDLE, nAttack - nDefense);
	Correct(WR_MIDDLE, nDamage); 
	// 荤侩 公扁狼 郴备档 皑家
	::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
	return Result(nDamage);
}	//> CSD-030723

bool CCombat::AttackLong(BYTE nType)
{	//< CSD-030723
	switch (m_pTarget->SprNo)
	{
	case 92:
	case 93:
	case 95: return false;
	}
	
	const int nAttack = CalcAttack(nType);
	const int nDefense = CalcDefense(nAttack);
	// 厘芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
	Correct(nType, nDamage); 
	// 荤侩 公扁狼 郴备档 皑家
	switch (nType)
	{
    case WR_LONG1: // 劝
		{
			::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
			::DecreaseEquipDuration(m_pCaster, 1, WT_SHIELD, m_pTarget->SprNo);
			break;
		}
    case WR_LONG2: // 厚档
		{
			::DecreaseEquipDuration(m_pCaster, 1, WT_WEAPON, m_pTarget->SprNo);
			break;
		}
	}
	
	if (m_pTarget->IsNpc() == true)				// LTS AI
	{
		if (m_pTarget->ChairNum)		// 辑滚 AI捞搁 	// LTS AI2	
		{
			if (rand()%10 > 5)							// LTS AI2
			{
				g_pAIManager->SetAI(m_pTarget,NPC_PATTERN_ATTACKED);
				g_pAIManager->SetTarget(m_pTarget,m_pCaster->GetServerID());
			}
		}
	}
	
	return Result(nDamage);
}	//> CSD-030723

void CCombat::SendInit(BYTE nType, WORD idMaster)
{	//< CSD-TW-030606
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.size = sizeof(t_combat_init);
	m_packet.h.header.type = CMD_COMBAT_INIT;
	m_packet.u.combat.combat_init.idMaster = idMaster;
	m_packet.u.combat.combat_init.nType = nType;
	CBattle::SendPacket(idMaster);
}	//> CSD-TW-030606

void CCombat::SendResult(int nCmd, t_server_combat_result* pPacket)
{
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = nCmd;
	
	switch (nCmd)
	{
    case CMD_COMBAT_RESULT:
		{
			m_packet.h.header.size = sizeof(t_server_combat_result);
			memcpy(&m_packet.u.combat.server_combat_result, 
				(t_server_combat_result*)pPacket, 
				sizeof(t_server_combat_result)); 
			break;
		}
    case CMD_COMBAT_RESULT_H:
		{
			m_packet.h.header.size = sizeof(t_server_combat_result_h);
			memcpy(&m_packet.u.combat.server_combat_result_h, 
				(t_server_combat_result_h*)pPacket, 
				sizeof(t_server_combat_result_h)); 
			break;
		}
    case CMD_COMBAT_RESULT_M:
		{
			m_packet.h.header.size = sizeof(t_server_combat_result_m);
			memcpy(&m_packet.u.combat.server_combat_result_m, 
				(t_server_combat_result_m*)pPacket, 
				sizeof(t_server_combat_result_m)); 
			break;
		}
    case CMD_COMBAT_RESULT_S:
		{
			m_packet.h.header.size = sizeof(t_server_combat_result_s);
			memcpy(&m_packet.u.combat.server_combat_result_s, 
				(t_server_combat_result_s*)pPacket, 
				sizeof(t_server_combat_result_s)); 
			break;
		}
    case CMD_COMBAT_RESULT_T:
		{
			m_packet.h.header.size = sizeof(t_server_combat_result_t);
			memcpy(&m_packet.u.combat.server_combat_result_t, 
				(t_server_combat_result_t*)pPacket, 
				sizeof(t_server_combat_result_t)); 
			break;
		}
	}
	
	CBattle::SendPacket(pPacket->idTarget);
}

///////////////////////////////////////////////////////////////////////////////
// Protected Method
///////////////////////////////////////////////////////////////////////////////

int CCombat::GetKind(CHARLIST* pSomeone) const
{	//< CSD-030723
	switch (pSomeone->GetTacticsKind())
	{	
    case TACTICS_Whirl:   
    case TACTICS_Pierce:
    case TACTICS_Magery:
    case TACTICS_Orison:  return WR_MIDDLE;
	case TACTICS_Archery: return WR_LONG1;
	case TACTICS_Hurl:    return WR_LONG2;
	}
	
	return WR_SHORT;
}	//> CSD-030723

int CCombat::CalcMaintain() const
{
	return GetContinueTime(m_nIndex);
}

int CCombat::CalcAttack(BYTE nType) const
{
	const int nCaster = m_pCaster->GetActiveCombat();
	const int nTarget = m_pTarget->GetActiveCombat();
	const int nResult = Relation(nCaster, nTarget);
	
	int nPercent = 0, nAdd = 0;
	
	if (!m_pTarget->IsIgnorePhysicalAttack())
	{	// 付过俊 狼茄 傍拜仿 焊沥
		switch (nType)
		{	//< CSD-030723	
		case WR_SHORT:  nPercent += m_pCaster->GetShortAttack();  break;
		case WR_MIDDLE: nPercent += m_pCaster->GetMiddleAttack(); break;
		case WR_LONG1:
		case WR_LONG2:  nPercent += m_pCaster->GetLongAttack();   break;
		}	//> CSD-030723
	}
	
	int nAttack = m_pCaster->CalcPhysicalStrikingPower(nPercent, nAdd);
	
	if (!m_pTarget->IsIgnorePhysicalAttack())
	{ // 傈捧胶懦俊 狼茄 傍拜仿 焊沥
		switch (nCaster)
		{
		case LIGHTNING_BOOM:
		case BLOOD_EARTH:
		case GROUND_ATTACK:
		case WHILWIND:
		case TWISTER:
		case LIGHTNING_EXTREME:
		case EARTH_EXTREME:
		case WIND_EXTREME:
			{
				nAttack = nAttack*m_pCaster->CorrectCombatAttack(nCaster, nResult)/100;
				break;
			}
		}
	}
	
	return nAttack;
}

int CCombat::CalcDefense(int nAttack) const
{
	int nPercent = 0;
	// 规绢仿 拌魂
	return m_pTarget->CalcPhysicalDefensivePower(nAttack, nPercent);
}

int CCombat::CalcDamage(BYTE nType, int nDamage) const
{ 
	const int nCaster = m_pCaster->GetActiveCombat();
	const int nTarget = m_pTarget->GetPassiveCombat();
	const int nResult = Relation(nCaster, nTarget);
	
	int nPercent = 0;
	
	if (!m_pCaster->IsStrikePiercing())
	{
		switch (nTarget)
		{
		case STONE_ARMOR:
			{
				if (m_pTarget->IsCount())
				{
					const int nCount = m_pTarget->DecCombatCount();
					m_pTarget->SendCharInfoBasic(BP, nCount);//020704 lsw
					return 0;
				}
				else
				{	//< CSD-TW-030623 : 傈捧胶懦 檬扁拳
					m_pTarget->InitActiveCombat();
					m_pTarget->ClearActiveState();
					// 包访 Packet 傈价  
					t_packet packet;
					packet.h.header.type = CMD_COMBAT_INIT;
					packet.h.header.size = sizeof(t_combat_init);
					packet.u.combat.combat_init.idMaster = m_idTarget;
					packet.u.combat.combat_init.nType = 0;
					::QueuePacket(connections, m_idTarget, &packet, 1);
				}	//>	 CSD-TW-030623
				
				break;
			}
		}
		// 付过俊 狼茄 单固瘤 焊沥
		switch (nType)
		{	//< CSD-030723
		case WR_SHORT:  m_pTarget->CorrectShortDamage(nDamage, nPercent);  break;
		case WR_MIDDLE: m_pTarget->CorrectMiddleDamage(nDamage, nPercent); break;
		case WR_LONG1:
		case WR_LONG2:  m_pTarget->CorrectLongDamage(nDamage, nPercent);   break;
		}	//> CSD-030723
	}
	
	return nDamage;
}

void CCombat::Correct(BYTE nType, int& rDamage)
{ 
	// 酒捞袍 加己俊 狼茄 焊沥
	RareEM.CorrectByStaticRare(m_pCaster, m_pTarget,rDamage); //020303 lsw
	// 努贰胶俊 措茄 焊沥
	if (m_pCaster->IsPlayer())
	{ //< CSD-021024
		rDamage = rDamage*RATE_BY_CLASS[m_pCaster->Class][nType]/100;
	} //> CSD-021024
	// 芭府俊 措茄 焊沥
	const int nDistance = ::getDistance(m_pCaster, m_pTarget);
	m_pCaster->CorrectStrikeRange(nDistance, rDamage);
	// 臭撤捞俊 蝶弗 焊沥
	const int nX = m_pTarget->MoveSx; 
	const int nY = m_pTarget->MoveSy;
	m_pCaster->CorrectRiseFall(0, nX, nY, rDamage);
	// 空捞唱 墨款伎矾俊 措茄 焊沥
	if (m_pCaster->name_status.nation == m_pTarget->name_status.nation)
	{	
		if (m_pTarget->name_status.king || m_pTarget->IsCounselor())  
		{
			rDamage /= 30;
		}
	}
	else 
	{
		if (m_pTarget->IsCounselor())
		{
			rDamage /= 30;
		}
	}
}

bool CCombat::Result(int nDamage, bool bAni)
{
	BYTE nResult = HIT_FAILED;
	
	if (nDamage <= 0)
	{ 
		nDamage = 0;
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 籍拳俊 吧妨乐栏搁 绢栋茄 拱府利 单捞瘤档 罐瘤 给窃
	if (m_pTarget->IsStone())
	{		
		nDamage = 0;
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 父距 傍拜阑 罐栏搁 磊府俊 肛眠霸 窃
	if (m_pTarget->IsNpc())
	{ 
		m_pTarget->MoveLength = m_pTarget->MovePathCount = 0;
	}
	// 父距 ROOKIE_LEVEL 捞窍捞搁 捣捞 唱坷霸 窃
	if (m_pCaster->IsPlayer() && m_pTarget->IsNpc())
	{
		if (m_pCaster->GetLevel() <= ROOKIE_LEVEL && m_pTarget->Race == DUMMY)
		{	//< CSD-030806
			if (!(rand()%10)) 
			{
				ItemAttr item = {0,};
				if(LocalMgr.IsChangeMoney())//030102 lsw
				{
					item = ::GenerateItem(IN_NEW_COINS, IATTR_MUCH, rand()%6 +10);
				}
				else
				{
					item = ::GenerateItem(IN_COINS, IATTR_MUCH , rand()%6 + 10);
				}
				::AddItemList(item.item_no, item.attr, 0, 
					m_pCaster->X + rand()%TILE_SIZE, m_pCaster->Y + rand()%TILE_SIZE, 0, 0);
			}
		}	//> CSD-030806
	}
	// 规绢备狼 郴备档 皑家
	::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo,false);//020401 lsw
	::HungryMuchAdd(m_pCaster, HT_ATTACK);
	
	if (m_pTarget->IsNpc())
	{
		switch (m_pTarget->Race)
		{
		case DUMMY:
			{	//< CSD-030806
				if (m_pCaster->GetLevel() <= ENABLE_DUMMY_LEVEL)
				{	// 版氰摹啊 10 捞窍搁辑 歹固甫 傍拜茄 版快父 版氰摹 惑铰  
					const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
					const int nTemp = (rand()%10 < 3) ? 3:4; // 老馆 版氰摹俊辑 琶平 版氰摹肺 函券惑荐
					m_pCaster->ChangeUpTacExp(0, nExp*nTemp);
				}	
				
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}	//> CSD-030806
		case SEALSTONE:
			{
				m_pTarget->DecLife(nDamage);
				g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
				break;
			}
		case GUARDSTONE:
			{
				if (::IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
				{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
					m_pTarget->DecLife(nDamage);
				}
				else
				{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
					nDamage = 0;
					nResult = HIT_AND_NOTDEAD;
					goto SEND;
				}
				
				break;
			}
		case ORC_DUMMY:
			{
				m_pCaster->ChangeUpTacExp(1, nDamage*3);
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		case LIFELESS:
			{
				nDamage = 0;
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		default:
			{
				m_pTarget->DecLife(nDamage);
				break;
			}
		}
	}
	else
	{
		m_pTarget->DecLife(nDamage);
	}
	
	if (m_pTarget->IsDead())
	{					
		const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_DEAD, nDamage);
		m_pCaster->ChangeUpTacExp(0, nExp*3);
		
		::KillWho(m_pTarget, m_pCaster);
		// NK俊 拌魂
		if(LocalMgr.IsAbleNation(TAIWAN))//030102 lsw Local
		{
			if (m_pCaster->IsTamedNpc())
			{
				::CheckNK(m_pCaster->GetMaster(), m_idTarget, NK_TYPE_KILL_);
			}
			else
			{
				::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);		
			}
		}
		else
		{
			::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);
		}
		
		if (m_pTarget->IsNpc())
		{	//< CSD-030306
			m_pTarget->m_xSummon.Remove(KillMonster);
		}	//> CSD-030306
		// 020813 YGI 
		::killCharacter(m_pCaster, m_pTarget);
		nResult = HIT_AND_DEAD;				
		
		goto SEND;
	}				
	else // 磷瘤 臼篮 版快
	{		
		const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
		m_pCaster->ChangeUpTacExp(0, nExp*3);
		
		if (m_pTarget->Race == SEALSTONE)
		{
			if (++m_pTarget->sealstone%50 == 0)
			{
				::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
			}
		}
		
		if (!m_pCaster->IsTamedNpc())
		{
			m_pTarget->ChangeUpTacExp(4, m_pCaster->GetLevel()*2); // CSD-030806

			if( m_pTarget != m_pCaster ) // 030430 kyo //磊扁磊脚俊 包茄 老老锭绰 pk甫 救棵赴促.
			{
				::CheckNK(m_idCaster, m_idTarget, NK_TYPE_NO_KILL_);
			}
		}
		
		nResult = HIT_AND_NOTDEAD;
		goto SEND;
	}
	
SEND:
	if (m_pCaster->IsPlayer())  
	{
		::SaveBallancing(m_pCaster, m_pTarget, 0, nDamage, 0, 0, 0, 0);
	}
	
	if (m_pCaster->IsPlayer())
	{
		memset(&m_packet, 0, sizeof(t_packet));
		m_packet.h.header.type = CMD_COMBAT_RESULT_H;
		m_packet.h.header.size = sizeof(t_server_combat_result_h);
		m_packet.u.combat.server_combat_result_h.nSkill = m_nIndex;
		m_packet.u.combat.server_combat_result_h.idTarget = m_idTarget;
		m_packet.u.combat.server_combat_result_h.nResult= nResult;
		m_packet.u.combat.server_combat_result_h.nState = m_pTarget->GetState();
		m_packet.u.combat.server_combat_result_h.nLife = -nDamage;
		m_packet.u.combat.server_combat_result_h.bChangeAni = bAni; // 030415 kyo
		::QueuePacket(connections, m_idCaster, &m_packet, 1);
		::CastMe2Other(m_idCaster, &m_packet);
		return true;
	}
	else
	{
		memset(&m_packet, 0, sizeof(t_packet));
		m_packet.h.header.type = CMD_COMBAT_RESULT_H;
		m_packet.h.header.size = sizeof(t_server_combat_result_h);
		m_packet.u.combat.server_combat_result_h.nSkill = m_nIndex;
		m_packet.u.combat.server_combat_result_h.idTarget = m_idTarget;
		m_packet.u.combat.server_combat_result_h.nResult= nResult;
		m_packet.u.combat.server_combat_result_h.nState = m_pTarget->GetState();
		m_packet.u.combat.server_combat_result_h.nLife = -nDamage;
		m_packet.u.combat.server_combat_result_h.bChangeAni = bAni; // 030415 kyo
		::CastNPC2Other(m_idCaster - 10000, &m_packet);
		return true;
	}
	
	return false;
}

⌨️ 快捷键说明

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