Технические подробности расчета урона, дефа, уворота и т.п. в бою
23.01.2015, 00:05

Тем, кто хочет детальнее представлять влияние экипировки на бой, будет полезна следующая информация...

Расчет очков атаки

Для примера рассчитаем урон ланча (65 инт огник +7) скилом по маг сету 65 инт. Обвес и прочие бонусы будут оговорены по ходу расчета. Теперь мы должны рассчитать наши минимальные и максимальные характеристики оружия с учетом бонусов:
мин атака = нижняя планка оружия(3030) * осадное мастерство (1.5) * банка атаки 55%(1.55) * силу патрона (1.25 для топлива) * силу доп патрона (заряды за голд очки 1.05) + пт ПУ (да да + 99) = 9345
макс атака = верхняя планка оружия(6777) * осадное мастерство (1.5) * банка атаки 55%(1.55) * силу патрона (1.25 для топлива) * силу доп патрона (заряды за голд очки 1.05) + пт ПУ (да да + 99) = 20779
Далее идет выборка (ниже средней, выше средней или крит) мы возьмем выше средней но не крит. где то 75% от крита, это будет 15584.

Теперь ряд усиливающих коэффициентов от скила:
15584 * 1.63(для всех классовых или 2.0 для простых 7 лвла) * 3.05 (сила скила ракетный кулак) = 77475
Далее следуют бонусы ламп и чх (представим что у нас патр с чх) 77475 *1.3 (патр) * 1.3(чх) = 130934

Теперь следуют прочие бонусы полученные от бижи, гл бонусы, сетовые бонусы, бонусы от осадки, заточка... они все приводятся к общему множителю
130934 * (1 + 0.25*4 (25% перфект обвес) + 2.0 (200% от +7) + 0.5(50% от осадки 65ой)) = 589204
Почему перемножает? Вот вот такой же вопрос был и у меня ведь в клиенте все аналогичные бонусы складываются, но это суровая реальность. Получив наши очки атаки 589204 мы отправляемся в еще более навороченный мир расчета урона. 

Расчет очков урона

Итак, мы уже выяснили что наш ланч некисло так бахнул на 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.

 

PHP код:
//Поскольку во всем оружии и броне критерий атаки и защиты равны 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 AttTolTypeint 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;
}  

Критические атаки

Для расчета итоговой атаки применяется два значения: минимальная атака и максимальная атака. В примере расчет на крит был пропущен и условно было взято значение 75% от крита.
Рассмотрим подробно участок кода сервера (механика сервера не очень то меняется на протяжении всего своего существования):
 

PHP код:
int l_nCrtAf l_nMaxAf * ((125 l_nMaxAf) / (50 l_nMaxAf)) + 0.5;
int l_nAttBlk = (float)(l_nMinAf l_nMaxAf)/0.5;l_nMinAf минимальная атакакоторую мы рассчитали.
l_nMaxAf Максимальная атакакоторую мы рассчитали.
l_nAttBlk значение средней атаки.
l_nCrtAf значение критической атакиЗначения 50 и 125 как мы видим настолько малы что ими можно пренебречьТогда будем принимать значение максимальной атаки за значение критической атаки.  

Теперь посмотрим как происходит выборка атаки. Любое оружие имеет две переменных: шанс на атаку ниже среднего, шанс на атаку выше среднего. Сумма этих шансов не дает 100, так как недостающая величина есть базовый шанс критической атаки оружия.

Сервер делает два расчета:
Шанс атаки ниже среднего = Шанс меньше среднего (из параметров оружия) - Крит + Анти крит.
Шанс критической атаки = Шанс меньше среднего (из параметров оружия) + Шанс выше среднего (из параметров оружия) - Крит + Анти крит.
Оба шанса не могут быть ниже 0. Если таковое случается то шанс приравнивается 0. Этот шанс сравнивается с псевдослучайным числом и не простым rand()%100, а ВЕЛИКИМ корейским генератором случайных чисел.

Итак если случайное число меньше чем "Шанс атаки ниже среднего", то атака будет выбрана случайно от минимальной до средней. Если число больше чем "Шанс атаки ниже среднего" но не больше чем "Шанс критической атаки", то атака будет от средней до максимальной.
И если случайное число окажется больше чем "Шанс критической атаки" то атака будет равна критической, которая численно почти равна максимальной.

Поскольку видно, что крит влияет на средний урон, для повышения ДПС рекомендуется сочетать допинги атаки и крита. Ну а для понижения ДПС - точить антиграв на +7)))

Не смотря на то что в сервере присутствует свой механизм стана со своими отдельными шансами, корейцы им не пользуются. Состояние оглушения (стан) возникает при каждой критической атаке. К сожалению многие механизмы сервера не проводят проверку на стан.

Расчет крита для монстров немного иной.

Расчет уворота

Ниже приведены параметры атакующего навыка (AttSklUnit) для калиан. Данный параметр называется "Точность" на сайте rf-info.info:
Калиана Воительница - 262
Калиана Убийца - 602
Шанс нанести простой удар монстром рассчитывается следующим образом:
шанс = (AttSklUnit - (Ур чара + ПТ Защиты чара)) / 4 + 95 - Уворот чара
Если чар в момент нанесения удара двигается (бежит/идет) то шанс монстра нанести удар уменьшается в 2 раза.
Шанс не может быть ниже 5 % или больше 95%.
Таким образом для чара 50 лвла с пт защиты ГМ и 100 доджа, шансы нанести удар: - по стоячему для первой калианы - 23%, для второй 95%, - по бегущему для первой калианы 12%, для второй 54%

Категория: Советы новичкам | Добавил: eagle991
Просмотров: 1889 | Загрузок: 0 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar