Как устроен ИИ соперников в Go Volt

1 comments0 reviews

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

Этот документ объясняет текущую реализацию в рабочей ветке main на 4 октября 2026 года. Подробности кода, формулы и источники приведены в документе для разработчика.

В доступном архиве полный самостоятельный водитель финальной PC игры не восстановлен. В Go Volt действует ранее согласованное исключение: логика водителя адаптирована из сохранённых Xbox исходников. Данные трасс, параметры машин и автомобильная физика при этом берутся из поздней PC версии и финальных PC ресурсов.

Поэтому описание ниже относится к работающему ИИ нашего порта. Некоторые решения сохранены от донора, другие добавлены при адаптации. Его нельзя считать доказанной точной копией ИИ, выпущенного в retail PC игре. Граница источников записана в AI_SOURCE.md и SOURCE_POLICY.md.

Физика рассчитывает движение каждые 8 миллисекунд, то есть 125 раз в секунду. Водитель принимает новое решение примерно 30 раз в секунду. Между решениями машина продолжает выполнять уже выбранные команды.

Каждое решение складывается из нескольких действий:

  1. Найти ближайший подходящий участок подготовленного маршрута.
  2. Выбрать точку впереди, к которой надо направить машину.
  3. Проверить соседние машины, свободное место и признаки заноса.
  4. Выбрать руль и газ с учётом поворота и препятствий.
  5. При проблеме переключиться на выход из застревания или запросить возвращение на трассу.

Использование оружия проверяется отдельно контроллером бонусов. Оно получает решение водителя и текущее состояние машины.

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

Водитель определяет, возле какого отрезка сейчас находится автомобиль, и выбирает цель немного дальше по дороге. На небольшой скорости цель примерно в 3 метрах впереди. При скорости 10 метров в секунду она уже в 4 метрах: чем быстрее машина, тем дальше она смотрит.

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

Текущий ИИ следует основному замкнутому маршруту. Он умеет менять положение поперёк дороги, но не выбирает альтернативные ветви графа и не строит отдельный путь к бонусу.

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

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

Машина всё равно может промахнуться мимо поворота. Водитель задаёт управление, а результат зависит от скорости, сцепления, инерции и столкновений.

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

Перед поворотом программа оценивает, насколько резко изгибается путь, и снижает допустимую скорость. В расчёт входят текущие шины и покрытие; масло уменьшает запас сцепления. Это защитный планировщик нашего порта, а не подтверждённая точная формула retail PC ИИ.

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

Для обычного замедления программа даёт отрицательный запрос двигателя. Ручник здесь не используется: в текущем PC управлении он блокирует задние колёса и мог бы вызвать лишний занос.

Скрытого ускорения для догоняния игрока в этом водителе нет. Его скорость может измениться из-за настоящего бонуса, режима физики или выбора другой машины.

Водитель ищет близкую машину впереди. Для начала манёвра она должна находиться не дальше 4 метров напрямую и менее чем в 2,5 метра впереди по маршруту. Учитываются и контрольные зоны: автомобиль с соседней, но другой частью дороги не должен автоматически считаться лидером.

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

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

Датчики проверяют пространство в направлении обеих подготовленных линий. Для каждой линии используются три луча: по центру и по бокам. Дальность проверки растёт со скоростью: к пути за 0,35 секунды добавляется 0,7 метра запаса, но итог ограничен пятью метрами.

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

Эти датчики проверяют геометрию трассы. Другие автомобили учитываются отдельным списком соседей, а реальные удары обрабатывает физика. Полной системы объезда произвольного препятствия здесь нет: программа выбирает между двумя уже подготовленными линиями.

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

Коррекция включается при достаточной скорости и опоре как минимум на три колеса. Она помогает стабилизировать автомобиль, но не прикладывает к нему отдельную «спасающую» силу. Большой удар или очень скользкая поверхность всё ещё могут развернуть машину.

У водителя несколько режимов:

РежимДействия машины
Обычная гонкаСледовать маршруту, выбирать скорость и линию
ПолётСохранять полный запрос газа и убрать руль до появления контакта колёс
Исправление задним ходомКоротко отъехать назад с поворотом
Исправление вперёдПопытаться развернуться в нужную сторону и продолжить гонку
Возвращение на трассуПередать сцене запрос на перестановку автомобиля

Задний ход включается, если машина некоторое время смотрит против направления маршрута либо медленно упирается кузовом в препятствие. Обычно она отъезжает назад около 0,9 секунды, затем пробует ехать вперёд до 1,4 секунды; этот этап может закончиться раньше, если направление уже исправлено.

Если машина 2,5 секунды не выходит из небольшой области, 1,2 секунды лежит на боку или крыше либо 1 секунду остаётся далеко от маршрута, водитель запрашивает возвращение. Сцена также возвращает машину, упавшую далеко ниже уровня трассы.

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

Соперник получает бонусы через общую систему подбора. Отдельная программа решает, подходит ли момент для использования уже имеющегося предмета.

Перед применением она проверяет, что водитель находится в режиме гонки, машина достаточно ровно стоит как минимум на трёх колёсах, не запрошено восстановление и предмет удерживается хотя бы 0,4 секунды. Активный таймер питания также блокирует новое применение.

Далее действуют правила конкретного предмета. Ракете нужна подходящая цель впереди, электропульсу — близкий автомобиль, маслу — соперник в узком коридоре позади или подходящий узкий участок трассы. Турбо используется, когда машина движется, просит газ и достаточно прямо направлена по маршруту. Эти проверки выбирают момент использования; эффекты и попадания рассчитываются общей системой оружия.

ИИ не планирует поездку к отдельному бонусу и не оценивает, выгоднее ли сохранить предмет до следующего круга. В архивном доноре была отдельная защита игрока от частых атак; текущая политика порта её не переносит.

Алгоритм водителя у них общий. Различия создают характеристики автомобилей, положение на дороге, соседние участники, бонусы и последствия столкновений. В обычной текущей гонке создаются три соперника; их машины берутся из трёх следующих записей каталога после выбранной игроком машины с переходом к началу списка. В Time Trial соперников нет.

Сам водитель детерминирован: одинаковые входные наблюдения и внутреннее состояние дают одинаковые команды. Это не обещание побитно одинакового полного заезда на любых компьютерах: в гонке работают также физика, распределение бонусов и порядок игровых событий.

  • pc_ai_driver.gd — движение, обгон, скорость и состояния водителя.
  • pc_ai_sensors.gd — препятствия, скольжение и запас сцепления.
  • pc_weapon_ai.gd — решение о применении предметов.
  • race_scene.gd — подключение водителя к гонке и возвращение машин.
  • AI_DEVELOPER_RU.md — подробное объяснение с формулами и адресами функций.

1 comment

+1 more