📄 attackmagic.cpp
字号:
{ // [191]拳脚狼 盒畴
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::RageLightBall()
{ // [192]己飞狼 盒畴
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::ShadowOfEvil()
{ // [98]厩狼 弊覆磊
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::BooldSprinkle()
{ // [108]乔谎府扁
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::FlameArrow()
{ // [110] 拳堪拳混
//< CSD-031020
const int nHD = CalcHitDice();
return AttackMagic(nHD);
} //> CSD-031020
bool CAttackMagic::AreaBatAttack()
{ // [114]瘤开 冠零傍拜
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::SnowStorm() // 030415 kyo
{ // [59]传焊扼狼 气浅
const int nHD = CalcHitDice();
if (rand()%100 < g_CSymbolMgr.GetSymbolGrade(m_pCaster))
{ //< CSD-030519
SetFrozen(5);
} //> CSD-030519
return AttackMagic(nHD);
}
bool CAttackMagic::IceBreath2()// 030415 kyo
{ // [60]酒捞胶宏饭胶2
const int nHD = CalcHitDice();
if (rand()%100 < g_CSymbolMgr.GetSymbolGrade(m_pCaster))
{
SetFrozen(5);
}
return AttackMagic(nHD);
}
bool CAttackMagic::BloodLightning()// 030415 kyo
{ // [60]喉矾靛扼捞飘醋
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
bool CAttackMagic::AuthorityOfWhoarencha() // 030415 kyo
{ // [187]拳罚鸥狼 鼻瓷
const int nHD = CalcHitDice();
return AttackMagic(nHD);
}
///////////////////////////////////////////////////////////////////////////////
// Protected Method
///////////////////////////////////////////////////////////////////////////////
void CAttackMagic::SetFrozen(int nPeriod)
{
if (m_pTarget->IsNpc())
{
switch (m_pTarget->Race)
{
case DUMMY:
case HUMAN:
case GUARD:
case GUARDSTONE:
case SEALSTONE: return;
}
}
m_pTarget->speedDown.SetState(m_dwNow + nPeriod, 70);
m_pTarget->ApplyCurse(6, CON_FROZEN, m_dwNow + nPeriod);
}
bool CAttackMagic::AttackMagic(int nHD)
{
const int nAttack = CalcAttack(nHD);
const int nDefense = CalcDefense(nAttack);
int nDamage = nAttack - nDefense;
switch (m_nIndex)
{
case FIRE_ARROW:
case ICE_ARROW:
{
const int nStrike = ((m_pTarget->IsIgnorePhysicalAttack()) ? 0:m_pCaster->GetLongAttack());
const int nAmplify = m_pCaster->GetMagicAmplify();
const int nAttack = m_pCaster->CalcPhysicalStrikingPower(nStrike + nAmplify);
const int nDefence = m_pTarget->CalcPhysicalDefensivePower(nAttack);
// 醚 单固瘤 拌魂(荐沥夸噶 - 1.4硅 力芭)
int nPhysical = (nAttack - nDefence)*1.4;
// 付过俊 狼茄 厘芭府 公扁俊 狼茄 规绢仿 焊沥
if (!m_pCaster->IsIgnorePhysicalDefence())
{
m_pTarget->CorrectLongDamage(nPhysical);
}
// 付过俊 狼茄 单固瘤 + 劝狼 拱府利 单固瘤
nDamage = (nDamage>>1) + nPhysical;
break;
}
}
// 傍拜 付过俊 狼茄 单固瘤 拌魂
const int nType = GetResistType(m_nIndex);
nDamage = CalcDamage(nType, nDamage);
// 阿辆焊沥
Correct(nDamage);
// 规绢备狼 郴备档 皑家
::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
if (m_pTarget->IsNpc()) // LTS AI
{
if (m_pTarget->ChairNum) // 辑滚 AI捞搁 // LTS AI2
{
if (m_pTarget->patterntype>=NPC_PATTERN_WANDER&&m_pTarget->patterntype<NPC_PATTERN_BOSS_WANDER) // LTS DRAGON MODIFY
{
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);
}
///////////////////////////////////////////////////////////////////////////////
// Private Method
///////////////////////////////////////////////////////////////////////////////
void CAttackMagic::Correct(int& rDamage)
{
// 酒捞袍 加己俊 狼茄 焊沥
if (RareEM.GetDynamicRareValue(FITEM_INVALID_OFFENCE, m_pTarget->DynamicRare))
{
rDamage = 0;
return;
}
// 加己 汲沥
if (m_pCaster->IsPlayer())
{
m_pCaster->AutoAttribute();
}
// 臭撤捞俊 蝶弗 焊沥
const BYTE nRiseFall = GetRiseFall(m_nIndex);
const int nX = m_pTarget->MoveSx;
const int nY = m_pTarget->MoveSy;
m_pCaster->CorrectRiseFall(nRiseFall, nX, nY, rDamage);
// 芭府俊 蝶弗 焊沥
const int nDistance = ::getDistance(m_pCaster, m_pTarget);
m_pCaster->CorrectMagicRange(nDistance, rDamage);
// 空捞唱 款康磊俊 措茄 焊沥
if (m_pCaster->name_status.nation == m_pTarget->name_status.nation )
{
if (m_pCaster->name_status.king || m_pTarget->IsCounselor())
{
rDamage /= 30;
}
}
else
{
if (m_pCaster->IsCounselor())
{
rDamage /= 30;
}
}
}
bool CAttackMagic::Result(int nDamage)
{
BYTE nResult = HIT_FAILED, nState = CON_NORMAL;
int nMana = 0;
if (nDamage <= 0 || IsMiss())
{
nDamage = 0;
nState = m_pTarget->GetState();
nResult = HIT_FAILED;
goto SEND;
}
// 籍拳俊 吧妨乐栏搁 绢栋茄 傍拜 付过狼 单固瘤甫 罐瘤 给窃
if (m_pTarget->IsStone())
{
nDamage = 0;
nState = m_pTarget->GetState();
nResult = HIT_FAILED;
goto SEND;
}
// 付过 公瓤拳俊 措茄 焊沥
if (!m_pCaster->IsMagicPiercing() && m_pTarget->dwMagicDamageToMana > 0)
{
const int nMinus = GetExhaustMana(m_nIndex);
if (m_pTarget->Mana - nMinus >= 0)
{
m_pTarget->DecMana(nMinus);
nDamage = 0;
nMana = nMinus;
nState = m_pTarget->GetState();
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
else
{
m_pTarget->dwMagicDamageToMana = 0;
nMana = 0;
}
}
// NPC 辆幅俊 蝶弗 焊沥
if (m_pTarget->IsNpc())
{
nDamage /= 1.4;
switch (m_pTarget->Race)
{
case DUMMY:
{
break;
}
case SEALSTONE:
{
m_pTarget->DecLife(nDamage);
g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
break;
}
case GUARDSTONE:
//case CASTLEGATEWAY:
//case WARARMS:
{
if (IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
m_pTarget->DecLife(nDamage);
}
else
{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
nDamage = 0;
nState = m_pTarget->GetState();
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
break;
}
case ORC_DUMMY:
{
::AddCasterEXP(m_pCaster, m_pTarget, 2, 1, m_nIndex, abs(nDamage));
nState = m_pTarget->GetState();
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
case LIFELESS:
{
nDamage = 0;
nState = m_pTarget->GetState();
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
default:
{
m_pTarget->DecLife(nDamage);
break;
}
}
}
else
{
m_pTarget->DecLife(nDamage);
}
// 磷菌绰瘤 八荤
if (m_pTarget->IsDead())
{
::AddCasterEXP(m_pCaster, m_pTarget, 1, 1, m_nIndex, abs(nDamage));
::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())
{
m_pTarget->m_xSummon.Remove(KillMonster);
}
// 020813 YGI
::killCharacter(m_pCaster, m_pTarget);
nState = CON_DEATH;
nResult = HIT_AND_DEAD;
}
else
{
if (m_pTarget->Race == SEALSTONE)
{
if (++m_pTarget->sealstone%50 == 0)
{
::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
}
}
if (!m_pCaster->IsTamedNpc())
{
::AddCasterEXP(m_pCaster, m_pTarget, 2, 1, m_nIndex, abs(nDamage));
::CheckNK(m_idCaster, m_idTarget, NK_TYPE_NO_KILL_);
}
nState = m_pTarget->GetState();
nResult = HIT_AND_NOTDEAD;
}
SEND:
// 搬苞蔼阑 措惑磊俊霸 Packet栏肺 焊郴扁
InitMagicResult(CMD_MAGIC_RESULT_M);
m_packet.u.magic.server_magic_result_m.nMagic = m_nIndex;
m_packet.u.magic.server_magic_result_m.idTarget = m_idTarget;
m_packet.u.magic.server_magic_result_m.nLife = -nDamage;
m_packet.u.magic.server_magic_result_m.nMana = -nMana;
m_packet.u.magic.server_magic_result_m.nState = nState;
m_packet.u.magic.server_magic_result_m.nResult = nResult;
SendMagicResult();
if (!m_pCaster->IsNpc() && m_pTarget->IsMagicReflect())
{
if (rand()%101 <= 20)
{
const int nReal = m_pCaster->DecLife(nDamage*0.3, 10);
if (nReal > 0)
{
SendBattleDamage(m_idCaster, 0, -nReal);
}
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -