double mAtk = attacker.getMAtk(target, skill);
double mDef = target.getMDef(attacker, skill);
double mp = target.getMaxMp();
if (bss) mAtk *= 4;
else if (ss) mAtk *= 2;
double damage = (Math.sqrt(mAtk) * skill.getPower(attacker) * (mp / 97)) / mDef;
damage *= calcSkillVulnerability(attacker, target, skill, skill.getSkillType());
Что здесь происходит 😭
1) Базовые статы
* mAtk - маг. атака кастера против этой цели (с учётом скилла).
* mDef - маг. защита цели против этого скилла.
* mp - макс. MP цели (важно: не текущая, а именно Max MP).
2) Шоты
* BSS:
mAtk *= 4 → потом берём корень ⇒ итоговый буст = ×2 (потому что √4 = 2).* SPS:
mAtk *= 2 ⇒ итоговый буст = ×√2 ≈ ×1.414.> Т.к. корень берётся после умножения, шоты усиливают не в лоб, а через √: BSS даёт ~+100% к урону, SPS ~+41%.
3) Основная формула
double damage = (Math.sqrt(mAtk) * skill.getPower(attacker) * (mp / 97)) / mDef;
Урон = (√маг. атаки × сила умения × (макс. MP цели / 97)) / маг. защиту × уязвимость
Урон по мане зависит не только от силы мага, но и от того, насколько "умная" цель (чем больше у неё маны - тем сильнее удар).
🔵√маг. атаки - чем выше магическая атака, тем сильнее, но с каждым пунктом прирост меньше (идёт по корню).
🔵Сила умения (Power) - множитель урона конкретного скилла.
🔵Максимальная мана цели (Max MP) — чем больше маны у цели, тем больнее ей прилетает.
🔵Маг. защита (M.Def) — чем выше, тем слабее эффект.
🔵Уязвимость (Vulnerability) — учитывает резисты, бафы и тип цели.
🛠 Маленький пример (для ощущения масштабов)
Пусть: mAtk=1000, mDef=500, Power=50, MaxMP=1000, BSS=true.
* После BSS: mAtk=4000 ⇒ √mAtk=63.2455
* (mp/97)=1000/97≈10.3093
* Damage ≈ (63.2455 × 50 × 10.3093) / 500 ≈ 65.2 (до уязвимостей)
Для SPS вместо BSS будет ×√2 → ~46.1.
Без шотов ещё ниже (~32.6).
Дальше умножается на Vulnerability (например, ×1.2 при уязвимости или ×0.8 при резисте).
⚡️ Анонсы серверов ✈️ Телеграм-канал
