Сперва берём evasion цели и считаем modified_evasion:
modified_evasion = evasion * evasion_move_mode_multiplier + evasion_move_mode_adder
evasion_move_mode_multiplier и evasion_move_mode_adder - модификаторы evasion в зависимости от режима передвижения.
Всего существует 4 режима передвижения - бег (run), ходьба (walk), стояние на месте (stand), сидение на заднице (sit). Каждому из этих режимов соответствует своя пара evasion_move_mode_multiplier/evasion_move_mode_adder.
Начальные значения (для всех режимов):
evasion_move_mode_multiplier = 1
evasion_move_mode_adder = 0
Эти значения могут модифицироваться скиллами. Собственно, есть только 1 такой скилл - пассивка Acrobatic Move. Она добавляет некторое значение к evasion_move_mode_adder для режима run:
Acrobatic Move 1: +4
Acrobatic Move 2: +5
Acrobatic Move 3: +6
Теперь считаем advantage:
advantage = modified_evasion - accuracy
accuracy - параметр атакующего, конечно же.
Считаем base_hit_chance:
base_hit_chance = 5 + MAX(-26811.9 * (advantage - 23.59581247155212), 0)^(1/3)
MAX - функция, возвращающая значение своего максимального аргумента. В данном случае она будет неотрицательна.
Запись x^y означает "x в степени y". В данном случае - извлечение кубического корня из значения MAX.
В конце сообщения я дам таблицу зависимости base_hit_chance от advantage.
Считаем hit_loc_bonus.
Пространство вокруг цели можно условно разделить на 4 сектора по 90 градусов - front (спереди, "в лоб"), back (сзади, "в спину") и 2 side ("бока").
Иллюстрация (вид сверху):
Значение hit_loc_bonus зависит от того, из какого сектора жертвы нападающий производит атаку.
Если нападающий стоит во front, то hit_loc_bonus = 1
Если нападающий стоит в side, то hit_loc_bonus = 1.2
Если нападающий стоит в back, то hit_loc_bonus = 1.3
Вычисляем hit_height_bonus
Пусть dz - разница высот, на которых стоят цель и атакующий персонаж (из координаты z цели вычитаем координату z атакующего).
Если dz <= -1100 то hit_height_bonus = 0
Если -1100 < dz <= -300 то hit_height_bonus = 1.375 + 0.00125 * dz
Если -300 < dz <= 100 то hit_height_bonus = 1
Если 100 < dz <= 500 то hit_height_bonus = 1.25 - 0.0025 * dz
Если 500 < dz то hit_height_bonus = 0
Иными словами, hit_height_bonus меняется от 0 до 1, то есть он может только уменьшить ваш шанс попасть. Атаковать цель сверху вниз можно гораздо успешнее, чем снизу вверх (сверху вниз можно стрелять гораздо дальше, чем с таким же шансом попасть снизу вверх).
Наконец, считаем final_chance:
final_chance = MIN(MAX(base_hit_chance * hit_loc_bonus * hit_height_bonus, 30), 98)
MIN - функция, возвращающая значение своего минимального аргумента.
Иными словами, шанс попасть атакой не может быть меньше 30% и больше 98%.
Таблица зависимости base_hit_chance (вторая колонка) от advantage (первая колонка):
- Код: Выделить всё
-50 130.43
-49 129.86
-48 129.28
-47 128.70
-46 128.11
-45 127.52
-44 126.92
-43 126.32
-42 125.71
-41 125.09
-40 124.47
-39 123.84
-38 123.20
-37 122.56
-36 121.91
-35 121.25
-34 120.59
-33 119.91
-32 119.23
-31 118.54
-30 117.85
-29 117.14
-28 116.42
-27 115.70
-26 114.97
-25 114.22
-24 113.47
-23 112.70
-22 111.93
-21 111.14
-20 110.34
-19 109.53
-18 108.70
-17 107.87
-16 107.01
-15 106.15
-14 105.27
-13 104.37
-12 103.46
-11 102.53
-10 101.58
-9 100.61
-8 99.62
-7 98.61
-6 97.58
-5 96.53
-4 95.45
-3 94.34
-2 93.21
-1 92.04
0 90.85
1 89.62
2 88.35
3 87.04
4 85.69
5 84.30
6 82.85
7 81.34
8 79.78
9 78.15
10 76.43
11 74.64
12 72.74
13 70.74
14 68.60
15 66.31
16 63.83
17 61.13
18 58.14
19 54.76
20 50.85
21 46.13
22 39.98
23 30.19
24 5.00
25 5.00
26 5.00
27 5.00
28 5.00
29 5.00
30 5.00
31 5.00
32 5.00
33 5.00
34 5.00
35 5.00
36 5.00
37 5.00
38 5.00
39 5.00
40 5.00
41 5.00
42 5.00
43 5.00
44 5.00
45 5.00
46 5.00
47 5.00
48 5.00
49 5.00
50 5.00