часть 2. расчет очков урона.итак, мы уже выяснили что наш ланч некисло так бахнул на 589203 очка атаки. но это еще не урон. давайте посмотрим на то во что это все выльется.
давайте посмотрим на то как выглядит броня бедной белочки мага с серверной стороны (в примере взят торс 65 инт):
критерий атаки (fdefgap) = 0.5
защита (fdeffc) = 5087
доп зщаита (fdeffacing) = 0,037513
что??!! откуда 0.0375! где мои 487?!. да вот такая вот суровая реальность. доп деф в клиенте имеет преобразованное значение формулу которого я давал ранее.
итак, как многие наверное знают, игровой сервер выбирает случайную вещь противника по которой он будет считать атаку. в нашем примере я буду делать расчет по торсу.
для кого то может быть это будет тайной, а для кого-то невидимой очевидностью, но при расчете урона бонус защиты берется суммарно от заточки всех вещей включая щит. (в нашем примере щита не будет.)
итак защита: 5087(fdeffc) * 1.55(допинг защиты 55%) * (1+0.3(эгида 7 лвл)+ 10.0(фул сет +7 покров 2.0*5)+ 1.1(110% от фул сета ддд)) * 1.5(пусть это будет архонт с защитой 50%) и если вы верно перемножите все в скобках то получите = 146658
формула для расчета пвп и пве абсолютно одинакова за небольшой лишь рзницей, что у мобов критерий атаки и защиты может быть 1.0 а не 0.5.
формула выглядит вот так:
Код
Код:
//поскольку во всем оружии и броне критерий атаки и защиты равны 0.5//то этот параметр для пвп всегда будет 0.5
float faveadj = (fdefgap + this->getweaponadjust()) / 2.0f;
float fdono1 = fdeffacing - 1.0f;
if(fdono1 == 0.0f)
fstdattfc = 0.0f;
else
fstdattfc = (fdeffacing * fdefpnt * fdefgap - fdefpnt) / fdono1;
float fdono2 = fstdattfc - fdefpnt * faveadj;
if(fdono2 == 0.0f)
fscedstfc = 0.0f;
else
fscedstfc = (fstdattfc - fdefpnt) / fdono2;
float fprop = 1.2f; //стихийная поправка, по сути нужна только магам так как именно маги изза того что бьют всеми 4 стихиями
//теряют на стихийно защищенных мобах примерно 20% урона.
if(ntoltype == tol_code_nothing) //а вот и описанная ранее корейская ошибка. поскольку мы установили что ntoltype у нас 255
//то он никак не будет равен -1 а потому присвоения константе значения 1.0 не будет.
fprop = 1.0f;
int ndamage = (int)(((float)nattpnt * fprop + (float)ntolfc - fdefpnt * faveadj) * fscedstfc);
//где:
//nattpnt = очки атаки, у нас это 589203
//fprop = 1.2 так как ланч бьет стихийным топливом
//ntolfc = стих урон который считается относительно очков атаки. ниже посчитем.
//fdefpnt = очки защиты которые у нас равны 146658
//faveadj = критерий урона, который как мы выяснили всегда равен 0.5
//fscedstfc = для пвп эта переменная будет численно равна fdeffacing что и есть доп деф.
//кто не верит раскройте скобки в формулах выше
а вот так рассчитывается стих урон:
Код
Код:
int ccharacter::gettotaltol(char atttoltype, int dampoint){
//на входе имеем 2 аргумента: что за стихия и с какой силой лупим. на выходе отрицательный или положительный бонус стихийной атаки.
cgameobject * pdst = (cgameobject *)this;
float ftol[4] = {
(float)pdst->getfiretol(pdst)/100, //предположим что у белки 4 бижи по +4 к каждой стихии и баф на 7 лвлва щит стихий +10
//итого имеем 26 к каждой стихии. а после деления будет 0.26
(float)pdst->getwatertol(pdst)/100,
(float)pdst->getsoiltol(pdst)/100,
(float)pdst->getwindtol(pdst)/100
};
switch(atttoltype)
{
case tol_code_fire: // вот это наш сдучай так как акр лупит огнем.
return (int)(- 0.1f * (dampoint * ftol[tol_code_fire]) - 0.9f * (dampoint * ftol[tol_code_water]) + 0.9f * (dampoint * ftol[tol_code_soil]));
ну тут и ежу понятно что если все стихии имеют один бонус то 0.9 - 0.9 = 0 а стих бонус будет равен -0.1*0.26*589203 = -15319(лол)
case tol_code_water:
return (int)(0.9f * (dampoint * ftol[tol_code_fire]) - 0.1f * (dampoint * ftol[tol_code_water]) - 0.9f * (dampoint * ftol[tol_code_wind]));
case tol_code_soil:
return (int)(- 0.9f * (dampoint * ftol[tol_code_fire]) - 0.1f * (dampoint * ftol[tol_code_soil]) + 0.9f * (dampoint * ftol[tol_code_wind]));
case tol_code_wind:
return (int)(0.9f * (dampoint * ftol[tol_code_water]) - 0.9f * (dampoint * ftol[tol_code_soil]) - 0.1f * (dampoint * ftol[tol_code_wind]));
}
return 0;
}
давайте посчитаем что же у нас получилось:
ndamage = (589203 * 1.2 - 15319 - 146658 * 0.5) * 0,037513
урон = 23197 (белка ляжет со скила)
а теперь давайте уберем защиту сосвем
ndamage = (589203 * 1.2 - 15319 - 0* 0.5) * 0,037513
урон = 25948
и посчитаем сколько нам дал фул сет +7 доп 55 и прочая еунда
100 - 23197/25948 * 100 =
10.6% от урона. чтд
занавес!