📄 battlesystem.cpp
字号:
if (pMonster->IsEudemon())
pUser = pTarget->QueryOwnerUser();
}
}
if (pUser)
{
CTeam* pTeam = pUser->GetTeam();
if (pTeam)
{
nPower = pTeam->ShareDamage(nPower, pTarget->GetID());
}
}
}
}
return nPower;
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcAttackPower(IRole* pAtker, IRole* pTarget, int* pAdjustAtk/*=0*/, int* pAdjustDef/*=0*/)
{
CHECKF(pAtker && pTarget);
// super man status
// IStatus* pSuperMan = pAtker->QueryStatus(STATUS_SUPERMAN);
// get user
CUser* pUser = NULL;
pAtker->QueryObj(OBJ_USER, IPP_OF(pUser));
// attack
int nMaxRand = 50 + pAtker->GetLuck();
int nAtk = 0;
if(::RandGet(100) < nMaxRand)
nAtk = pAtker->GetMaxAtk() - ::RandGet((pAtker->GetMaxAtk()-pAtker->GetMinAtk()) / 2);
else
nAtk = pAtker->GetMinAtk() + ::RandGet((pAtker->GetMaxAtk()-pAtker->GetMinAtk()) / 2);
if (pUser)
{
#ifdef _DEBUG
pUser->SendSysMsg(_TXTATR_NORMAL, "atk org value: %d", nAtk);
#endif
}
nAtk = pAtker->AdjustAttack(nAtk);
if(pAdjustAtk)
{
if(*pAdjustAtk)
nAtk = ::CutTrail(0, CRole::AdjustDataEx(nAtk, *pAdjustAtk));
*pAdjustAtk = nAtk;
}
// defence
int nRawDef = pTarget->GetDef();
#ifdef _DEBUG
if (pUser)
pUser->SendSysMsg(_TXTATR_NORMAL, "target row def: +%d", nRawDef);
#endif
int nDef = pTarget->AdjustDefence(nRawDef);
if(pAtker->IsBowman())
nDef = pTarget->AdjustBowDefence(nDef);
#ifdef PALED_DEBUG
// if(pSuperMan && pAtker->IsPM())
// {
// nAtk = pTarget->GetLife();
// pAtker->SendSysMsg("==========必杀===========");
// }
#endif
if(pAdjustDef)
{
if(*pAdjustDef)
nDef = ::CutTrail(0, CRole::AdjustDataEx(nDef, *pAdjustDef));
*pAdjustDef = nDef;
}
// if(pSuperMan)
// {
// nDef /= 2;
//#ifdef _DEBUG
// if (pUser)
// pUser->SendSysMsg(_TXTATR_NORMAL, "target def decrease to 1/2 for superman status, def=%d", nDef);
//#endif
// }
// damage
int nDamage = nAtk - nDef;
if (pAtker->QueryOwnerUser() && pTarget->IsMonster())
{
CMonster* pMonster;
if(pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)) && !pMonster->IsEquality())
nDamage = CBattleSystem::CalcDamageUser2Monster(nAtk, nDef, pAtker->GetLev(), pTarget->GetLev());
nDamage = pTarget->AdjustWeaponDamage(nDamage);
nDamage = CBattleSystem::AdjustMinDamageUser2Monster(nDamage, pAtker, pTarget);
}
else if(pAtker->IsMonster() && pTarget->QueryOwnerUser())
{
CMonster* pMonster;
if(pAtker->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)) && !pMonster->IsEquality())
nDamage = CBattleSystem::CalcDamageMonster2User(nAtk, nDef, pAtker->GetLev(), pTarget->GetLev());
nDamage = pTarget->AdjustWeaponDamage(nDamage);
nDamage = CBattleSystem::AdjustMinDamageMonster2User(nDamage, pAtker, pTarget);
}
else
{
nDamage = pTarget->AdjustWeaponDamage(nDamage);
}
return ::CutTrail(0, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustMinDamageUser2Monster(int nDamage, IRole* pAtker, IRole* pTarget)
{
int nMinDamage = 1;
nMinDamage += pAtker->GetLev() / 10;
CUser* pUser;
if(!pAtker->QueryObj(OBJ_USER, IPP_OF(pUser)))
return ::CutTrail(nMinDamage, nDamage);
CItem* pItem = pUser->GetWeaponR();
if(pItem)
{
nMinDamage += pItem->GetQuality();
}
return ::CutTrail(nMinDamage, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustMinDamageMonster2User(int nDamage, IRole* pAtker, IRole* pTarget)
{
int nMinDamage = 7;
if(nDamage >= nMinDamage || pTarget->GetLev() <= 15)
return nDamage;
CUser* pUser;
if(!pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
return ::CutTrail(nMinDamage, nDamage);
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
switch(i)
{
case ITEMPOSITION_HELMET:
case ITEMPOSITION_NECKLACE:
case ITEMPOSITION_ARMOR:
{
CItem* pItem = pUser->GetEquipItemByPos(i);
if(pItem)
{
nMinDamage -= pItem->GetQuality() / 5;
}
}
break;
}
}
nMinDamage = ::CutTrail(1, nMinDamage);
return ::CutTrail(nMinDamage, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcDamageUser2Monster(int nAtk, int nDef, int nAtkLev, int nDefLev)
{
if(nAtkLev > 120)
nAtkLev = 120;
int nDamage = nAtk-nDef;
if (CMonster::GetNameType(nAtkLev, nDefLev) != NAME_GREEN)
return ::CutTrail(0, nDamage);
int nDeltaLev = nAtkLev - nDefLev;
if (nDeltaLev >= 3 && nDeltaLev <= 5)
nAtk *= 1.5;
else if (nDeltaLev > 5 && nDeltaLev <= 10)
nAtk *= 2;
else if (nDeltaLev > 10 && nDeltaLev <= 20)
nAtk *= 2.5;
else if (nDeltaLev > 20)
nAtk *= 3;
return ::CutTrail(0, nAtk-nDef);
// if(nAtkLev - nDefLev > 0)
// {
// int nDeltaLev = nAtkLev - nDefLev;
// if(1<nAtkLev && nAtkLev<=19)
// {
// if(nDeltaLev<3)
// nDamage=nAtk-nDef;
// else if(3 <= nDeltaLev && nDeltaLev < 6)
// nDamage=nAtk*1.2-nDef;
// else
// nDamage=nAtk*1.5-nDef;
// }
// else if(19<nAtkLev && nAtkLev<=49)
// {
// if(nDeltaLev<5)
// nDamage=nAtk-nDef;
// else if(5 <= nDeltaLev && nDeltaLev < 10)
// nDamage=nAtk*1.2-nDef;
// else
// nDamage=nAtk*1.5-nDef;
// }
// else if(49<nAtkLev && nAtkLev<=85)
// {
// if(nDeltaLev<4)
// nDamage=nAtk-nDef;
// else if(4 <= nDeltaLev && nDeltaLev < 8)
// nDamage=nAtk*1.2-nDef;
// else
// nDamage=nAtk*1.5-nDef;
// }
// else if(85<nAtkLev && nAtkLev<=112)
// {
// if(nDeltaLev<3)
// nDamage=nAtk-nDef;
// else if(3 <= nDeltaLev && nDeltaLev < 6)
// nDamage=nAtk*1.2-nDef;
// else
// nDamage=nAtk*1.5-nDef;
// }
// else if(112<nAtkLev && nAtkLev<=120)
// {
// if(nDeltaLev<2)
// nDamage=nAtk-nDef;
// else if(2 <= nDeltaLev && nDeltaLev < 4)
// nDamage=nAtk*1.2-nDef;
// else
// nDamage=nAtk*1.5-nDef;
// }
// }
// else
// {
// nDamage=nAtk-nDef;
// }
//
// return ::CutTrail(0, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcDamageMonster2User(int nAtk, int nDef, int nAtkLev, int nDefLev)
{
if(nAtkLev > 120)
nAtkLev = 120;
int nDamage = nAtk-nDef;
int nNameType = CMonster::GetNameType(nDefLev, nAtkLev);
if (nNameType == NAME_RED)
{
nDamage = nAtk*1.5 - nDef;
}
else if (nNameType == NAME_BLACK)
{
int nDeltaLev = nDefLev - nAtkLev;
if (nDeltaLev >= -10 && nDeltaLev <= -5)
nAtk *= 2;
else if (nDeltaLev >= -20 && nDeltaLev < -10)
nAtk *= 3.5;
else if (nDeltaLev < -20)
nAtk *= 5;
nDamage = nAtk - nDef;
}
// if(nAtkLev - nDefLev > 0)
// {
// int nDeltaLev = nDefLev-nAtkLev;
// if(1<nAtkLev && nAtkLev<=19)
// {
// if(nDeltaLev<3)
// nDamage=nAtk-nDef;
// else if(3 <= nDeltaLev && nDeltaLev < 6)
// nDamage=nAtk+14-nDef;
// else
// nDamage=nAtk+14*2-nDef;
// }
// else if(19<nAtkLev && nAtkLev<=49)
// {
// if(nDeltaLev<5)
// nDamage=nAtk-nDef;
// else if(5 <= nDeltaLev && nDeltaLev < 10)
// nDamage=nAtk+50-nDef;
// else
// nDamage=nAtk+50*2-nDef;
// }
// else if(49<nAtkLev && nAtkLev<=85)
// {
// if(nDeltaLev<4)
// nDamage=nAtk-nDef;
// else if(4 <= nDeltaLev && nDeltaLev < 8)
// nDamage=nAtk+96-nDef;
// else
// nDamage=nAtk+96*2-nDef;
// }
// else if(85<nAtkLev && nAtkLev<=112)
// {
// if(nDeltaLev<3)
// nDamage=nAtk-nDef;
// else if(3 <= nDeltaLev && nDeltaLev < 6)
// nDamage=nAtk+140-nDef;
// else
// nDamage=nAtk+140*2-nDef;
// }
// else if(112<nAtkLev && nAtkLev<=120)
// {
// if(nDeltaLev<2)
// nDamage=nAtk-nDef;
// else if(2 <= nDeltaLev && nDeltaLev < 4)
// nDamage=nAtk+165-nDef;
// else
// nDamage=nAtk+165*2-nDef;
// }
// }
// else
// {
// nDamage=nAtk-nDef;
// }
return ::CutTrail(0, nDamage);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustExp(int nDamage, int nAtkLev, int nDefLev)
{
if(nAtkLev > 120)
nAtkLev = 120;
int nExp = nDamage;
int nNameType = CMonster::GetNameType(nAtkLev, nDefLev);
int nDeltaLev = nAtkLev - nDefLev;
if (nNameType == NAME_GREEN)
{
if (nDeltaLev >= 3 && nDeltaLev <= 5)
nExp = nExp * 70 / 100;
else if (nDeltaLev > 5 && nDeltaLev <= 10)
nExp = nExp * 20 / 100;
else if (nDeltaLev > 10 && nDeltaLev <= 20)
nExp = nExp * 10 / 100;
else if (nDeltaLev > 20)
nExp = nExp * 5 / 100;
}
else if (nNameType == NAME_RED)
{
nExp *= 1.3;
}
else if (nNameType == NAME_BLACK)
{
if (nDeltaLev >= -10 && nDeltaLev < -5)
nExp *= 1.5;
else if (nDeltaLev >= -20 && nDeltaLev < -10)
nExp *= 1.8;
else if (nDeltaLev < -20)
nExp *= 2.3;
}
return ::CutTrail(0, nExp);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::AdjustDrop(int nDrop, int nAtkLev, int nDefLev)
{
if(nAtkLev > 120)
nAtkLev = 120;
if(nAtkLev - nDefLev > 0)
{
int nDeltaLev = nAtkLev - nDefLev;
if(1<nAtkLev && nAtkLev<=19)
{
if(nDeltaLev<3)
;
else if(3 <= nDeltaLev && nDeltaLev < 6)
nDrop=nDrop/5;
else
nDrop=nDrop/10;
}
else if(19<nAtkLev && nAtkLev<=49)
{
if(nDeltaLev<5)
;
else if(5 <= nDeltaLev && nDeltaLev < 10)
nDrop=nDrop/5;
else
nDrop=nDrop/10;
}
else if(49<nAtkLev && nAtkLev<=85)
{
if(nDeltaLev<4)
;
else if(4 <= nDeltaLev && nDeltaLev < 8)
nDrop=nDrop/5;
else
nDrop=nDrop/10;
}
else if(85<nAtkLev && nAtkLev<=112)
{
if(nDeltaLev<3)
;
else if(3 <= nDeltaLev && nDeltaLev < 6)
nDrop=nDrop/5;
else
nDrop=nDrop/10;
}
else if(112<nAtkLev && nAtkLev<=120)
{
if(nDeltaLev<2)
;
else if(2 <= nDeltaLev && nDeltaLev < 4)
nDrop=nDrop/5;
else
nDrop=nDrop/10;
}
}
return ::CutTrail(0, nDrop);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -