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

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

Пусть 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) &#x20;

{% code fullWidth="false" %}

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

```

{% endcode %}

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

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

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

### Взрыв

Пусть e = энергия взрыва в этой точке&#x20;

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bestway-1.gitbook.io/documentation/gem-rts-v1-ru/nastroiki-igrovykh-parametrov/nastroika-broneprobivaemosti/algoritm-raboty-broni.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
