gm_Баллистика - ScreamingScythe/botgame GitHub Wiki

Баллистика танцует от баллистических объектов (gmProjectile).

Столкновение баллистического объекта с препятствием

Каждый раз, когда снаряд пролетает через bounding box объекта, он проходит следующие тесты:

Если random(100)/100 > obj.spacefill, то снаряд летит дальше. В противном случае мы выясняем, как столкновение с объектом повлияло на дальнейшую жизнь снаряда.

Сравниваем значение density объекта-интервента с минимальным и максимальным значением для снаряда. C Ignored и Destroyed все пожалуй ясно, а вот в случае если снаряд попал между них, то его траектория корректируется в случайном направлении пропорционально тому, насколько он превысил значение игнорирования. С максимумом, например, в 3 градуса. При этом мы еще и сбрасываем Targeted в false, а Precision в 0, иначе глюки будут крайне веселые )

Поражение бота

С этого момента мы считаем, что цель уже точно получила повреждения. Теперь наша задача - понять, куда они пришли. Прошу заметить, что урон целью может быть получен не обязательно в результате попадания баллистического объекта. (еще есть такие вещи как сплэш от взрывов например).

На этапе поражения цели нас беспокоят следующие параметры пришедшего урона:

  • Precision (Real)
  • Нацеленность (нет, либо указание цели)
  • Сплэш (Bool)
  • Урон (Real)

Далее в ход идет таблица распределения попаданий, которая является атрибутом шасси и выглядит примерно так:

  • Столбцы - результаты (ЖВС, Ходовая, Оружие1, Оружие2, ...)
  • Строки - предполагаемые цели (неприцельно, ЖВС, Ходовая, Оружие1, Оружие2, ...)

Таблица заполнена цифрами менее 1, характеризующими вероятность попадания в ту или иную часть шасси, в сумме все цифры строки кроме элемента строка=столбец равны 1.

Если стрельба является нацеленной, то вес ячейки-цели, увеличивается в Precision раз, после чего значения в строке таблицы нормализуются, чтобы сумма их осталась равна 1. (Изменения касаются только текущего выстрела).

Если оружие не имеет сплэша, то весь урон проходит в одну цель, которая определяется по таблице случайным образом. В противном случае, урон от сплэша распределяется соразмерно значениям в таблице, после чего каждая цель тестируется на пробитие отдельно.