📄 battlemgr.cpp
字号:
// 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 + -