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