> For the complete documentation index, see [llms.txt](https://docs.bestway.com.ua/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bestway.com.ua/gem-rts-v1-ru/nastroiki-igrovykh-parametrov/nastroika-broneprobivaemosti/algoritm-raboty-broni.md).

# Алгоритм работы брони

## Эффективная толщина брони при пробитии

Пусть 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)

{% code fullWidth="false" %}

```
Если калибр больше порогового калибра и e>=порога и накопление урона не запрещено, то
    броне нанесен урон
    вычисляем накопление урона, приведенное к эффективной прочности (от 0 и выше), → hit
    вычисляем оставшуюся после предыдущих попаданий прочность [0..1] → current
    если current <= hit
        произошло разрушение брони
    иначе внести накопленный урон hit
снаряд тратит энергию w на прохождение брони

```

{% endcode %}

По результатам пробития и свойствам снаряда далее возможны различные эффекты:

* снаряд застрял в броне (потратил всё энергию)
* детонация (при пробивании лёгкой брони может не сдетонировать, например, тяжелый фугас пролетает сквозь человека)
  * подрыв фугасной части
  * срабатывание кумулятивной струи
* рикошет (броня не пробита и угол попадания всколзь)

## Нормализация

### Взрыв

Пусть 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 → отображение кумулятивной струи, горения иё ударной волны
