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

📄 battlemgr.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// BattleMgr.cpp: implementation of the CBattleMgr class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BattleMgr.h"

#include <algorithm>
#include "MouseCursor.h"
#include "Char.h"
#include "CharDataTable.h"
#include "Map.h"
#include "Effect.h"
#include "TeamBattle.h"
#include "Skill_lsw.h"
#include "gameproc.h"
#include "DirectSound.h"
#include "Menu.h"
#include "SmallMenu.h"
#include "StrikeSys.h"
#include "MagicSys.h"
#include "CombatSys.h"
#include "LineCommand.h"
#include "CharDataTable.h"
#include "NumberAniMgr.h"
using namespace battle;

extern int g_LocalWarBegin;
extern int g_CurrCharStatus;
extern void PrintMagicExplain(int magic_no);
extern BOOL ChangeDirection(DIRECTION* direction, int sx, int sy, int dx, int dy);
extern int AttackAction(LPCHARACTER lpCharacter);
extern void CheckNPCPk(int aid, int did);
extern int AttackRangeTable[2][CHARACTER_ACCESSORY_MAX_][10];
extern int GetLeveByExp(int nStep, DWORD exp);
extern void SkillSettingClear();
extern void SendModifyPositionNPC(int id);
extern int UseItemByRbutton(POS pos_s, ItemAttr &item_attr);
///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////

CBattleMgr g_mgrBattle;

CStrikeSys* GetStrike()
{
	return (CStrikeSys*)(g_mgrBattle.GetBattle(0));
}

CMagicSys* GetMagic()
{
	return (CMagicSys*)(g_mgrBattle.GetBattle(1));
}

CCombatSys* GetCombat()
{
	return (CCombatSys*)(g_mgrBattle.GetBattle(2));
}

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

CBattleMgr::CBattleMgr()
{
	Clear();
}

CBattleMgr::~CBattleMgr()
{
	for_each(m_vtBuffer.begin(), m_vtBuffer.end(), Delete());
}

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

void CBattleMgr::Clear()
{	//< CSD-TW-030624
	ClearDelay();
	ClearSwitchDelay();

	m_vtBuffer.reserve(3);
	m_vtBuffer.push_back(new CStrikeSys);
	m_vtBuffer.push_back(new CMagicSys);
	m_vtBuffer.push_back(new CCombatSys);
	m_bDisplay = true;
}	//> CSD-TW-030624

void CBattleMgr::ClearDelay()
{
	m_dwDelay = 0;
}

void CBattleMgr::ClearSwitchDelay()
{	//< CSD-TW-030624
	m_dwSwitchDelay = 0;
}	//> CSD-TW-030624

int CBattleMgr::Convert(int nKind)
{
	switch (SCharacterData.nCharacterData[SPELL])
	{
	case WIZARD_SPELL:               break; // 付过荤牢 版快
	case PRIEST_SPELL: nKind += 150; break; // 己流磊牢 版快
	}
	
	return nKind;
}

int CBattleMgr::Return(int nEffect, LPCHARACTER pCaster)
{
	switch (pCaster->sprno)
	{ 
    case 0:
    case 1:
		{
			if (nEffect < 500)
			{
				switch (pCaster->spell)
				{
				case WIZARD_SPELL:                 break; // 付过荤牢 版快
				case PRIEST_SPELL: nEffect -= 150; break; // 己流磊牢 版快
				}
			}
			else
			{
				nEffect -= 300;
			}
			
			break;
		}
	} 
	
	return nEffect;
}

int CBattleMgr::Action(LPCHARACTER pCaster)
{
	const int nResult = GetBattle(2)->Action(pCaster);
	return (nResult == ACTION_NONE) ? GetBattle(0)->Action(pCaster):nResult;
}

void CBattleMgr::Display(int nKind)
{
	if (m_bDisplay)
	{
		g_GameInfo.displayOption = nKind;
		g_GameInfo.displayOptionDelay = 15; 
	}
}

void CBattleMgr::Effect(MAGICLIST* pEffect)
{
	const int nIndex = GetIndex(pEffect->magicSerial);
	GetBattle(nIndex)->Effect(pEffect);
}

void CBattleMgr::Message(int nType, const char* pContext, ...)
{
	char szBuffer[1000];
	// 啊函牢磊蔼阑 滚欺俊 历厘
	va_list vaList;
	va_start(vaList, pContext);
	vsprintf(szBuffer, pContext, vaList);
	va_end(vaList);
	
	switch (nType)
	{
    case MK_NORMAL:	
		{ // 惑怕
			::AddCurrentStatusMessage(255, 180, 190, szBuffer);
			break;
		}
	case MK_WARNING:	
		{ // 角菩
			::AddCurrentStatusMessage(255, 40, 60, szBuffer);
			break;
		}
	case MK_SHORTAGE:	
		{	// 己傍
			::AddCurrentStatusMessage(150, 150, 255, szBuffer);
			break;
		}
	case MK_INFORMATION:	
		{ // 舅覆
			::AddCurrentStatusMessage(200, 200, 200, szBuffer);
			break;
		}    
	}
}

