Первое, что вам понадобится - это установленный СДК с настроенным аивраппером. Как настроить - подробно описано в шапке темы. Далее необходимо определиться, какие локации вы хотите иметь в своем паке. Рассмотрим такой случай - мы хотим иметь в своей игре три локации: кордон, генераторы и болота ЧН.
1. Подготовка к подключению этих локаций друг к другу.
Кордон в СДК у нас уже есть - мы скопировали туда всю геймдату ТЧ после установки СДК. Копируете генераторы и болота в папку level_editor\gamedata\levels. Если локация была до этого скомпилирована в СДК ТЧ (в нашем случае кордон и генераторы), делать больше ничего не надо, переходите к шагу 2. Если локация из ЧН или ЗП - придется поработать, ДАЖЕ если вы взяли локацию из пака локаций для ТЧ. Рассмортим работу с локацией из ЧН или ЗП на примере болот ЧН:
а) Удалите из папки с локацией level.spawn и level.ltx. После этого в папке с конвертером от бардака (предполагается, что он есть и настроен) создаете батник с таким текстом:
converter -level marsh -mode le
pause
Конвертер декомпилирует болота в формат СДК.
б) Откройте в Actor Editor объект terrain_marsh. Выберите справа Object Items и смотрите, какой шейдер присвоен, если тот, которого не хватает, то присвойте один из оригинальных шейдеров
Пример для воды:
Shader - effects \ water
Compile - def_shaders \ def_vertex
Game Mtl - material \ water
в) Открываете Level Editor. В нем открываете болота. Переходите в раздел objects (панель справа) и удаляете все, кроме объекта terrain (клик по объекту - del). Если у вас не очень сильный компьютер и LE зависает при открытии - удалите все объекты, кроме террейна в папке rawdata\objects\levels\marsh.
г) Ставите на карту light. Нажимаете вкладку light, потом сверху слева кнопку "чайник" и потом кликаете куда-нить на локу
д) Теперь нажмите glow, и аналогичным образом ставите на локу glow. В появившемся окне со свойствами glow выберете textures, где задайте текстуру glow_04.
е) Поставьте граф-поинты. Для этого перейдите в spawn element ai > graph point и поставьте по уровню некоторое количество граф-поинтов. Чем больше, тем лучше, однако слишком усердствовать не стоит. Ставить необходимо в местах скопления сталкеров и по предполагаемым путям их хождения. Сотни граф-поинтов вполне хватит. Один из графов, где вы хотите сделать появление ГГ при переходе с другой локации, можете назвать start_actor_01.
ж) Ставите низкое качество компиляции. Затем зайдите scene > options, после чего переименуйте name prefix и level path в название локации
з) Делаете лоды. Заходите objects > objects library, там, где написано Preview, есть окошко. Нажмите туда, после чего в доп окошке Object Library перейдите в levels > marsh. Там нажмите на объект marsh_lod0000, после этого нажмите make lod (low quality), потом yes. Вылезет еще окошко - Select Library Objects, теперь опять levels > marsh и там плюсиками выберите все лоды локации. После этого - ок.
и) Добавьте на локацию какой-нибудь объект - например, автомат. Если этого не сделать, аивраппер потом будет капризничать.
к) Компилируете на низшем качестве - Make Game и Build.
л) Последний шаг - скомпилируйте геометрию. Создайте в папке level_editor батник
@start bins\compiler\xrLC.exe -f marsh
и дождитесь окончания.
На этом все. Переходим к шагу 2.
2. Работа с аивраппером.
Перед началом работы с авираппером, необходимо показать ему, с какими локами ему работать. Вам нужно править три файла: game_graphs.ltx, game_levels.ltx и games_maps_single.ltx. Все они лежат в папке level_editor\gamedata\config. Разберем содержимое каждого файла
----game_graphs.ltx-----
[location_0]
000 = "..."
001 = "l01_escape"
002 = "generators"
003 = "marsh"
<в секции location_0 необходимо составить список своих локаций. Остальное не трогаем>
[location_1]
000 = "..."
001 = "ограниченный доступ"
002 = "запрещенный доступ"
[location_2]
000 = "..."
001 = "не для игрока"
[location_3]
000 = "..."
----game_levels.ltx-----
[levels]
level01
level02
level03
<Записываете свои локации по такому образцу>
[level01]
name = L01_Escape
caption = "L01_Escape"
offset = 3000.0, 1000.0, 0.0
id = 01
[level02]
name = generators
caption = "generators"
offset = 1000.0, 1000.0, 6000.0
id = 02
[level03]
name = marsh
caption = "marsh"
offset = 2000.0, 1000.0, 0.0
id = 03
----game_maps_single.ltx-----
[level_maps_single]
L01_escape
generators
marsh
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[level_music_tracks]
music\amb01 = 0, 12, 0.5, 10,20
music\amb03 = 0, 12, 0.5, 10,15
music\amb07 = 12,24, 1.0, 5, 25
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[global_map]
texture = ui\ui_global_map --не трогаем!
bound_rect = 0.0,0.0, 1024, 2634.0 --не трогаем!
max_zoom = 6.0 --не трогаем!
[l01_escape]
texture = map\map_escape --путь к текстуре мини-карты для вашей локации
bound_rect = -317.164, -633.718, 404.880, 811.627 --координаты внутри локации в формате: минимальная X, минимальная Y, максимальная X, максимальная Y
global_rect = 355.0,2011.0, 576.0,2453.000000 --координаты локации на глобальной карте в формате: северо-западный угол - юго-восточный угол.
weathers = default --погодный пресет. Ставьте default, если не делали своего.
music_tracks = l01_escape_musics --амбиентные звуки на локации.
[generators]
texture = map\map_generators
bound_rect = -351.81, -639.389, 352.818, 65.245
global_rect = 300.0,500.0, 400.0,600.0
weathers = stancia
[marsh]
texture = map\map_marsh
global_rect = 22.0, 2113.0, 352.0, 2443.000000
bound_rect = -445.000000,-445.000000,755.000000,755.000000
weathers = boloto
С файлами разобрались. Теперь разберемся с аивраппером. Если ваша локация делалась с нуля в СДК, или вы работаете с локациями ЧН и ЗП, то для каждой из таких локаций нужно сначала просчитать АИ-сетку. В нашем случае это Болота. Создаем и запускаем такие батники в папке с аивраппером:
а) Сборка черновой сетки ИИ:
aiwrapper -draft -f marsh
После окончания работы аивраппера вы получите следующий файл: gamedata\levels\<имя_уровня>\level.ai.
б) Проверка связности сетки ИИ:
aiwrapper -verify marsh
в) Просчёт укрытий для сетки ИИ.
aiwrapper -f marsh
Вообще, этот шаг необязателен на ранних этапах тестирования карты.
г) Сборка ИИ-графа:
aiwrapper -g marsh
После окончания работы аивраппера вы получите следующий файл: gamedata\levels\<имя_уровня>\level.{graph|gct.raw}
Далее нужно соединить наши локации аивраппером в единое целое. Для этого создаем и запускаем такие батники в папке с аивраппером:
а) Склейка ИИ-графов карт в глобальный игровой граф:
> aiwrapper -m
На выходе: gamedata\game.graph и gamedata\levels\*\level.gct
б) Сборка all.spawn
> aiwrapper -s
На выходе: gamedata\spawns\all.spawn
Если все прошло удачно - поздравляю. Однако еще не все.
3. Пересборка all.spawn. Если вы не работаете с локами ЧН или ЗП - пропускайте этот шаг.
Аивраппер собрал нам all.spawn - это замечательно. Однако от локации ЧН или ЗП у нас в спавне только автомат, что мы воткнули в LE. Нет ламп и источников света, нет лестниц. Чтобы привести локацию в более-менее приличный вид, нужно пересобрать спавн.
а) Первым делом, распакуйте получившийся спавн. Для этого качаем отличную тулзу acdc и открываем файл acdc.pl. Там найдите подобную таблицу:
use constant levels_info => (
{ gvid0 => 600, },
{ gvid0 => 329, name => 'marsh' },
{ gvid0 => 252, name => 'generators' },
{ gvid0 => 0, name => 'l01_escape' },
);
Оставляете только те локации, что мы объединяем. Меняем параметр gvid0 на начальный геймвертекс вашей локации. Узнать эти вертексы просто - в папке с acdc должна быть тулза ggtool.pl. Берете получившийся при работе аивраппера game.graph (из папки level_editor\gamedata) и кидаете его в папку с ggtool.pl. После чего создаем и запускаем такой батник:
ggtool.pl game.graph >svyazi.txt
После окончания работы тулзы открываете появившийся файл svyazi.txt и там смотрите начальные вертексы. Верхнее ограничение по вертексам (gvid0 => 600) высчитывается примерно как вертекс от последней локи + 300-400 (возьмем с запасом).
После правки acdc.pl кидаете в папку с ним получившийся all.spawn (из папки level_editor\gamedata\spawns). После этого декомпилируете all.spawn. Открываете файл alife_marsh.ltx (наша ЧН-локация). Распакуйте оригинальный спавн той игры, откуда выдернули локацию (у нас ЧН), и открываете файл наше локации. Теперь основная задача - перенести из оригинального спавна в наш секции следующего типа:
section = climable_object (это лестницы)
section = lights_hanging_lamp (источники света)
Вообще, можете переносить хоть все - зависит от того, хотите ли вы получить чистую локацию или с оригинальным спавном. Единственный совет - не копируйте секции breakable_object и проверяйте визуал в секциях lights_hanging_lamp. Наличие breakable_object или ссылок на визуалы ламп, которых нет в ТЧ, приведет к вылетам Invalid vertex type for skinned object. Лечение пока не найдено.
Еще одно замечание - правьте game_vertex_id у переносимых секций. Значение гейм-вертекса должно соответствовать локации. В нашем примере, кордону соответствуют вертексы 0-252, генераторам - 252-329, болотам - больше 329 (смотрим acdc.pl).
На этом все. Если хотите, сделайте переходы между локациями. Компилируете all.spawn
4. Создание АИ-переходов.
Поскольку сборку мы создаем для дальнейшего моддинга, нам необходимы АИ-переходы. Эти переходы позволяют неписям переходить с локи на локу. Даже если вы не собираетесь отправлять ваших квестовых неписей на другю локацию, без аи-переходов невозможен полноценный оффлайн-алайф. Поэтому сделаем их.
Делать Аи-переходы можно двумя способами. Первый - вместо aiwrapper -m сделать aiwrapper -m2 links.fixed. В файле links.fixed здесь указываются соединяемые вертексы разных локаций. Однако, я больше привык использовать второй способ - работать с утилиткой Колмогора - edge_add, ее и опишу.
Кладете свой game.graph в папку с edge_add.exe. Создаем батник, где прописываем следующее:
edge_add.exe game.graph 37 300
del game.graph
rename game.graph.new game.graph
edge_add.exe game.graph 45 400
del game.graph
rename game.graph.new game.graph
edge_add.exe game.graph 320 420
del game.graph
rename game.graph.new game.graph
Числа - это соединяемые вертексы локаций. Здесь написаны наобум, когда будете делать сами - выбирайте вертексы поближе к краям лок, там, где непись бы логично мог пройти.
После запуска и окончания работы утилитки получаем готовый game.graph
5. Правка карт освещения.
Этот шаг выполняется только для локаций из ЧН или ЗП, и только в том случае, если вы брали локу из оригинальной игры. Если это ваш случай, начнем. А если брали из пака лок для ТЧ - делать шаг НЕ НАДО.
Открываете папку с локацией там, где вы ее брали. Находим такие файлы lmap*_1.dds и lmap*_2.dds. Наша задача - чтобы в r1 и r2 не было некрасивых жутко черных теней.
Работаем через программу paint.net (требует установленного .Net Framework v2.0), кто умеет, может делать через фотошоп.
В папке с уровнем будем редактировать лайтмапы:
lmap*_1.dds - снижаем контраст на 15 единиц и сохраняем в формате dxt5 без мипмапов, с ними все
lmap*_2.dds переделывать сложнее - задача сделать менее прозрачным. Пересохраняем как dds в формате R5G6B5, прозрачность исчезнет совсем. Открываем снова и меняем прозрачность с 255 до 30, затем снижаем контраст на 15 единиц и сохраняем в формате dxt5 без мипмапов.
6. Вставка локаций в игру.
Нам необходимы следующие файлы:
configs\game_graphs.ltx
configs\game_levels.ltx
configs\game_maps_single.ltx
levels\l01_escape\
levels\generators\
Копируйте эти файлы в геймдату игры из геймдаты СДК. Также нужны файлы game.graph и spawns\all.spawn, их берете оттуда, где с ними работали.
Мы пока не скопировали паку с болотами. У лок из ЧН или ЗП несколько другой порядок копирования в геймдату игры:
--Берете папку marsh из оригинала, где брали ее изначально. Если берете из оригинальной игры - проверьте, что сделали шаг 5.
--Копируете в геймдату игры в папку levels
--из папки level_editor\gamedata\levels\marsh копируете с заменой два файла - level.gct и level.ai - в папку marsh в геймдате игры.
Все, теперь все готово. Можете запускать игру. Могут быть вылеты по шейдерам или текстурам - это нормально. Просто вставьте в геймдату игры недостающие текстуры и добавьте недостающие шейдеры с помощью Shader Editor.
Маленький совет: если ваша локация уже есть в оригинальной игре (у нас кордон), для уменьшения веса сборки всю папку levels\l01_escape копировать необязательно. Достаточно лишь скопировать файл level.gct из папки кордона в СДК в папку levels\l01_escape.
При составлении данного тутора использовались туторы от KostyaV, D1m0n и HitmanNew, а также ридми к программам от Колмогора и Бардака.
Автор - KD87 (АМК-форум)