Подключение новых локаций к моду S.T.A.L.K.E.R. — объединение графа и спавна
Руководство по SDK и подключению пользовательских локаций
В этом руководстве рассмотрим, как подключить новую локацию к существующему моду S.T.A.L.K.E.R., объединить игровые графы, подготовить общий файл спавна и собрать пакет обновления.
Материал предназначен для моддеров, которые уже умеют компилировать собственные уровни и хотят добавить их в готовую сборку, сохранив существующие локации, переходы и игровые объекты.
Содержание
1. Предварительная настройка конфигов
2. Компиляция локации
3. Объединение игрового графа и спавна
4. Сборка общего пакета обновления
5. Замена геометрии без изменения сетки
1. Предварительная настройка конфигов
Самое главное — правильно настроить конфигурационные файлы ещё на этапе подготовки локации в редакторе.
Файл game_graphs.ltx
В конец секции [location_0] добавляем новую локацию по аналогии с уже существующими записями.
Пример из исходного руководства:
Код
[location_0]
000 = "..."
001 = "эскейп"
002 = "свалка"
003 = "агропром"
004 = "агропром-подземка"
005 = "темная долина"
006 = "лаборатория X-18"
008 = "Бар"
009 = "Росток"
010 = "Янтарь"
011 = "лаборатория X-16"
012 = "Милитари"
013 = "Мертвый город"
014 = "Радар"
015 = "Радар бункер"
016 = "Припять"
017 = "станция АЭС"
018 = "ЧАЭС-2"
019 = "бункер выжигателя"
021 = "даркскейп"
Важно!
Новой локации необходимо назначить новый ID, чтобы она не вклинилась в существующую последовательность игрового графа. В примере используется ID 21.
Запомните этот номер: он должен согласовываться с остальными конфигурационными файлами.
Файл game_levels.ltx
В конец секции [levels] добавляем новый уровень, а затем создаём соответствующую подсекцию.
Пример:
Код
[level21]
name = k01_darkscape_ogse
caption = "k01_darkscape_ogse"
offset = 3000.0,1000.0,0.0
id = 21
Здесь:
- name — внутреннее имя локации, соответствующее имени её папки.
- caption — имя, отображаемое на карте.
- offset — смещение на глобальной карте.
- id — идентификатор локации.
В примере используется level21 и ID 21. Согласно исходному руководству, новая локация должна иметь самый большой ID, иначе существующая структура игрового графа может нарушиться.
Файл game_maps_single.ltx
В конец секции [level_maps_single] добавляем имя новой локации:
Код
[level_maps_single]
k01_darkscape_ogse
Затем создаём секцию с настройками карты:
Код
[k01_darkscape_ogse]
texture = map\map_darkscape
bound_rect = -702.00,-704.090,708.500,716.7780
global_rect = 701.0,2072.0,1020.0,2393.0
weathers = default
; music_tracks = l04_darkvalley_musics
Параметры определяют текстуру карты, границы локации, её отображение на карте КПК и используемую погоду.
В исходном руководстве значения global_rect описаны следующим образом:
- Первое значение — ширина текстуры; увеличение сдвигает левый край относительно неподвижного правого.
- Второе значение — длина текстуры; увеличение сдвигает верхний край относительно неподвижного нижнего.
- Третье значение — ширина текстуры; увеличение сдвигает правый край относительно неподвижного левого.
- Четвёртое значение — длина текстуры; увеличение сдвигает нижний край относительно неподвижного верхнего.
2. Компиляция локации
Если геометрия уже компилировалась ранее, можно выполнить сборку в режиме Draft, а затем пересчитать только сетку и перенести файлы *.ai и *.gct в папку готовой локации.
Перед компиляцией необходимо проверить несколько моментов.
Подготовка уровня
- На новой локации не должно быть точки спавна ACTOR. В исходном руководстве указывается, что такая точка должна быть только одна на всю игру.
- Локация должна быть равномерно покрыта Graph Point.
- Желательно заранее создать Graph Point для переходов, чтобы не пришлось позже использовать для этого свободные точки.
После проверки запускаем необходимые BAT-файлы xrAI и последовательно выполняем построение сетки, level graph, game graph и all.spawn.
3. Объединение игрового графа и спавна
Для объединения новой локации с существующим модом понадобятся следующие файлы и инструменты:
Необходимые файлы:
- Старый game.graph мода.
- Game.graph, полученный при компиляции новой локации.
- Старый all.spawn мода.
- All.spawn, полученный при компиляции новой локации.
- Файлы level.ai и level.gct всех локаций, уже присутствующих в моде.
- Полностью подготовленная папка новой локации.
Необходимые утилиты:
- ACDC.
- gg_cdc_x.
- game.graph_recompiler.
Шаг 1. Проверяем положение новой локации в графе
Копируем game.graph, сформированный при компиляции новой локации, в папку с ACDC и выполняем:
Утилита выведет информацию о переходах и игровых вершинах локаций.
В исходном руководстве приводится следующий пример:
Код
l01_escape => 0
l02_garbage => 252
l03_agroprom => 416
l03u_agr_underground => 703
l04_darkvalley => 811
l04u_labx18 => 1109
l05_bar => 1168
l06_rostok => 1308
l08_yantar => 1438
l08u_brainlab => 1529
l07_military => 1545
l10_radar => 1862
l11_pripyat => 2117
l12_stancia => 2273
l12u_sarcofag => 2402
l12u_control_monolith => 2467
l12_stancia_2 => 2517
l10u_bunker => 2661
k01_darkscape_ogse => 2792
Критически важный момент!
Новая локация должна находиться в самом конце списка, после неё не должно быть других локаций.
В данном примере стартовый game vertex новой локации равен 2792. Запишите это значение: оно понадобится при дальнейшей настройке графа.
Если новая локация оказалась в середине списка, необходимо вернуться к настройке конфигов и проверить её ID. В противном случае могут измениться существующие игровые графы и спавн.
Шаг 2. Настраиваем ACDC
Открываем acdc.pl и находим структуру levels_info по тексту constant levels_inf.
Проверяем границы игровых графов, удаляем ненужные записи и добавляем новую локацию в начало списка.
Пример:
Код
use constant levels_info => (
{ gvid0 => 3700, },
{ gvid0 => 2792, name => 'k01_darkscape_ogse' },
{ gvid0 => 2661, name => 'l10u_bunker' },
{ gvid0 => 2517, name => 'l12_stancia_2' },
{ gvid0 => 2467, name => 'l12u_control_monolith' },
{ gvid0 => 2402, name => 'l12u_sarcofag' },
{ gvid0 => 2273, name => 'l12_stancia' },
{ gvid0 => 2117, name => 'l11_pripyat' },
{ gvid0 => 1862, name => 'l10_radar' },
{ gvid0 => 1545, name => 'l07_military' },
{ gvid0 => 1529, name => 'l08u_brainlab' },
{ gvid0 => 1438, name => 'l08_yantar' },
{ gvid0 => 1308, name => 'l06_rostok' },
{ gvid0 => 1168, name => 'l05_bar' },
{ gvid0 => 1109, name => 'l04u_labx18' },
{ gvid0 => 811, name => 'l04_darkvalley' },
{ gvid0 => 703, name => 'l03u_agr_underground' },
{ gvid0 => 416, name => 'l03_agroprom' },
{ gvid0 => 252, name => 'l02_garbage' },
{ gvid0 => 0, name => 'l01_escape' },
);
Сохраняем изменения в acdc.pl. Этот файл понадобится при объединении спавна.
Шаг 3. Объединяем игровые графы
Подготавливаем папку game.graph_recompiler.
В папке levels создаём каталоги всех локаций, которые уже присутствуют в моде, и копируем туда их файлы level.ai и level.gct. Также помещаем туда папку новой локации целиком.
В корень инструмента копируем старый game.graph мода, а новый граф переименовываем в game2.graph.
Теперь необходимо настроить BAT-файл, указав, какие локации брать из первого и второго графа.
Пример из исходного руководства:
Код
ggrc.pl -g1 game.graph,soc -l1 l01_escape,l02_garbage,l03_agroprom,l03u_agr_underground,l04_darkvalley,l04u_labx18,l05_bar,l06_rostok,l08_yantar,l08u_brainlab,l07_military,l10_radar,l11_pripyat,l12_stancia,l12u_sarcofag,l12u_control_monolith,l12_stancia_2,l10u_bunker -g2 game2.graph,soc -l2 k01_darkscape_ogse
pause
Запускаем BAT-файл и дожидаемся завершения обработки.
Если всё прошло успешно, появится файл game.graph.new — объединённый игровой граф.
Проверяем результат
Распаковываем полученный граф с помощью gg_cdc_x и проверяем файлы:
- game.graph.info.cross_edges.ltx — должны сохраниться все существующие переходы.
- game.graph.levels.ltx — новая локация должна находиться в конце и иметь самый большой level_id.
- game.graph.levels_info.ltx — новая локация должна быть последней, здесь также можно проверить минимальный и максимальный game vertex.
Минимальная вершина новой локации должна совпадать с той, которую получили при проверке графа до объединения. В приведённом примере это 2792.
Не пропускайте проверку!
После объединения могут измениться идентификаторы локаций. Сравните значения в game.graph.levels.ltx с идентификаторами из game_graphs.ltx и game_levels.ltx.
Если они отличаются, необходимо скорректировать конфиги в соответствии с итоговым игровым графом.
Шаг 4. Настраиваем переходы между локациями
Желательно создавать crosslevel edge ещё при подготовке новой локации.
После объединения графа необходимо проверить и при необходимости восстановить связи между новой локацией и существующими уровнями.
Общий порядок действий:
1. Распаковываем game.graph, полученный при компиляции новой локации.
2. Находим файл game.graph.edges с идентификатором новой локации.
3. Ищем созданные переходы, помеченные как crosslevel edge. Их можно определить по параметру target_level_id.
4. Копируем записи переходов в отдельный файл.
5. Открываем конфигурацию новой локации в объединённом графе.
6. Находим соответствующие Graph Point по параметру parent_level_vertex_id.
7. Сохраняем исходные записи перед изменением.
8. Обновляем параметры target_level_id, target_level_vertex_id и game_vertex_id согласно данным подготовленных переходов.
9. Проверяем дистанцию между точками перехода.
Для обратных переходов аналогично редактируем графы тех локаций, с которыми связывается новая карта. Необходимо сопоставить соответствующие Graph Point и правильно указать целевые вершины.
После изменений сохраняем конфиги и компилируем граф заново.
Проверить результат можно через:
В списке должны отображаться новые переходы.
Важно: перед редактированием сохраняйте исходные записи Graph Point в отдельные файлы. Это позволит восстановить параметры, если при настройке связей возникнет ошибка.
Шаг 5. Переносим обновлённые файлы графа
После успешной проверки копируем итоговый game.graph в мод.
Также необходимо перенести в пакет новой локации обновлённые файлы:
Код
level.gct
level.graph
level.ai
Дополнительно проверяем, изменились ли файлы level.ai и level.gct уже существующих локаций. Если изменения есть, их тоже нужно включить в итоговый пакет.
4. Объединение all.spawn
Теперь подготовим общий файл спавна мода.
Шаг 1. Подготавливаем конфиги спавна
Берём изменённый ACDC и распаковываем all.spawn, полученный при компиляции новой локации.
Из полученных файлов забираем конфиг новой локации.
Затем распаковываем all.spawn существующего мода и переносим конфиг новой локации в соответствующую папку.
Шаг 2. Обновляем all.ltx
В all.ltx существующего мода прописываем конфиг новой локации и увеличиваем значение level_count на единицу.
Внимание!
В исходном руководстве отдельно подчёркивается: остальные параметры all.ltx изменять не нужно.
Шаг 3. Проверяем нумерацию объектов
Проверяем количество объектов в спавне новой локации.
Затем перенумеровываем объекты в её конфиге так, чтобы они шли после объектов существующего мода и не пересекались с их идентификаторами.
Также проверяем game vertex объектов: они должны находиться в диапазоне вершин, соответствующих новой локации в game.graph.levels_info.ltx.
Шаг 4. Добавляем переходы и собираем спавн
Если все параметры настроены правильно, добавляем в общий спавн точки переходов для главного героя.
После этого собираем all.spawn обратно с помощью используемого инструмента ACDC.
Готовый файл переносим в итоговый пакет обновления.
5. Собираем общий пакет обновления
После объединения графа и спавна необходимо подготовить пакет с обновлёнными файлами.
Конфигурационные файлы:
Код
game_graphs.ltx
game_levels.ltx
game_maps_single.ltx
Файлы новой локации:
Код
level.gct
level.graph
level.ai
Эти файлы должны быть обновлены версиями, полученными после объединения графа.
Также в пакет включаются:
- Папка новой локации.
- Изменённые файлы level.ai и level.gct существующих локаций, если они обновлялись.
- Объединённый game.graph.
- Объединённый all.spawn.
- Необходимые шейдеры.
- Необходимые текстуры.
Перед публикацией рекомендуется проверить целостность пакета и убедиться, что в нём присутствуют все изменённые файлы.
6. Замена геометрии локации без изменения сетки
Если требуется заменить только геометрию уровня, не затрагивая существующую AI-сетку, в исходном руководстве предлагается заменить только перечисленные файлы.
Код
level
level.cform
build_details.dds
level_lods.dds
level_lods_nm.dds
level.details
level.game
level.geom
level.geomx
build.prj
level.wallmarks
Важно!
Этот список приведён по исходному руководству. Перед заменой файлов сделайте резервную копию папки локации и проверьте совместимость файлов с используемой версией SDK и движка.
Заключение
Подключение новой локации к готовому моду требует согласованной настройки конфигов, объединения игровых графов и корректного сведения файлов спавна.
Основные этапы работы:
- Назначить новый ID и прописать локацию в конфигурационных файлах.
- Скомпилировать уровень и проверить его игровые вершины.
- Объединить game.graph с существующим графом мода.
- Проверить и настроить межуровневые переходы.
- Обновить all.spawn и идентификаторы объектов.
- Собрать полный пакет обновления с необходимыми файлами.
Главное правило: перед объединением всегда сохраняйте резервные копии графа, спавна и конфигов. Ошибка в идентификаторах или связях может нарушить работу существующих локаций мода.