void CBattleMgr::ActAnimation(int nType, CHARACTER* pTarget)
{ 
	switch (pTarget->sprno)
	{ 
    case 0:
    case 1:
		{
			::CharDoAni(pTarget , pTarget->direction, nType);
			break;
		}
	}
}

void CBattleMgr::ActCasting(int nMagic, CHARACTER* pTarget)
{
	switch (pTarget->sprno)
	{ 
    case 0:
    case 1:
		{
			::CharDoAni(pTarget, pTarget->direction, ACTION_MAGIC_CASTING);
			break;
		}
    case 87: // 捞橇府飘
		{
			switch (nMagic) 
			{
			case FIRE_EXPLOSION: // 颇捞绢 喉贰胶飘
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_MAGIC);
					break;
				}
			default:
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_MAGIC);
					break;
				}
			}
		}
    case 88: // 喉府明
		{
			switch (nMagic) 
			{
			case BLITZ_SPEAR: // 锅俺芒
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_ATTACK);
					break;
				}
			default:
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_MAGIC);
					break;
				}
			}
			
			break;
		}
	case 26:
	case 126:
		{	//< CSD-031112 : 促农 技扼撬(咯)
			switch (nMagic) 
			{
			case FLAME_ARROW:
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_ATTACK);
					break;
				}
			default:
				{
					::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_MAGIC);
					break;
				}
			}
			
			break;
		}	//> CSD-031112
    default:
		{
			::CharDoAni(pTarget, pTarget->direction, MON1_BATTLE_MAGIC);
			break;
		}
	}
}

void CBattleMgr::SendPcAttack(LPCHARACTER pCaster, LPCHARACTER pTarget)
{	//< CSD-TW-030623
	if (pCaster->condition&CON_STONE)
	{
		return;
	}
	
	if (IsThrow())
	{	// 厘芭府 公扁牢 版快
		SendThrowAttack(pCaster, pTarget);
	}
	else
	{	// 窜吝芭府 公扁牢 版快
		SendStrikeAttack(pCaster, pTarget);
	}
}	//> CSD-TW-030623

void CBattleMgr::SendNpcAttack(LPCHARACTER pCaster, LPCHARACTER pTarget)
{
	t_packet packet;
	packet.h.header.type = CMD_NPC_ATTACK;
	packet.h.header.size = sizeof(t_npc_attack);
	packet.u.strike.npc_attack.idCaster = WORD(pCaster->id);
	packet.u.strike.npc_attack.idTarget = WORD(pTarget->id);	
	packet.u.strike.npc_attack.nX = pTarget->x;
	packet.u.strike.npc_attack.nY = pTarget->y;
	::QueuePacket(&packet, 1);
}

void CBattleMgr::SendNpcThrow(LPCHARACTER pCaster, LPCHARACTER pTarget)
{
	t_packet packet;
	packet.h.header.type = CMD_NPC_THROW;
	packet.h.header.size = sizeof(t_npc_throw);
	packet.u.strike.npc_attack.idCaster = WORD(pCaster->id);
	packet.u.strike.npc_attack.idTarget = WORD(pTarget->id);	
	packet.u.strike.npc_attack.nX = pTarget->x;
	packet.u.strike.npc_attack.nY = pTarget->y;
	::QueuePacket(&packet, 1);
}

void CBattleMgr::SendStrikeAttack(LPCHARACTER pCaster, LPCHARACTER pTarget)
{	
	if( !IsAttackAble( pTarget ) )
	{
		return;
	}
	
	if (pCaster->attackanimationON)
	{
		switch (g_GameInfo.nSelectedSpriteType)
		{
		case SPRITETYPE_ITEM:
		case SPRITETYPE_ON_THE_CEILING_CHAR:
		case SPRITETYPE_MONSTER:
		case SPRITETYPE_NPC:
		case SPRITETYPE_CHARACTER:
			{
				if (g_GameInfo.lpcharacter != Hero && Hero->peacests)
				{
					g_queue.lb	= 1;
					g_queue.x	= Mox;
					
					g_queue.y	= Moy;
					g_queue.ch	= g_GameInfo.lpcharacter;
				}
				
				break;
			}
		}
		
		return;
	}
	// 020428 YGI acer
	if( SCharacterData.attack_time == g_curr_time )
	{
		return;
	}
	else
	{
		SCharacterData.attack_time = g_curr_time;
	}
	
	pCaster->attackanimationON = 10;
	
	t_packet packet;
	packet.h.header.type = CMD_ATTACK;
	packet.h.header.size = sizeof(t_player_attack);
	packet.u.strike.player_attack.idTarget = WORD(pTarget->id);
	packet.u.strike.player_attack.bWanted = pTarget->hunter_target;
	::QueuePacket(&packet, 1);
}

