|
You last visited: Today at 09:34
Advertisement
[Question] Archer Attack Calculation
Discussion on [Question] Archer Attack Calculation within the CO2 Private Server forum part of the Conquer Online 2 category.
07/09/2014, 08:31
|
#1
|
elite*gold: 0
Join Date: Nov 2011
Posts: 150
Received Thanks: 11
|
[Question] Archer Attack Calculation
As the topic title says ... I would like to know how to attack Archer is calculated. It is the same as the others? How?
|
|
|
07/09/2014, 08:33
|
#2
|
elite*gold: 12
Join Date: Jul 2011
Posts: 8,282
Received Thanks: 4,191
|
|
|
|
07/09/2014, 13:35
|
#3
|
elite*gold: 0
Join Date: Jan 2008
Posts: 1,443
Received Thanks: 1,175
|
Quote:
Originally Posted by Spirited
|
Not all calculations are right in this source as it's another project. But it's a good start.
|
|
|
07/09/2014, 13:50
|
#4
|
elite*gold: 0
Join Date: Jul 2008
Posts: 874
Received Thanks: 238
|
Quote:
Originally Posted by Spirited
|
isn't this for eudemon?
aren't the calculation away different now?
good refrence anyway
PHP Code:
BOOL CBattleSystem::IsTargetDodged(IRole* pAtker, IRole* pTarget)
{
if (!pAtker || !pTarget)
return true;
// بç¹ûؤ؟±ê´¦سعؤ§·¨ت©ص¹ضذ£¬°ظ·ض°ظ¶م±ـ -- zlong 2004.5.12
if (pTarget->QueryMagic() && pTarget->QueryMagic()->IsInLaunch())
return true;
int nDodge = 0;
CUser* pTargetUser = NULL;
if (pTarget->QueryObj(OBJ_USER, IPP_OF(pTargetUser)))
{
nDodge = 40; // ±»¹¥»÷صكتابث£¬³ُت¼ةء±ـخھ40
}
int nHitRate = __min(100, __max(0, 100 + (int)pAtker->GetAtkHitRate() - nDodge - (int)pTarget->GetDdg()));
#ifdef _DEBUG
CUser* pAtkerUser = NULL;
pAtker->QueryObj(OBJ_USER, IPP_OF(pAtkerUser));
if (pAtkerUser)
pAtkerUser->SendSysMsg(_TXTATR_NORMAL, "HitRate: %d", nHitRate);
if (pTargetUser)
pTargetUser->SendSysMsg(_TXTATR_NORMAL, "Monster HitRate: %d", nHitRate);
#endif
return (::RandGet(100) >= nHitRate);
}
//////////////////////////////////////////////////////////////////////
int CBattleSystem::CalcPower(int nMagic, IRole* pAtker, IRole* pTarget, int* pAdjustAtk/*=0*/, bool bCanDodge/*=false*/)
{
int nPower = 0;
// bCanDodge==falseشٍ²»؟¼آا¶م±ـ ،ھ،ھ سأسعؤ§·¨¹¥»÷µؤت±؛ٍ¼ئثمةث؛¦£¬زٍخھ²ك»®زھاَؤ§·¨¹¥»÷½ِح¨¹percent¼ئثمأüضذآت
// bCanDodge==trueشٍ¼ئثم¶م±ـ ،ھ،ھ سأسعئصح¨¹¥»÷ت±¼ئثمةث؛¦
if (!(bCanDodge && CBattleSystem::IsTargetDodged(pAtker, pTarget)))
{
if(nMagic == MAGICTYPE_NONE)
{
nPower += CBattleSystem::CalcAttackPower(pAtker, pTarget, pAdjustAtk);
}
else
{
nPower += CMagic::CalcMagicPower(pAtker, pTarget, pAdjustAtk);
// XP¼¼ؤـ¶شحو¼زµؤةث؛¦خھ 2%
if (nMagic == MAGICTYPE_XPSKILL)
{
CUser* pUser = NULL;
if (pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
nPower /= 50;
}
}
}
if (nPower > 0)
{
CMonster* pMonster = NULL;
if (pAtker->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
{
nPower = pMonster->AdjustFrenzy2Dmg(nPower);
}
IStatus* pStatus = NULL;
// ¹¥»÷½ل½ç£¬شِ¼سةث؛¦
if (pStatus = pAtker->QueryStatus(STATUS_TEAMATTACK))
{
nPower += nPower*pStatus->GetPower()/100;
}
// ؟ٌ±©×´ج¬شِ¼سةث؛¦
if (pStatus = pAtker->QueryStatus(STATUS_FRENZY))
{
if (pAtker->GetLife()*100/pAtker->GetMaxLife() < 50)
nPower = ::MulDiv(nPower, 100+pStatus->GetPower(), 100);
}
// ةٌء¦×´ج¬
if (pStatus = pAtker->QueryStatus(STATUS_EXTRA_POWER))
{
int nMultiple = 2;
if (pTarget->IsMonster())
nMultiple = 10;
nPower *= nMultiple;
}
// µ÷صû¹¥»÷شى³ةµؤةث؛¦
if (pStatus = pAtker->QueryStatus(STATUS_ATKER_DAMAGE))
{
nPower = ::CutTrail(0, CRole::AdjustDataEx(nPower, pStatus->GetPower()));
}
// µ÷صû±»»÷شى³ةµؤةث؛¦
if (pStatus = pTarget->QueryStatus(STATUS_DAMAGE))
{
nPower = ::CutTrail(0, CRole::AdjustDataEx(nPower, pStatus->GetPower()));
}
// ا±ء¦ضµµؤس°دى
if (pAtker->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
{
// »أتقأ؟شِ/¼ُ1µما±ء¦ضµ£¬¶شµذبثةث؛¦شِ/¼ُ1%
int nOffset = pMonster->GetPotential() - DEFAULT_EUDEMON_POTENTIAL;
if (nOffset != 0)
nPower = ::MulDiv(nPower, 100 + nOffset, 100);
}
if (pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
{
// »أتقأ؟شِ/¼ُ1µما±ء¦ضµ£¬تـµ½µذبثµؤةث؛¦¼ُ/شِ1% ،ھ،ھ ¸ص؛أسëةدأودà·´
int nOffset = pMonster->GetPotential() - DEFAULT_EUDEMON_POTENTIAL;
if (nOffset != 0)
nPower = ::MulDiv(nPower, 100 - nOffset, 100);
}
// ؟ٌ±©×´ج¬¼ُةظةث؛¦
if (pStatus = pTarget->QueryStatus(STATUS_FRENZY))
{
if (pTarget->GetLife()*100/pTarget->GetMaxLife() < 50)
nPower -= __min(nPower, nPower*pStatus->GetPower()/100);
}
// »¤جه½ل½ç£¬¼ُةظةث؛¦
if (pStatus = pTarget->QueryStatus(STATUS_TEAMDEFENCE))
{
nPower = nPower*__max(0, 100-(int)pStatus->GetPower())/100;
}
// ؟ٌ±©×´ج¬»ل¸ؤ±نةث؛¦
if (pStatus = pAtker->QueryStatus(STATUS_TRUCULENCE))
{
int nPercent = 150;
nPercent -= (pAtker->GetMaxLife()-pAtker->GetLife())*100 / pAtker->GetMaxLife();
nPower = MulDiv(nPower, nPercent, 100);
}
// ½ل½çدµح³µؤةث؛¦×ھزئ
if (pStatus = pTarget->QueryStatus(STATUS_TEAMSPIRIT))
{
CUser* pUser = NULL;
if (!pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
{
CMonster* pMonster = NULL;
if (pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
{
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);
}
|
|
|
07/09/2014, 14:58
|
#5
|
elite*gold: 0
Join Date: Jun 2005
Posts: 692
Received Thanks: 353
|
CSV3's attack system is based on TQs if I recall:
|
|
|
 |
Similar Threads
|
---> [QUESTION ABOUT DMG CALCULATION]
08/03/2013 - SRO Private Server - 2 Replies
Hello Epvpers,
I have a question(maybe a dumb question but see by yourself just hoping for answers)
I want to make a server for me, my little brother and my girlfriend for a lan party some times, but now is my question, which database does not contains the damage calculation bug?
With the Original Vsro files i hit with a sun spear lv 42, with a lv 43 fire nuke as level 45 my char 3k on a bunwhang!
A answer how to fix this error is okay aswell
|
{Question} About some databases and damage calculation
07/28/2013 - SRO Private Server - 0 Replies
Hello Epvpers,
I have a question(maybe a dumb question but see by yourself just hoping for answers)
I want to make a server for me, my little brother and my girlfriend for a lan party some times, but now is my question, which database does not contains the damage calculation bug?
With the Original Vsro files i hit with a sun spear lv 42, with a lv 43 fire nuke as level 45 my char 3k on a bunwhang!
A answer how to fix this error is okay aswell:)
|
[Question]Calculation!
08/17/2011 - CO2 Programming - 1 Replies
i wanna know how is the HP/Mana/Attack/Defense/Bless/Dodge and how the Damage of the Skills counted like how it works with the BattlePower?
|
archer calculation
09/24/2010 - CO2 Private Server - 2 Replies
where is this located in what cs in 5165 and what the line?
|
x y angle calculation [question]
11/16/2008 - General Coding - 2 Replies
Hey guys,
I'd like to ask something about a calculation which I was thinking of.
I got 2 points, 1 point is the point where I am and the other point is the point to which I want to move. But first I have to look towards this point ( face angle ). It is about a game, called warhammer.
I heared, that there is a possibility to calculate the angle.
Let's say the point is (which I was reading out CE):
x1 = 27802.375;
|
All times are GMT +1. The time now is 09:34.
|
|