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. (Изменения касаются только текущего выстрела).
Если оружие не имеет сплэша, то весь урон проходит в одну цель, которая определяется по таблице случайным образом. В противном случае, урон от сплэша распределяется соразмерно значениям в таблице, после чего каждая цель тестируется на пробитие отдельно.