Алгоритм работы брони
Эффективная толщина брони при пробитии
Пусть s - толщина volume со стороны попадания снаряда (значение берется из настроек volume в .def модели)
Если есть настройки брони
Если установлен флаг ray_cast_thickness
s равно расстоянию, которое луч прошел в volume умноженное на коэффициент приведения материала volume к мм. стали,
иначе,
s равно толщине брони из настроек armor с нужной стороны (4 стороны - перед, зад, верх/низ, бока)
Вычислить влияние наклона брони slope_factor от угла входа снаряда в броню
//slope_factor - множитель толщины брони, который ограничен g_bulletSlopeMax.
// при входе снаряда в броню под прямым углом - slope_factor = 1
// при входе по касательной = g_bulletSlopeMax
overmatch = Ограничить(s / калибр снаряда * коэф. overmatch снаряда, g_bulletOvermatchMin, g_bulletOvermatchMax)
// overmatch - влияние наклона брони на пробитие: при 0 - не влияет, при 1 - влияет максимально
// при калибре снаряда близком к толщине брони наклон почти не влияет
вернуть s * (1 + overmatch * (slope_factor - 1))
Пробивание снарядом
Пусть s - эффективная толщина брони, вычисленная в точке попадания с учетом параметров armor (см. выше) Пусть e - энергия снаряда
Если запрещено наносить урон
весь урон поглощается броней
выход
Если e >= s
произошло пробитие
Пусть w - это энергия, которую броня может поглотить
w = Минимум(e,s)
Если калибр больше порогового калибра и e>=порога и накопление урона не запрещено, то
броне нанесен урон
вычисляем накопление урона, приведенное к эффективной прочности (от 0 и выше), → hit
вычисляем оставшуюся после предыдущих попаданий прочность [0..1] → current
если current <= hit
произошло разрушение брони
иначе внести накопленный урон hit
снаряд тратит энергию w на прохождение брони
По результатам пробития и свойствам снаряда далее возможны различные эффекты:
снаряд застрял в броне (потратил всё энергию)
детонация (при пробивании лёгкой брони может не сдетонировать, например, тяжелый фугас пролетает сквозь человека)
подрыв фугасной части
срабатывание кумулятивной струи
рикошет (броня не пробита и угол попадания всколзь)
Нормализация
Взрыв
Пусть e = энергия взрыва в этой точке
Если запрещено наносить урон, то
весь урон поглощается броней
выход
Пусть w - это энергия, которую броня может поглотить
w = e
Если e >= порога и накопление урона не запрещено
броне нанесен урон
вычисляем накопление урона, приведенное к эффективной прочности (от 0 и выше), → hit
вычисляем оставшуюся после предыдущих попаданий прочность [0..1] → current
если current <= hit
произошло разрушение брони
w = w * Ограничить(current / hit, 0, 1)
// сколько энергии могут задержать остатки брони
// если броня полностью разрушена, то она не задерживает взрывную волну
внести накопленный урон hit
взрыв тратит энергию w на прохождение брони
Примечания
Для пробития (pierce) значения задаются / считаются в мм условной брони (стали).
Для взрывной волны (blast) значения задаются в кг условной взрывчатки
Так же, для внутренних расчётов, есть преобразование урона в общую энергию
g_energyperprojective 1.0
g_energyperhealth 0.025
g_energyperblastwave 5.0
Компоненты есть только на технике
Домики работают без компонент
g_bulletSlopeMax → максимальное увеличение толщины брони от угла попадания
Отладка
Для отладки можно включить:
dbg_piercing 1 → отладочная информация в консоль о каждом попадании снаряда
dbg_blast 1 → отладочная информация в консоль о каждом взрыве
v_armor 1 → сейчас отключен (возможно появится позже)
ui_showArmorBar 1 → показ накопления урона
v_damage 1 → отображение кумулятивной струи, горения иё ударной волны
Last updated