Stun, вызываемый стандартным путём (не поедание большого кол-ва картошки), имеет максимальную длительность в 3 секунды (Пояснение ниже). Теперь представим, что мейдж класс учит не только магию, но и C++. Убогие могут пройти в конец документа.
Итак, существует в мире две вещи: шанс наложения статуса и его длительность.
Первая часть говорит о защите от статусов:
Код
switch (type)
{
case SC_STUN:
case SC_POISON:
case SC_DPOISON:
case SC_SILENCE:
case SC_BLEEDING:
sc_def = 300 +100*status->vit;
break;
case SC_SLEEP:
sc_def = 300 +100*status->int_;
break;
case SC_STONE:
case SC_FREEZE:
case SC_DECREASEAGI:
case SC_COMA:
sc_def = 300 +100*status->mdef;
break;
case SC_CURSE:
if (status->luk > status_get_lv(bl))
return 10000; //Special property: inmunity when luk is greater than level
else
sc_def = 300 +100*status->luk;
break;
case SC_BLIND: //TODO: These 50/50 factors are guessed. Need to find actual value.
sc_def = 300 +50*status->vit +50*status->int_;
break;
case SC_CONFUSION:
sc_def = 300 +50*status->str +50*status->int_;
break;
default:
return 0; //Effect that cannot be reduced? Likely a buff.
}
А вот про вторую вы забыли благополучно:
Код
BL_CAST(BL_PC,bl,sd);
if (sd) {
if (battle_config.pc_sc_def_rate != 100)
sc_def = sc_def*battle_config.pc_sc_def_rate/100;
if (sc_def < battle_config.pc_max_sc_def)
sc_def += (battle_config.pc_max_sc_def - sc_def)*
status->luk/battle_config.pc_luk_sc_def;
else
sc_def = battle_config.pc_max_sc_def;
} else {
if (battle_config.mob_sc_def_rate != 100)
sc_def = sc_def*battle_config.mob_sc_def_rate/100;
if (sc_def < battle_config.mob_max_sc_def)
sc_def += (battle_config.mob_max_sc_def - sc_def)*
status->luk/battle_config.mob_luk_sc_def;
else
sc_def = battle_config.mob_max_sc_def;
}
sc = status_get_sc(bl);
if (sc && sc->count)
{
if (sc->data[SC_SCRESIST].timer != -1)
sc_def += 100*sc->data[SC_SCRESIST].val1; //Status resist
else if (sc->data[SC_SIEGFRIED].timer != -1)
sc_def += 100*sc->data[SC_SIEGFRIED].val3; //Status resistance.
}
return sc_def>10000?10000:sc_def;
}
У вас не возникло вопроса что такое battle_config и почему там отдельно для мобов, а отдельно для чаров (чар обозначается как "pc" (player character)). Ещё раз для убогих с пояснениями.
"./" - корень eA
./conf/status.conf
Код
// ______ __ __
// /\ _ \/\ \__/\ \
// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
// _ _ _ _ _ _ _ _ _ _ _ _ _
// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
//
//--------------------------------------------------------------
// eAthena Battle Configuration File
// Originally Translated by Peter Kieser <pfak@telus.net>
// Made in to plainer English by Ancyker
//--------------------------------------------------------------
//Note 1: Directives can be set using on/off, yes/no or 1/0.
//Note 2: All rates are in percents, 100 would mean 100%, 200
// would mean 200%, etc (тут вам сказали, что все шансы в процентах)
//Note 3: Value is not limited to 60K (see below) (значение не лимитировано шестьюдестью тысячами)
//Note 4: Use bitmask values (add to build setting). When no bit values are given,
// assume character types bits (1: Pc, 2: Mob, 4: Pet, 8: Homonculus) (значения возвращаемые функией BL_PC, ф-ия определяет тип цели)
// Other Information:
// All options are limited to a max of 60K (aprox) which is 600%
// or 60secs as appropiate. Все значения лимитированы шестьюдестью тысячами (или 600%) или шестьюдестью секундами соответственно.
// 1000 miliseconds is 1 second. 1000 ms - 1 секунда. мили=1*10^(-3)
// Unless otherwise specified, the minimum value is 0 for all
// features. Если не указано иное, то минимальное значение равно нулю.
//--------------------------------------------------------------
// Should skill casting be cancelled when inflicted by curse/stun/sleep/etc (includes silence) [Note 4]?
status_cast_cancel: 0 //получение статуса не прерывает каст
// Will certain skill status-changes be removed on logout? А релогин что диспеллит?
// This mimics official servers, where Extremity Fist's no SP regen,
// Strip Equipment, cooking effects are removed when you logout. Setting is:
// 0 - remove nothing. Ничего не диспелит
// 1 - remove negative buffs (stripping, EF) Убирает негативные бафы (стрип)
// 2 - remove positive buffs (cooking) Убирает позитивные бафы
// 3 - remove both negative and positive buffs. Всё снимает
debuff_on_logout: 1
// Adjustment for the natural rate of resistance from status changes.
// If 50, status defense is halved, and you need twice as much stats to block
// them (eg: 200 vit to completely block stun)
//Пояснение двух строк
//Это множитель вашего sc_def из первой части, 100=1, 50=0.5, если значение равно 50, то ваш sc_def из первой части режется пополам, был параметр //равен 100, у вас было 97 виты, и ваш sc_def был равен 100, а тут я взял и поставил даннйы параметр на 50 и при 97 виты, ваш sc_def стал равен 50 и //чтобы не станиться ваша вита должна быть равно 197 (вы снова получите 100 sc_def)
pc_status_def_rate: 100 //К двум данным параметрам применяется note 2
mob_status_def_rate: 100
// Required luk to gain inmunity to status changes.
// Luk increases resistance by closing the gap between natural resist and max
// linearly. This setting indicates required luk to gain complete inmunity.
// Eg: 40 vit -> 40% resist. 150 luk -> +50% of the missing gap.
// So 40% + (50% of 60%) = 70%
//Перевод последних 4 строк комменатриев:
//Требуемый лак для получение иммуна к статусу.
//Лак увеличивает ресист к статусам согласно разнице между максимальным (натуральным (статовым) (пример: 97 вит даст максимальный натуральный //ресист)) и реальным (нет у виза 97 вит) ресистом линейно. Это значение показывает значение лака для получения иммунитета
//40 вит -> 40% ресиста от стана. 150 лак -> 50% от разности
//Таким образом 40% + (50% *(лак/3)%* от 60% *максимальный резист 100%-40% (наш резист)=60% которых нам не хватает до одного резиста*=30%)=70% (итоговый резист)
pc_luk_status_def: 300 //300 лака даст 100% ресиста, ибо будет давать всегда 100 в сумме с натуральным резистом, данное значение для игроков
mob_luk_status_def: 300 // то же для мобов
// Maximum resistance to status changes. (10000 = 100%) - как и в вычислениях первой части 100=1%
// NOTE: Cards and equipment can go over this limit, so it only applies to natural resist. Карты могут увеличить ресист от статусов выше этих зачений. Эти //значения говорят о максимально возможном натуральном резисте
pc_max_status_def: 10000
mob_max_status_def: 10000
Теперь перейдём к понимаю второй части с учётом только что полученных знаний. Я Хвиз 70 джоба, у меня 42+5 виты, из вычислений первой части я получил sc_def=50, как ХВ 70 джоба имеется 4 лака.
Код
BL_CAST(BL_PC,bl,sd);
if (sd) {
if (battle_config.pc_sc_def_rate != 100) //я играю на нормальном серве и нас не режут защиту от статусов (у нас равно 100)
sc_def = sc_def*battle_config.pc_sc_def_rate/100; //если бы резали вполовину (равно 50), то 50*50/100=25, то мой иммунитет к стану //составил бы не 50%, а 25%
if (sc_def < battle_config.pc_max_sc_def) //сервак нормальный, но мой sc_def ниже максимального натурального, он равен 50, а не 100
sc_def += (battle_config.pc_max_sc_def - sc_def)*
status->luk/battle_config.pc_luk_sc_def; //50 {старый sc_def}+(100-50 {разница между максимальным натуральным и моим статус //ресистансом})*4/300=50.66
else
sc_def = battle_config.pc_max_sc_def; // если бы мой sc_def был равен 100, то тут бы от меня и отстали, минуя последнее вычисление, //но не судьба
} else { //то же самое, но для мобов
if (battle_config.mob_sc_def_rate != 100)
sc_def = sc_def*battle_config.mob_sc_def_rate/100;
if (sc_def < battle_config.mob_max_sc_def)
sc_def += (battle_config.mob_max_sc_def - sc_def)*
status->luk/battle_config.mob_luk_sc_def;
else
sc_def = battle_config.mob_max_sc_def;
}
sc = status_get_sc(bl); //учёт шмота
if (sc && sc->count)
{
if (sc->data[SC_SCRESIST].timer != -1)
sc_def += 100*sc->data[SC_SCRESIST].val1; //Status resist
else if (sc->data[SC_SIEGFRIED].timer != -1)
sc_def += 100*sc->data[SC_SIEGFRIED].val3; //Status resistance.
}
return sc_def>10000?10000:sc_def; // строка эквивалентна If (sc_def>10000) sc_def=10000; else sc_def=sc_def;
}
*У Б О Г И Е, К О Т О Р Ы Е П Р О П У С Т И Л И М А Т Ч А С Т Ь Ч И Т А Ю Т С Э Т О Г О М Е С Т А*Шанс стана (к примеру) (97-VIT)-((97-VIT)*LUK/3)/100% не изменился. Баш 10 лвл с фатал блоу, к примеру, будет станить с шансом 30%*(97-VIT-(97-VIT)*LUK/3)/100%.
Время стана 3*(97-VIT)/100 секунд, нормальный стан не может быть таким образом дольше 3 секунд. Вот эту формулу и фиксили, убрав из неё LUK.
P.S. Прошу прощения за ошибки орфографические, пунктационные и синтаксиса языка C++, спать хотелось, хотел всю ночь бить тару, а в итоге тут провозился.