← Все записи

Бой4 мин чтения

Бот в Terminal Leave: правила, а не нейросеть

Что за «ИИ» противник ждёт в демо-бою, почему «ИИ» в Terminal Leave означает то же, что в стратегиях девяностых.

Почти в каждой записи этого девлога есть слово «бот» или "ИИ". Сначала о том, чем он не является: это не GPT, не языковая модель и вообще не нейросеть. «ИИ» в Terminal Leave — обычная программа из правил, которые я написал руками. Его ничему не обучали, он ни у кого ничего не спрашивает и работает на сервере боя рядом с симуляцией.

Зачем он нужен

Бот появился в первые дни проекта, раньше, чем бой можно было увидеть на экране. Причин было четыре, и все они на месте до сих пор.

Первая — разработка. Пока не было графики, бой существовал только в тестах, и в них два бота играли друг против друга от начала до конца. Так проверялось, что бой вообще заканчивается, а не зависает (об этом отдельная запись).

Вторая — первый бой без регистрации. Человек открывает ссылку и сразу играет. Ждать, пока в очереди найдётся живой противник, новичку незачем, поэтому первый бой всегда идёт против бота. В этом бою у бота оружие попроще.

Третья — бой, когда людей нет. В закрытой альфе очередь часто пустая, и вместо ожидания можно попросить бой с ботом.

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

Как он думает

Каждый раунд бот составляет план для каждого своего бойца — так же, как это делает игрок, — и отправляет на сервер обычные приказы. Сервер проверяет их по тем же правилам, что и приказы человека. Изменить состояние боя напрямую бот не может.

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

Когда противник в поле зрения, бот выбирает цель. В первую очередь — того, кого успеет вывести из строя, потом самого раненого, потом ближайшего. Режим огня зависит от оружия и дистанции: очередь вблизи, прицельный выстрел на краю дальности, одиночный в остальных случаях. За раунд боец ставит до трёх выстрелов, пока хватает времени. Если магазин кончится посреди очереди, остаток раунда уходит на перезарядку.

Куда встать, бот решает, оценивая клетки поблизости. У каждой клетки есть счёт: полное укрытие прибавляет больше, половинное меньше, открытость перед каждым видимым врагом отнимает, линия огня по своей цели прибавляет. Ещё учитываются удобная дистанция для своего оружия, расстояние до товарищей и длина пути. Укрытие при этом считается той же функцией, что и в симуляции, поэтому бот не может надеяться на защиту, которой в бою нет. Перед стрельбой из укрытия боец опускается на колено. Если стоит на открытом месте, сначала делает несколько шагов в укрытие и стреляет уже оттуда.

Осколочную гранату бот бросает, если в зону взрыва попадают хотя бы двое противников и никто из своих. Тяжело раненный боец (меньше трети здоровья), рядом с которым есть враг, отходит к лучшему укрытию, какое может достать. Исключение — если одним выстрелом он добьёт цель. Если делать нечего, бот ставит бойца в наблюдение в сторону угрозы.

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

Почему не нейросеть

Этот вопрос мне задают, поэтому отвечу прямо: языковую модель на место бота я не ставлю, и вот почему.

Цена. Запрос к модели — это ожидания и деньги за каждый ход.

Понятность. Если бот сделал глупость, я смотрю, какие клетки как оценились, и вижу, какой вес виноват. У модели на вопрос «почему он туда пошёл» ответа нет.

Геометрия. Бой — это линии огня, укрытия по сторонам клеток, дальности и время. Модель описывает такие вещи словами, а программа их считает, и считает теми же функциями, что и симуляция.

Слово «ИИ» в игре означает то же, что в стратегиях девяностых: противник, которым управляет программа.

Что он пока не умеет

  • Все боты ведут себя одинаково. Осторожных и напористых пока нет.
  • Памяти у бота нет. Противник ушёл из поля зрения — для бота его больше не существует, и бот снова идёт в сторону его старта.
  • Отряд не действует сообща. Бойцы только не мешают друг другу и не сбиваются в кучу. Прикрытия одного другим, обхода и фланга нет.
  • Дымовых гранат бот не бросает и на подавление огнём не реагирует.

Каждая из этих вещей — следующая задача. Нынешний бот уже прячется и выбирает цели, но обыграть его не составляет труда.

Демо-бой против «ИИ» бота открыт без регистрации: сыграть.