void CBattleMgr::SendThrowAttack(LPCHARACTER pCaster, LPCHARACTER pTarget)
{	
	if (!IsAttackAble(pTarget))
	{
		return;
	}
	
	if (pCaster->attackanimationON)
	{
		switch (g_GameInfo.nSelectedSpriteType)
		{
		case SPRITETYPE_ITEM:
		case SPRITETYPE_ON_THE_CEILING_CHAR:
		case SPRITETYPE_MONSTER:
		case SPRITETYPE_NPC:
		case SPRITETYPE_CHARACTER:
			{
				if (g_GameInfo.lpcharacter != Hero && Hero->peacests)
				{
					g_queue.lb	= 1;
					g_queue.x	= Mox;
					
					g_queue.y	= Moy;
					g_queue.ch	= g_GameInfo.lpcharacter;
				}
				
				break;
			}
		}
		
		return;
	}
	
	switch (pCaster->nActiveCombat)
	{
    case FLEET_MISSILE:
    case MULTIPLE_FIRE:
    case FIRE_EXTREME:
    case ICING_BLAST:
    case ICE_EXTREME:
		{
			pCaster->nCurrentFrame = 0;
			pCaster->attackanimationON = 15;
			break;
		}
    case CONVERTING_ARMOR:
		{
			pCaster->nCurrentFrame = 0;
			pCaster->attackanimationON = 10;
			break;
		}
    case SHARK_MISSILE:
		{
			pCaster->nCurrentFrame = 0;
			
			switch (pCaster->nActiveLevel)
			{
			case 1:  pCaster->attackanimationON = 10;  break;
			case 2:  pCaster->attackanimationON = 8;   break;
			case 3:  pCaster->attackanimationON = 6;   break;
			default: pCaster->attackanimationON = 12;  break;
			}
			
			break;
		}
    default:
		{
			pCaster->nCurrentFrame = 0;
			pCaster->attackanimationON = 10;
			break;
		}
	}
	
	t_packet packet;
	packet.h.header.type = CMD_THROW_ATTACK;
	packet.h.header.size = sizeof(t_client_throw_attack);
	packet.u.strike.client_throw_attack.idTarget = WORD(pTarget->id);
	packet.u.strike.client_throw_attack.bWanted = pTarget->hunter_target;
	::QueuePacket(&packet, 1);
}

void CBattleMgr::SendNpcMagic(BYTE nMagic, LPCHARACTER pCaster, LPCHARACTER pTarget, int nX, int nY)
{
	::ChangeDirection(&pCaster->direction, pCaster->x, pCaster->y, pTarget->x, pTarget->y);
	pCaster->todir = pCaster->direction;
	// 付过 矫累 Packet 傈价
	t_packet packet;
	packet.h.header.type = CMD_NPC_MAGIC;
	packet.h.header.size = sizeof(t_client_npc_magic);
	packet.u.magic.client_npc_magic.nMagic = nMagic;
	packet.u.magic.client_npc_magic.idCaster = WORD(pCaster->id);
	packet.u.magic.client_npc_magic.idTarget = WORD(pTarget->id);
	packet.u.magic.client_npc_magic.nX = nX;
	packet.u.magic.client_npc_magic.nY = nY;
	::QueuePacket(&packet, 1);
}

void CBattleMgr::SendMagicSelect(BYTE nMagic)
{	//< CSD-030930
	if (!::TimeCheck(m_dwSwitchDelay))
	{
		OUTPUT(MK_INFORMATION, lan->OutputMessage(1, 69));
		return;
	}
	else
	{
		m_dwSwitchDelay = g_ClientTime + 1000;
	}

	if (!::IsSelectCombat())
	{	
		SendMagicCasting(nMagic);
		return;
	}
	// 傈捧胶懦捞 急琶等 惑怕扼搁
	t_packet packet;
	packet.h.header.type = CMD_MAGIC_SELECT;
	packet.h.header.size = sizeof(t_client_magic_select);
	packet.u.magic.client_magic_select.nMagic = nMagic;
	::QueuePacket(&packet, 1);
}	//> CSD-030930

void CBattleMgr::SendMagicCasting(BYTE nMagic)
{	//< CSD-TW-030606
	::PrintMagicExplain(nMagic);
	// 某胶泼捞 柳青 吝牢 版快
	if (!::TimeCheck(Hero->end_Casting)) 
	{
		OUTPUT(MK_INFORMATION, lan->OutputMessage(1, 3));
		return;
	}
	
	if (SCharacterData.nCharacterData[SPELL] && nMagic <= 150)  
	{	// 己流磊 付过老 版快 150阑 歹窃
		nMagic += 150;
	}

	if (!IsPlaceMagic(nMagic, Hero->x>>5, Hero->y>>5))
	{	//< CSD-040223
		OUTPUT(MK_WARNING, lan->OutputMessage(1, 4));
		return;
	}	//> CSD-040223
	// 瘤楷矫埃 檬扁拳
	ClearDelay();
	

⌨️ 快捷键说明

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