Компиляция AI в S.T.A.L.K.E.R. — создание ИИ-сетки и переходов между локациями
ВНИМАНИЕ!
Данная статья в значительной степени устарела. Информация предназначена для ознакомления с принципами компиляции AI, настройки графов и подключения пользовательских уровней в S.T.A.L.K.E.R.
КАТЕГОРИЧЕСКИ ПРЕДУПРЕЖДАЕМ!
Использование устаревших и содержащих ошибки утилит AiCompiler и AiWrapper строго не рекомендуется автором исходного руководства.
Рекомендация: используйте официальный xrAI для SDK 0.4 от разработчиков игры. За дополнительной информацией обращайтесь к материалам AMK Forum.
Содержание
1. Основы компиляции AI
2. Создание ИИ-сетки
3. Настройка конфигурационных файлов
4. Компиляция нескольких уровней
5. Добавление собственного уровня в одиночную игру
6. Настройка переходов через ACDC
7. Отображение перехода на карте
8. Список необходимых программ
1. Основы компиляции AI
Итак, приступим! Если вы открыли это руководство, значит, у вас есть причина разобраться с компиляцией AI: вы начинающий моддер, хотите освежить старые знания или уже работаете с собственными уровнями и хотите расширить свои возможности.
Для начала скомпилируем уровень с AI и монстрами на карте mp_atp.
Шаг 1. Подготовка уровня
Открываем уровень в редакторе. Первым делом удаляем все rpoint — мультиплеерные точки появления игроков.
Шаг 2. Добавление актёра
Создаём объект Spawn elements → actor. При необходимости в свойствах объекта, в поле Custom Data, прописываем стартовое оружие:
Теперь при появлении игрок будет вооружён АК-74.
Шаг 3. Добавление монстра
Добавляем на уровень любого монстра, например кровососа, и размещаем его в нужной точке карты.
Шаг 4. Создание AI Map
ИИ-сетка необходима для того, чтобы NPC и монстры могли ориентироваться на уровне.
1. Нажимаем Object и выбираем поверхность земли.
2. Переходим в AI Map → Commands → Make list from selected.
3. В разделе AI Map Nodes нажимаем Add.
4. Добавляем узлы с помощью кнопки в левом верхнем углу редактора.
5. Расставляем ноды в нужном порядке.
6. Нажимаем Generate Full.
После этого AI-сетка будет сгенерирована.
Шаг 5. Добавление Graph Point
На уровне обязательно должен присутствовать хотя бы один Graph Point:
Spawns → AI → Graph Point
В простом примере имя можно не указывать, если оно не требуется для дальнейшей настройки.
Сохраняем уровень и выполняем Build.
После этого необходимо скомпилировать карту. В исходном руководстве для этого используется отдельная утилита и предварительно созданный диск X:.
2. Настройка конфигурационных файлов
После компиляции необходимо настроить конфиги. В исходном руководстве они находятся в папке gamedata\configs SDK. После настройки необходимые файлы переносятся в соответствующую папку игры.
Файл game_maps_single.ltx
Добавляем название уровня в секцию [level_maps_single]:
Код
[level_maps_single]
testing_ai
[testing_ai]
global_rect = -6,1220.0,248.0,1481.0
texture = map\map_escape
bound_rect = -502.148,-412.284,379.976,474.479
weathers = default
Здесь testing_ai — название пользовательского уровня, texture — текстура карты загрузки, а weathers — используемая погода.
Файл game_levels.ltx
Добавляем уровень и назначаем ему уникальный идентификатор:
Код
[levels]
level190
[level190]
name = testing_ai
caption = "testing_ai"
offset = 2000.0,800.0,1000.0
id = 190
Параметр offset определяет положение уровня на глобальной карте. Значение id должно быть уникальным.
Файл game_graphs.ltx
Добавляем запись уровня:
Номер необходимо согласовать с используемой конфигурацией игры.
Компиляция уровня
В исходном руководстве используется AI Compiler. Необходимо указать папку SDK или Level Editor и выбрать подготовленный уровень.
Далее выполняются этапы компиляции:
1. Предварительный расчёт AI-сетки.
2. При необходимости — расчёт укрытий NPC.
3. Построение графа и кросс-таблицы уровня.
4. Построение игрового графа.
5. Создание файла спавна.
После завершения компиляции в папке gamedata\spawns файл test.spawn в примере переименовывается в all.spawn.
Важно!
Если SDK не объединён с игрой, необходимо перенести следующие файлы:
Код
gamedata\config\game_maps_single.ltx
Код
gamedata\config\game_graphs.ltx
Код
gamedata\config\game_levels.ltx
Код
gamedata\levels\папка_вашего_уровня
Код
gamedata\spawns\all.spawn
Отсутствие game.graph может приводить к вылету при запуске игры.
Также проверьте, что в конфигурации указаны существующая погода и корректная текстура загрузки.
Пример BAT-файла из исходного руководства
Код
@start bin\XR_3DA.exe -start server(%1/single/alife) client(localhost)
При использовании такого способа запуска имя файла спавна должно соответствовать имени уровня. Проверьте совместимость команды с используемой версией движка.
3. Компиляция нескольких уровней и настройка переходов
Теперь рассмотрим создание переходов между двумя уровнями: atp_1 и atp_2.
Настройка первого уровня — atp_1
Создаём объект AI → Level Changer, затем добавляем Shape → Sphere и увеличиваем сферу с помощью Scale до необходимого размера.
Переключаемся в режим редактирования Spawn Elements, выделяем Level Changer и выбираем Commands → Attach Object. После этого привязываем к нему сферу.
В свойствах Level Changer указываем название, например to_atp_2.
В поле Custom Data прописываем путь возврата на случай отказа игрока от перехода:
Код
[pt_move_if_reject]
path = atp_1_way_if_reject
В поле Level to change указываем atp_2.
В поле Level Point to change задаём точку появления игрока на втором уровне — start_actor_01.
Параметр Restrictor Type зависит от версии движка. Старые рекомендации по его настройке необходимо проверять на используемой версии игры.
Создание Graph Point
Создаём Graph Point с именем:
Затем создаём точку связи между уровнями:
Код
Name: exit_atp_1_01
Location: "экскейп"
Connection:
Level name: atp_2
Point name: exit_atp_2_01
Точка exit_atp_1_01 связывает первый уровень со вторым.
Создание Way Points
Создаём путь из двух Way Point рядом с Level Changer.
1. Открываем Way Points.
2. Добавляем первую точку.
3. Включаем Point Mode и создаём вторую точку.
4. Если точки не связались автоматически, используем Create 1-link.
5. В свойствах пути указываем имя atp_1_way_if_reject.
Имя пути должно совпадать с указанным в Custom Data объекта Level Changer.
Настройка второго уровня — atp_2
Повторяем создание пути и называем его atp_2_way_if_reject.
Создаём Level Changer с именем to_atp_1 и прописываем:
Код
[pt_move_if_reject]
path = atp_2_way_if_reject
В Level to change указываем atp_1, а в Level Point to change — start_actor_01.
Создаём Graph Point start_actor_01, затем точку связи:
Код
Name: exit_atp_2_01
Location: "свалка"
Connection:
Level name: atp_1
Point name: exit_atp_1_01
Важно!
Согласно исходному руководству, ACTOR должен находиться только на одной локации во время подготовки и компиляции. В противном случае компилятор может выдать ошибку.
Компиляция двух уровней
Сохраняем и предварительно компилируем оба уровня. В примере используются следующие команды:
Код
@start /wait bins\ai\1.exe -g atp_1
Код
@start /wait bins\ai\1.exe -g atp_2
После построения графов создаём общий игровой граф:
Код
@start /wait bins\ai\1.exe -m
Затем собираем all.spawn:
Полученный файл помещаем в gamedata\spawns\ и при необходимости переименовываем в all.spawn.
Перед компиляцией рекомендуется временно переместить остальные уровни из папки levels, включая мультиплеерные, чтобы избежать ошибок при построении графов.
4. Добавление пользовательского уровня в одиночную игру
Теперь рассмотрим подключение собственного уровня к оригинальным локациям игры.
В примере используется пользовательский уровень test_level_x и оригинальная локация L01_Escape.
Подготовка Graph Point
На пользовательском уровне создаём точку связи:
Код
Name: point_test_location_escape
Connection:
Level Name: L01_Escape
Point Name: esc_graph_point_0034
Затем создаём точку появления игрока:
В исходном руководстве рекомендуется не размещать ACTOR на пользовательском уровне на этом этапе.
Добавляем на карту уникальный объект, например машину. Его параметры понадобятся для последующей настройки перехода.
Сохраняем уровень, выполняем предварительную компиляцию и необходимые этапы построения AI-графа.
Получение параметров уровня
Для дальнейшей настройки понадобятся:
- level_vertex_id;
- game_vertex_id;
- position — координаты объекта;
- direction — направление взгляда игрока.
В исходной статье для получения этих значений используется скрипт Info_LVID_GVID от bardak. Полученные параметры необходимо записать и использовать при настройке level changer.
Подготовка графов оригинальных уровней
После распаковки игры и подготовки инструментов выполняем команду:
Код
aiwrapper -extract_spawns
В исходном руководстве она используется для обновления файлов спавна оригинальных уровней.
Затем создаём список графов:
Код
aiwrapper -dump_graph graphs.txt
В файле graphs.txt находим esc_graph_point_0034 и проверяем, можно ли использовать эту точку для подключения пользовательского уровня.
Создаём текстовый файл links_fixed.txt со следующим содержимым:
Код
[l01_escape]
; Добавляем переход с Кордона на тестовый уровень
esc_graph_point_0034 = test_level_x, point_test_location_escape
test_level_x — название пользовательского уровня, а point_test_location_escape — имя точки связи на нём.
Выполняем команду:
Код
aiwrapper -m2 links_fixed.txt
Она используется в исходном руководстве для построения глобального игрового графа с учётом дополнительных связей.
Проверка game_vertex_id
Для проверки межуровневых связей в исходной статье предлагается использовать утилиту ggtool.pl.
Код
ggtool.pl game.graph >svyazi.txt
В файле svyazi.txt можно увидеть связи между уровнями и значения game_vertex_id.
Пример:
Код
l01_escape (0) --1206.29--> l02_garbage (415)
Здесь 0 и 415 — идентификаторы игровых вершин, а 1206.29 — расстояние между точками связи.
5. Настройка level changer через ACDC
После построения игрового графа создаём all.spawn:
Полученный файл копируем в папку utils инструмента ACDC и разбираем его на LTX-файлы:
Нас интересует файл alife_l01_escape.ltx.
В него добавляем новую секцию level_changer. Пример ниже демонстрирует структуру объекта из исходного руководства. Значения необходимо заменить на параметры своей карты.
Код
[не_занятый_номер]
section_name = level_changer
name = exit_to_new_location_from_esc
position =
direction = 0,0,0
game_vertex_id =
distance = 14.6999998092651
level_vertex_id = -1
object_flags = 0xffffff3e
custom_data = <<END
[pt_move_if_reject]
path = esc_way_test_if_reject
END
story_id =
shapes = shape0
shape0:type = box
shape0:axis_x = 5.8284006118774,0,0
shape0:axis_y = 0,5.0005970001221,0
shape0:axis_z = 0,0,5.3902206420898
shape0:offset = 0,0,0
restrictor_type = 3
dest_game_vertex_id =
dest_level_vertex_id =
dest_position =
dest_direction = 0,-1.12671363353729,0
dest_level_name = test_level_x
dest_graph_point = start_actor_01
Основные параметры
- position — координаты перехода на исходном уровне.
- direction — направление объекта.
- game_vertex_id — идентификатор игровой вершины исходного уровня.
- level_vertex_id — идентификатор вершины ИИ-графа.
- story_id — уникальный идентификатор объекта.
- dest_game_vertex_id — игровая вершина целевого уровня.
- dest_level_vertex_id — вершина ИИ-графа целевого уровня.
- dest_position — координаты появления игрока.
- dest_level_name — название целевого уровня.
- dest_graph_point — имя точки появления игрока.
Все параметры необходимо сверить с данными скомпилированных уровней. Неправильные идентификаторы могут привести к ошибкам и вылетам.
Создание Way Points в LTX
Открываем way_l01_escape.ltx и добавляем путь, имя которого указано в Custom Data.
Код
[esc_way_test_if_reject]
points = p0,p1
p0:name = name_test1
p0:position = -243.491257,-19.758562,-140.328583
p0:game_vertex_id = 8
p0:level_vertex_id = -1
p0:links = p1(1)
p1:name = name_test2
p1:position = -255.491257,-19.758562,-140.328583
p1:game_vertex_id = 9
p1:level_vertex_id = -1
Координаты в этом примере приведены только для демонстрации структуры. Для своей карты используйте реальные координаты.
Финальная сборка
После внесения изменений выполняем:
Полученный файл all.spawn.new копируем в gamedata\spawns\ и переименовываем в all.spawn.
После этого запускаем новую игру и проверяем работу перехода.
6. Отображение перехода на карте
Если необходимо, чтобы переход отображался на карте игрока, исходное руководство предлагает внести изменения в level_tasks.script, в функцию add_lchanger_location().
Пример:
Код
-- test_level_x
local obj = sim:story_object(8435)
if obj then
level.map_add_object_spot(obj.id, "level_changer", "exit_to_new_location_from_esc")
end
В примере используются story_id 8435 и имя перехода exit_to_new_location_from_esc. Они должны совпадать с параметрами вашего level changer.
В исходной статье рекомендуется использовать уникальный story_id, не занятый другими объектами.
7. Список необходимых программ
- AiCompiler 0.1 от Neo.
- AiWrapper от bardak.
- Info_LVID_GVID — скрипт от bardak.
- SDK 0.4 от GSC.
- SDK Update от Neo и GSC.
- Fixed Shaders от Haron.
- Патч для SDK 0.3 от Haron.
Заключение
Компиляция AI в S.T.A.L.K.E.R. включает подготовку ИИ-сетки, создание графов уровня, настройку межуровневых связей и сборку файлов спавна.
Для подключения собственной локации к оригинальной игре необходимо правильно настроить Graph Point, параметры level changer, координаты и точки появления игрока.
Важно: руководство основано на старых инструментах и примерах. Перед использованием проверяйте совместимость со своей версией SDK и движка. Перед изменением игровых файлов обязательно создавайте резервные копии.