Подключение локаций к ЧН и ЗП с помощью программы от AMK Team — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→Сборка геймдаты.) |
(Важное дополнение) |
||
(не показаны 46 промежуточные версии 18 участников) | |||
Строка 1: | Строка 1: | ||
− | + | =ВНИМАНИЕ!= | |
+ | Данная статья в значительной степени устарела. | ||
+ | ==КАТЕГОРИЧЕСКИ предупреждаем== | ||
+ | Использование устаревшей и забагованной утилиты '''ggEditor''' - '''СТРОГО ВОСПРЕЩАЕТСЯ!''' | ||
+ | Используйте только официальный софт от разработчиков игры, а именно "X-Ray SDK" | ||
+ | За более подробной информацией обратитесь на [http://www.amk-team.ru/forum/ AMK форум] | ||
+ | <hr> | ||
+ | В данном уроке мы полностью подключим локацию к игре. | ||
+ | |||
+ | |||
+ | == Инструменты и ресурсы == | ||
+ | |||
+ | Интерпретатор Perl:<br /> | ||
+ | [http://www.activestate.com/activeperl/downloads ActivePerl]<br /> | ||
+ | Скрипты для редактирования all.spawn:<br /> | ||
+ | [http://stalkerin.gameru.net/downloads/stutils/acdc_40109.rar ACDC for SoC v.1.0004]<br /> | ||
+ | [http://stalkerin.gameru.net/downloads/stutils/acdc_for_clear_sky_4.rar ACDC for CS v.1.5.04]<br /> | ||
+ | [http://stalkerin.gameru.net/modules.php?name=Downloads&d_op=getit&lid=363 ACDC for CoP]<br /> | ||
+ | или<br /> | ||
+ | [http://stalkerin.gameru.net/modules.php?name=Downloads&d_op=viewtheoned&lid=455 универсальный ACDC]<br /> | ||
+ | Скрипты для редактирования графов:<br /> | ||
+ | [http://stalkerin.gameru.net/modules.php?name=Downloads&d_op=viewtheoned&lid=453 ggTool]<br /> | ||
+ | [http://stalkerin.gameru.net/downloads/stutils/soc-cop-maps_soft.7z ggEditor v.0.1]<br /> | ||
+ | |||
+ | Распакованные ресурсы ТЧ или мода, из которого взят уровень (если вы берете уровень из мода, то вам наверняка не подойдет простой ACDC). | ||
+ | |||
+ | |||
+ | == Подготовка. == | ||
+ | |||
+ | Устанавливаем интерпретатор '''ActivePerl'''. | ||
+ | |||
+ | Заходим в папку с программой ggEditor. Создаем там папки ''CS'' или ''CoP'' (смотря на какую игру делаете) и папку ''SoC''.В папке ''SoC'' создаем папку ''gamedata'' и кидаем в нее файл '''game.graph''' (важно, чтобы '''game.graph''' лежал там, иначе программа не прочитает!) из мода, или от ТЧ. В папке ''gamedata'' создаем папку ''levels'' и кидаем туда папку с уровнем, который мы хотим портировать. Далее возвращаемся в папку ''SoC'' и туда кидаем папку с ACDC для ТЧ, туда же кладём '''all.spawn'''.Запускаем соответствующий батник для распаковки '''all.spawn'''`а. | ||
+ | |||
+ | Далее в папку ''ggEditor_01\CoP'' или ''ggEditor_01\CS'', кидаем папку с соответствующим ACDC, опять-же кладем туда '''all.spawn''', распаковываем. | ||
+ | |||
+ | В итоге у нас должно получиться 2 распакованных '''all.spawn'''`а, '''game.graph''' от ТЧ и папка с переносимым уровнем. | ||
+ | |||
+ | С приготовлениями всё. | ||
+ | |||
+ | == Основная работа. == | ||
+ | |||
+ | Запускаем программу ggEditor. Видим там два окошка. В левом открываем game.graph от ТЧ, а в правом — от ЗП или ЧН (в ЗП и ЧН граф вшит в '''all.spawn''', ищите его там. Нужно выбрать тип файлов для ЧН — '''graph.bin''', а для ЗП — все файлы и открыть в папке с ACDC файл '''section4.bin'''). В окошках мы видим список уровней. В левом окошке находим нужный нам уровень и нажимаем на соответствующую стрелку для переноса уровня в нужный нам граф. Нажимаем в правом окошке «сохранить». После того, как граф сохранился, можно закрыть программу, она нам больше не понадобится. Потом этого шагаем в папку с ACDC для ЧН/ЗП и удаляем старые файлы '''section4.bin''' или '''graph.bin'''. Затем переименовываем файлы '''graph.bin.new''' или '''section4.bin.new''' в '''graph.bin''' и соответственно '''section4.bin'''. | ||
+ | |||
+ | Далее идем в папку с ACDC от ТЧ, находим там файл '''alife_наша_локация''' и копируем его. Затем шуруем в папку с ACDC от ЧН/ЗП, вставляем скопированный нами файл. Открываем этот файл, сносим все, оставляем только одну секцию спавна (лучше всего, если это будет какой-нибудь объект), присваиваем секции номер не меньше 20000, сворачиваем на время этот файл. Далее нужно подогнать вертексы. Для этого запускаем '''ggTool.bat''', ждем некоторое время, после чего в '''parse_lvids.ltx''' появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией (в ЧН это скорее всего будет 1620, а в ЗП 934). Далее разворачиваем '''alife_''' файл с нашей локацией, ищем там строку ''game_vertex_id'' и пишем там число, которое появилось рядом с нашей локацией при запуске батника ggTool. <span style="color: gray">А вот строку ''level_vertex_id'' трогать не следует, т.к. вершины уровня в нашем случае остаются неизменными. [[Участник:RedPython|RedPython]] 10:04, 21 ноября 2010 (UTC) </span> Мы подогнали вертексы. | ||
+ | |||
+ | Затем открываем файл '''all.ltx'''. Вписываем туда свой '''alife_''' файл локации, '''way_''' файлы не трогаем. Меняем на соответствующее количество локаций строку '''level_count'''. | ||
+ | |||
+ | После этого открываем файл '''alife_zaton''' (для ЗП) или '''alife_marsh''' (для ЧН) и ищем там ГГ по строке ''section_name = actor''. Нашли? Отлично. Теперь присваиваем этой секции спавна позицию (новую позицию прописываем также в строке ''upd:position = '') и вертексы как у единственного предмета в файле '''alife_новая_локация'''. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле '''alife_новая_локация'''. | ||
+ | |||
+ | Мы почти закончили с пробной сборкой новой локации (пока без переходов на другие уровни). | ||
+ | |||
+ | Осталось только прописать наш новый уровень в файл ''ACDC_CoP\acdccop.pl'' (для ЗП), либо в файле ''ACDC_CS\stkutils\level.pm''. | ||
+ | |||
+ | В этих файлах ищем такие строки (для ЗП): | ||
+ | |||
+ | <perl> | ||
+ | use constant levels_info => ( | ||
+ | { gvid0 => 934, }, | ||
+ | { gvid0 => 883, name => 'jupiter_underground' }, | ||
+ | { gvid0 => 857, name => 'labx8' }, | ||
+ | { gvid0 => 666, name => 'pripyat' }, | ||
+ | { gvid0 => 317, name => 'jupiter' }, | ||
+ | { gvid0 => 0, name => 'zaton' }, | ||
+ | </perl> | ||
+ | |||
+ | И если у вас число, когда мы запускали батник '''ggTool''', тоже 934, то прописываем так: | ||
+ | |||
+ | <perl> | ||
+ | use constant levels_info => ( | ||
+ | { gvid0 => 934, name => 'ваша_локация' }, | ||
+ | { gvid0 => 883, name => 'jupiter_underground' }, | ||
+ | { gvid0 => 857, name => 'labx8' }, | ||
+ | { gvid0 => 666, name => 'pripyat' }, | ||
+ | { gvid0 => 317, name => 'jupiter' }, | ||
+ | { gvid0 => 0, name => 'zaton' }, | ||
+ | </perl> | ||
+ | |||
+ | А в файле '''level.pm''' от ACDC ЧН вы увидите такой текст: | ||
+ | |||
+ | <perl> | ||
+ | use constant levels_info => ( | ||
+ | { gvid0 => 1620, }, | ||
+ | { gvid0 => 1573, name => 'l12_hospital' }, | ||
+ | { gvid0 => 1565, name => 'l11_stancia2' }, | ||
+ | { gvid0 => 1524, name => 'l10_limansk' }, | ||
+ | { gvid0 => 1511, name => 'l09_agroprom_undeground' }, | ||
+ | { gvid0 => 1313, name => 'l08_military' }, | ||
+ | { gvid0 => 1212, name => 'l07_yantar' }, | ||
+ | { gvid0 => 1057, name => 'l06_agroprom' }, | ||
+ | { gvid0 => 961, name => 'l05_red_forest' }, | ||
+ | { gvid0 => 743, name => 'l04_darkvalley' }, | ||
+ | { gvid0 => 472, name => 'l03_escape' }, | ||
+ | { gvid0 => 245, name => 'l02_garbage' }, | ||
+ | { gvid0 => 0, name => 'l01_marsh' }, | ||
+ | </perl> | ||
+ | |||
+ | Прописать там свой уровень нужно точно так-же как в файле от ACDC ЗП: | ||
+ | |||
+ | <perl> | ||
+ | use constant levels_info => ( | ||
+ | { gvid0 => 1620, name => 'ваша_локация' }, | ||
+ | { gvid0 => 1573, name => 'l12_hospital' }, | ||
+ | { gvid0 => 1565, name => 'l11_stancia2' }, | ||
+ | { gvid0 => 1524, name => 'l10_limansk' }, | ||
+ | { gvid0 => 1511, name => 'l09_agroprom_undeground' }, | ||
+ | { gvid0 => 1313, name => 'l08_military' }, | ||
+ | { gvid0 => 1212, name => 'l07_yantar' }, | ||
+ | { gvid0 => 1057, name => 'l06_agroprom' }, | ||
+ | { gvid0 => 961, name => 'l05_red_forest' }, | ||
+ | { gvid0 => 743, name => 'l04_darkvalley' }, | ||
+ | { gvid0 => 472, name => 'l03_escape' }, | ||
+ | { gvid0 => 245, name => 'l02_garbage' }, | ||
+ | { gvid0 => 0, name => 'l01_marsh' }, | ||
+ | </perl> | ||
+ | |||
+ | <span style="color: gray">По идее, в levels_info следует прописать также верхнюю вершину последнего уровня. [[Участник:RedPython|RedPython]] 10:04, 21 ноября 2010 (UTC) </span> | ||
+ | |||
+ | Всё. Собираем '''all.spawn'''. | ||
+ | |||
+ | |||
+ | == Сборка геймдаты. == | ||
+ | |||
+ | Осталось собрать gamedata`у для игры и посмотреть, что получилось. | ||
+ | Итак, приступим. | ||
+ | |||
+ | В папке с игрой создаем папку ''gamedata'', а в ней папки ''configs'', ''levels'', ''spawns''. В папку ''spawns'' кладем получившийся при сборке '''all.spawn.new''' (или '''new.spawn'''), не забывая переименовать его в '''all.spawn'''. В папку ''levels'' кладем уровень из ''ggEditor_01\SoC\gamedata\levels\ваша_локация\''. Затем заходим в папку с уровнем, удаляем старый файл '''level.ai''' и переименовываем файл '''level.ai10''' в '''level.ai'''. | ||
+ | |||
+ | Теперь осталось только прописать уровень в конфигах. Из распакованной геймдаты игры берем файлы '''configs\game_graphs.ltx''', '''\game_levels.ltx''', '''\game_maps_single.ltx'''. | ||
+ | |||
+ | '''game_graphs.ltx''' для ЧН должен выглядеть так: | ||
+ | |||
+ | <ini> | ||
+ | [location_0] | ||
+ | 000 = "..." | ||
+ | 001 = "эскейп" | ||
+ | 002 = "свалка" | ||
+ | 003 = "агропром" | ||
+ | 004 = "агропром-подземка" | ||
+ | 005 = "темная долина" | ||
+ | 006 = "лаборатория X-18" | ||
+ | 007 = "даркскейп" | ||
+ | 008 = "Бар" | ||
+ | 009 = "Росток" | ||
+ | 010 = "Янтарь" | ||
+ | 011 = "лаборатория X-16" | ||
+ | 012 = "Милитари" | ||
+ | 013 = "Мертвый город" | ||
+ | 014 = "Радар" | ||
+ | 015 = "Радар бункер" | ||
+ | 016 = "Припять" | ||
+ | 017 = "станция АЭС" | ||
+ | 018 = "ваша_локация" | ||
+ | |||
+ | [location_1] | ||
+ | 000 = "..." | ||
+ | 001 = "ограниченный доступ" | ||
+ | 002 = "запрещенный доступ" | ||
+ | |||
+ | [location_2] | ||
+ | 000 = "..." | ||
+ | 001 = "не для игрока" | ||
+ | |||
+ | [location_3] | ||
+ | 000 = "..." | ||
+ | 001 = "ваша_локация" | ||
+ | </ini> | ||
+ | |||
+ | '''game_graphs.ltx''' для ЗП должен выглядеть так: | ||
+ | |||
+ | <ini> | ||
+ | [location_0] | ||
+ | 000 = "..." | ||
+ | 001 = "ваша_локация" | ||
+ | 002 = "sim_smart_2" | ||
+ | 003 = "sim_smart_3" | ||
+ | 004 = "sim_smart_4" | ||
+ | 005 = "sim_smart_5" | ||
+ | 006 = "sim_smart_6" | ||
+ | 007 = "sim_smart_7" | ||
+ | 008 = "sim_smart_8" | ||
+ | 009 = "sim_smart_base" | ||
+ | |||
+ | [location_1] | ||
+ | 000 = "..." | ||
+ | 001 = "ограниченный доступ" | ||
+ | 002 = "запрещенный доступ" | ||
+ | |||
+ | [location_2] | ||
+ | 000 = "..." | ||
+ | 001 = "не для игрока" | ||
+ | |||
+ | [location_3] | ||
+ | 000 = "..." | ||
+ | .... | ||
+ | .... | ||
+ | .... | ||
+ | 112 = "pri_a22_smart_terrain" | ||
+ | 113 = "pri_a25_smart_terrain" | ||
+ | 114 = "pri_a28_arch" | ||
+ | 115 = "pri_a28_base" | ||
+ | 116 = "pri_b28_evac" | ||
+ | 117 = "pri_a28_heli" | ||
+ | 118 = "pri_a28_school" | ||
+ | 119 = "pri_a28_shop" | ||
+ | 120 = "pri_b301" | ||
+ | 121 = "pri_b302" | ||
+ | 122 = "pri_b303" | ||
+ | 123 = "pri_b304_monsters_smart_terrain" | ||
+ | 124 = "pri_b305_dogs" | ||
+ | 125 = "pri_b306" | ||
+ | 126 = "pri_b307" | ||
+ | 127 = "pri_b35_mercs" | ||
+ | 128 = "pri_b35_military" | ||
+ | 129 = "pri_b36_smart_terrain" | ||
+ | 130 = "pri_sim_1" | ||
+ | 131 = "pri_sim_2" | ||
+ | 132 = "pri_sim_3" | ||
+ | 133 = "pri_sim_4" | ||
+ | 134 = "pri_sim_5" | ||
+ | 135 = "pri_sim_6" | ||
+ | 136 = "pri_sim_7" | ||
+ | 137 = "pri_sim_8" | ||
+ | 138 = "pri_sim_9" | ||
+ | 139 = "pri_sim_10" | ||
+ | 140 = "pri_sim_11" | ||
+ | 141 = "pri_sim_12" | ||
+ | 142 = "ваша_локация" | ||
+ | |||
+ | [graph_points_draw_color_palette] | ||
+ | default = 0x6000ffff | ||
+ | 000_000_000_000 = 0x60ff00ff | ||
+ | </ini> | ||
+ | |||
+ | Далее лезем в '''game_levels.ltx'''. | ||
+ | Там в самом начале, где список уровней, вписываем ''level183'' (число не менее 183.) | ||
+ | Листаем файл до самого конца и в конце пишем следующее: | ||
+ | |||
+ | <ini> | ||
+ | [level183] | ||
+ | name = ваша_локация | ||
+ | caption = "ваша_локация" | ||
+ | offset = 700.0, 1000.0, -840.0 | ||
+ | weathers = [default] | ||
+ | id = 183 | ||
+ | </ini> | ||
+ | |||
+ | Затем открываем файл '''game_maps_single.ltx''' и прописываем свой уровень в секции ''[level_maps_single]''. | ||
+ | Затем создаем примерно такую секцию для нашего уровня: | ||
+ | |||
+ | <ini> | ||
+ | [ваша_локация] | ||
+ | global_rect = 307.0, 90.0, 717.0, 500.000000 | ||
+ | weathers = dynamic_default | ||
+ | </ini> | ||
+ | |||
+ | Всё. Запускайте игру и пробуйте, что получилось. | ||
== Соединение с остальными уровнями. == | == Соединение с остальными уровнями. == | ||
− | Предлагаю вам не терять зря времени просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях:на подключенной и на той на которую вы хотите сделать переход соответственно.На каждой локации нам нужно снять по две координаты(координата самого перехода и координата места в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим | + | |
+ | Предлагаю вам не терять зря времени, просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях: на подключенной и на той, на которую вы хотите сделать переход соответственно. На каждой локации нам нужно снять по две координаты (координата самого перехода и координата места, в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим). Как снять координаты, я думаю все знают, поэтому объяснять здесь не буду. | ||
Мы отмерили все необходимые нам координаты. | Мы отмерили все необходимые нам координаты. | ||
− | Затем распаковываем сделанный нами ранее all.spawn.Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна: | + | Затем распаковываем сделанный нами ранее '''all.spawn'''. Теперь в нужных нам локациях, в '''alife_''' файлах добавляем следующую секцию спавна: |
− | < | + | <ini> |
− | + | [40000] ;свободный номер секции | |
− | [ | + | ; cse_abstract properties |
− | ; cse_abstract properties | + | section_name = level_changer |
− | section_name = level_changer | + | name = escgar_level_changer ;уникальное имя для секции перехода |
− | name = escgar_level_changer | + | position = 28.060224533081,16.556184768677,685.80151367188 ;координаты перехода |
− | position = 28.060224533081,16.556184768677,685.80151367188 | + | |
direction = 0,0,0 | direction = 0,0,0 | ||
− | cse_abstract__unk1_h16 = 0x1 | + | cse_abstract__unk1_h16 = 0x1 |
− | ; cse_alife_object properties | + | |
− | game_vertex_id = 1142 | + | ; cse_alife_object properties |
+ | game_vertex_id = 1142 ;геймвертексы | ||
distance = 0 | distance = 0 | ||
− | level_vertex_id = 308110 | + | level_vertex_id = 308110 ;левелвертексы |
object_flags = 0xffffff3e | object_flags = 0xffffff3e | ||
+ | |||
; cse_shape properties | ; cse_shape properties | ||
shapes = shape0 | shapes = shape0 | ||
Строка 37: | Строка 294: | ||
shape0:axis_z = 0,0,1.25219917297363 | shape0:axis_z = 0,0,1.25219917297363 | ||
shape0:offset = 0,0,0 | shape0:offset = 0,0,0 | ||
+ | |||
; cse_alife_space_restrictor properties | ; cse_alife_space_restrictor properties | ||
restrictor_type = 3 | restrictor_type = 3 | ||
+ | |||
; cse_alife_level_changer properties | ; cse_alife_level_changer properties | ||
− | dest_game_vertex_id = 1187 | + | dest_game_vertex_id = 1187 ;вертексы локи, на которую ведет переход |
− | dest_level_vertex_id = 212769 | + | dest_level_vertex_id = 212769 ;вертексы локи, на которую ведет переход |
− | dest_position = 39.396331787109,0.48722490668297,-299.7674505469 | + | dest_position = 39.396331787109,0.48722490668297,-299.7674505469 ;позиция, куда кидает |
− | dest_direction = 0,0,0 | + | dest_direction = 0,0,0 ;направление взгляда игрока при появлении |
− | dest_level_name = l02_garbage | + | dest_level_name = l02_garbage ;имя локации, на которую ведет переход |
dest_graph_point = start_actor_01 | dest_graph_point = start_actor_01 | ||
− | silent_mode = 1 | + | silent_mode = 1 ;режим "тихого" перехода |
+ | |||
; se_level_changer properties | ; se_level_changer properties | ||
+ | </ini> | ||
− | </ | + | <span style="color: gray"> Пояснения после знаков ; '''''желательно''''' удалить. [[Участник:RedPython|RedPython]] 10:04, 21 ноября 2010 (UTC) </span> |
+ | <br /> | ||
+ | Всё готово. Собираем '''all.spawn''' и запихиваем в игру. | ||
+ | |||
+ | |||
+ | ==Метод исправления лайтмапов== | ||
+ | |||
+ | После переноса лок из ТЧ в ЧН/ЗП освещение локации вело себя странным образом, тени были жутко черные, тени от деревьев на зданиях имели странную форму, некоторые объекты вообще светились в темноте. А все дело заключалось в картах освещения, принцип их построения в ТЧ отличается от ЧН/ЗП, поэтому для получения более качественной картинки нужно произвести некоторые манипуляции с ними. Карты освещения хранятся в файлах | ||
+ | * lmap#1_1.dds | ||
+ | * lmap#1_2.dds | ||
+ | * lmap#2_1.dds | ||
+ | * lmap#2_2.dds | ||
+ | * lmap#3_1.dds | ||
+ | * lmap#3_2.dds | ||
+ | * ... | ||
+ | в папке с локацией. Мапы с именем заканчивающимся на ''_1'' менять не нужно а вот заканчивающимся на ''_2'' нужно изменить. Значит так, открываем в фотошопе (ну, или в другом редакторе, не суть важно) карты: | ||
+ | * lmap#1_2.dds | ||
+ | * lmap#2_2.dds | ||
+ | * lmap#3_2.dds | ||
+ | ... | ||
+ | и меняем местами альфа канал и RGB. Сохраняем. Теперь косяков с освещением не будет. Но в некоторых картах в файлах '''lmap#*.dds''' нет альфа канала, поэтому нужно в '''lmap#*_1.dds''' добавить черный альфа канал, а в '''lmap#*_2.dds''' канал rgb перенести в альфу, и залить rgb черным цветом. | ||
− | |||
− | |||
---- | ---- | ||
− | '''Убедительная просьба к начинающим модмейкерам.Пожалуйста, если вы только начали заниматься модами, то я вам настоятельно не советую заниматься подключением локаций.Наберитесь опыта, подучитесь элементарному. | + | '''Убедительная просьба к начинающим модмейкерам. Пожалуйста, если вы только начали заниматься модами, то я вам настоятельно не советую заниматься подключением локаций. Наберитесь опыта, подучитесь элементарному. Никто вас учить этому не подписывался.''' |
− | Да и еще.Если будете переносить секции спавна, то для массовой замены | + | Да, и еще. Если будете переносить секции спавна, то для массовой замены геймвертексов и левелвертексов можно использовать блокнот: открываем наш файл в блокноте=>правка=>заменить, и пишем, что на что заменять. Также можно использовать '''Vertex Parser''' или '''Spawn Parser 2.0 beta'''. |
---- | ---- | ||
Строка 64: | Строка 343: | ||
'''О способе подключения поведал: джЭдай (ака Panisher)''' | '''О способе подключения поведал: джЭдай (ака Panisher)''' | ||
− | + | '''Метод исправления лайтмапов открыт Push85''' | |
+ | Если у вас что-то не получается или появились вопросы, есть [http://www.gameru.net/forum/index.php?showtopic=32654 тема] на форуме. | ||
− | [[Категория: | + | [[Категория:Программы]] |
Текущая версия на 12:36, 27 мая 2017
Содержание
ВНИМАНИЕ!
Данная статья в значительной степени устарела.
КАТЕГОРИЧЕСКИ предупреждаем
Использование устаревшей и забагованной утилиты ggEditor - СТРОГО ВОСПРЕЩАЕТСЯ!
Используйте только официальный софт от разработчиков игры, а именно "X-Ray SDK"
За более подробной информацией обратитесь на AMK форум
В данном уроке мы полностью подключим локацию к игре.
Инструменты и ресурсы
Интерпретатор Perl:
ActivePerl
Скрипты для редактирования all.spawn:
ACDC for SoC v.1.0004
ACDC for CS v.1.5.04
ACDC for CoP
или
универсальный ACDC
Скрипты для редактирования графов:
ggTool
ggEditor v.0.1
Распакованные ресурсы ТЧ или мода, из которого взят уровень (если вы берете уровень из мода, то вам наверняка не подойдет простой ACDC).
Подготовка.
Устанавливаем интерпретатор ActivePerl.
Заходим в папку с программой ggEditor. Создаем там папки CS или CoP (смотря на какую игру делаете) и папку SoC.В папке SoC создаем папку gamedata и кидаем в нее файл game.graph (важно, чтобы game.graph лежал там, иначе программа не прочитает!) из мода, или от ТЧ. В папке gamedata создаем папку levels и кидаем туда папку с уровнем, который мы хотим портировать. Далее возвращаемся в папку SoC и туда кидаем папку с ACDC для ТЧ, туда же кладём all.spawn.Запускаем соответствующий батник для распаковки all.spawn`а.
Далее в папку ggEditor_01\CoP или ggEditor_01\CS, кидаем папку с соответствующим ACDC, опять-же кладем туда all.spawn, распаковываем.
В итоге у нас должно получиться 2 распакованных all.spawn`а, game.graph от ТЧ и папка с переносимым уровнем.
С приготовлениями всё.
Основная работа.
Запускаем программу ggEditor. Видим там два окошка. В левом открываем game.graph от ТЧ, а в правом — от ЗП или ЧН (в ЗП и ЧН граф вшит в all.spawn, ищите его там. Нужно выбрать тип файлов для ЧН — graph.bin, а для ЗП — все файлы и открыть в папке с ACDC файл section4.bin). В окошках мы видим список уровней. В левом окошке находим нужный нам уровень и нажимаем на соответствующую стрелку для переноса уровня в нужный нам граф. Нажимаем в правом окошке «сохранить». После того, как граф сохранился, можно закрыть программу, она нам больше не понадобится. Потом этого шагаем в папку с ACDC для ЧН/ЗП и удаляем старые файлы section4.bin или graph.bin. Затем переименовываем файлы graph.bin.new или section4.bin.new в graph.bin и соответственно section4.bin.
Далее идем в папку с ACDC от ТЧ, находим там файл alife_наша_локация и копируем его. Затем шуруем в папку с ACDC от ЧН/ЗП, вставляем скопированный нами файл. Открываем этот файл, сносим все, оставляем только одну секцию спавна (лучше всего, если это будет какой-нибудь объект), присваиваем секции номер не меньше 20000, сворачиваем на время этот файл. Далее нужно подогнать вертексы. Для этого запускаем ggTool.bat, ждем некоторое время, после чего в parse_lvids.ltx появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией (в ЧН это скорее всего будет 1620, а в ЗП 934). Далее разворачиваем alife_ файл с нашей локацией, ищем там строку game_vertex_id и пишем там число, которое появилось рядом с нашей локацией при запуске батника ggTool. А вот строку level_vertex_id трогать не следует, т.к. вершины уровня в нашем случае остаются неизменными. RedPython 10:04, 21 ноября 2010 (UTC) Мы подогнали вертексы.
Затем открываем файл all.ltx. Вписываем туда свой alife_ файл локации, way_ файлы не трогаем. Меняем на соответствующее количество локаций строку level_count.
После этого открываем файл alife_zaton (для ЗП) или alife_marsh (для ЧН) и ищем там ГГ по строке section_name = actor. Нашли? Отлично. Теперь присваиваем этой секции спавна позицию (новую позицию прописываем также в строке upd:position = ) и вертексы как у единственного предмета в файле alife_новая_локация. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле alife_новая_локация.
Мы почти закончили с пробной сборкой новой локации (пока без переходов на другие уровни).
Осталось только прописать наш новый уровень в файл ACDC_CoP\acdccop.pl (для ЗП), либо в файле ACDC_CS\stkutils\level.pm.
В этих файлах ищем такие строки (для ЗП):
use constant levels_info => ( { gvid0 => 934, }, { gvid0 => 883, name => 'jupiter_underground' }, { gvid0 => 857, name => 'labx8' }, { gvid0 => 666, name => 'pripyat' }, { gvid0 => 317, name => 'jupiter' }, { gvid0 => 0, name => 'zaton' },
И если у вас число, когда мы запускали батник ggTool, тоже 934, то прописываем так:
use constant levels_info => ( { gvid0 => 934, name => 'ваша_локация' }, { gvid0 => 883, name => 'jupiter_underground' }, { gvid0 => 857, name => 'labx8' }, { gvid0 => 666, name => 'pripyat' }, { gvid0 => 317, name => 'jupiter' }, { gvid0 => 0, name => 'zaton' },
А в файле level.pm от ACDC ЧН вы увидите такой текст:
use constant levels_info => ( { gvid0 => 1620, }, { gvid0 => 1573, name => 'l12_hospital' }, { gvid0 => 1565, name => 'l11_stancia2' }, { gvid0 => 1524, name => 'l10_limansk' }, { gvid0 => 1511, name => 'l09_agroprom_undeground' }, { gvid0 => 1313, name => 'l08_military' }, { gvid0 => 1212, name => 'l07_yantar' }, { gvid0 => 1057, name => 'l06_agroprom' }, { gvid0 => 961, name => 'l05_red_forest' }, { gvid0 => 743, name => 'l04_darkvalley' }, { gvid0 => 472, name => 'l03_escape' }, { gvid0 => 245, name => 'l02_garbage' }, { gvid0 => 0, name => 'l01_marsh' },
Прописать там свой уровень нужно точно так-же как в файле от ACDC ЗП:
use constant levels_info => ( { gvid0 => 1620, name => 'ваша_локация' }, { gvid0 => 1573, name => 'l12_hospital' }, { gvid0 => 1565, name => 'l11_stancia2' }, { gvid0 => 1524, name => 'l10_limansk' }, { gvid0 => 1511, name => 'l09_agroprom_undeground' }, { gvid0 => 1313, name => 'l08_military' }, { gvid0 => 1212, name => 'l07_yantar' }, { gvid0 => 1057, name => 'l06_agroprom' }, { gvid0 => 961, name => 'l05_red_forest' }, { gvid0 => 743, name => 'l04_darkvalley' }, { gvid0 => 472, name => 'l03_escape' }, { gvid0 => 245, name => 'l02_garbage' }, { gvid0 => 0, name => 'l01_marsh' },
По идее, в levels_info следует прописать также верхнюю вершину последнего уровня. RedPython 10:04, 21 ноября 2010 (UTC)
Всё. Собираем all.spawn.
Сборка геймдаты.
Осталось собрать gamedata`у для игры и посмотреть, что получилось. Итак, приступим.
В папке с игрой создаем папку gamedata, а в ней папки configs, levels, spawns. В папку spawns кладем получившийся при сборке all.spawn.new (или new.spawn), не забывая переименовать его в all.spawn. В папку levels кладем уровень из ggEditor_01\SoC\gamedata\levels\ваша_локация\. Затем заходим в папку с уровнем, удаляем старый файл level.ai и переименовываем файл level.ai10 в level.ai.
Теперь осталось только прописать уровень в конфигах. Из распакованной геймдаты игры берем файлы configs\game_graphs.ltx, \game_levels.ltx, \game_maps_single.ltx.
game_graphs.ltx для ЧН должен выглядеть так:
[location_0] 000 = "..." 001 = "эскейп" 002 = "свалка" 003 = "агропром" 004 = "агропром-подземка" 005 = "темная долина" 006 = "лаборатория X-18" 007 = "даркскейп" 008 = "Бар" 009 = "Росток" 010 = "Янтарь" 011 = "лаборатория X-16" 012 = "Милитари" 013 = "Мертвый город" 014 = "Радар" 015 = "Радар бункер" 016 = "Припять" 017 = "станция АЭС" 018 = "ваша_локация" [location_1] 000 = "..." 001 = "ограниченный доступ" 002 = "запрещенный доступ" [location_2] 000 = "..." 001 = "не для игрока" [location_3] 000 = "..." 001 = "ваша_локация"
game_graphs.ltx для ЗП должен выглядеть так:
[location_0] 000 = "..." 001 = "ваша_локация" 002 = "sim_smart_2" 003 = "sim_smart_3" 004 = "sim_smart_4" 005 = "sim_smart_5" 006 = "sim_smart_6" 007 = "sim_smart_7" 008 = "sim_smart_8" 009 = "sim_smart_base" [location_1] 000 = "..." 001 = "ограниченный доступ" 002 = "запрещенный доступ" [location_2] 000 = "..." 001 = "не для игрока" [location_3] 000 = "..." .... .... .... 112 = "pri_a22_smart_terrain" 113 = "pri_a25_smart_terrain" 114 = "pri_a28_arch" 115 = "pri_a28_base" 116 = "pri_b28_evac" 117 = "pri_a28_heli" 118 = "pri_a28_school" 119 = "pri_a28_shop" 120 = "pri_b301" 121 = "pri_b302" 122 = "pri_b303" 123 = "pri_b304_monsters_smart_terrain" 124 = "pri_b305_dogs" 125 = "pri_b306" 126 = "pri_b307" 127 = "pri_b35_mercs" 128 = "pri_b35_military" 129 = "pri_b36_smart_terrain" 130 = "pri_sim_1" 131 = "pri_sim_2" 132 = "pri_sim_3" 133 = "pri_sim_4" 134 = "pri_sim_5" 135 = "pri_sim_6" 136 = "pri_sim_7" 137 = "pri_sim_8" 138 = "pri_sim_9" 139 = "pri_sim_10" 140 = "pri_sim_11" 141 = "pri_sim_12" 142 = "ваша_локация" [graph_points_draw_color_palette] default = 0x6000ffff 000_000_000_000 = 0x60ff00ff
Далее лезем в game_levels.ltx. Там в самом начале, где список уровней, вписываем level183 (число не менее 183.) Листаем файл до самого конца и в конце пишем следующее:
[level183] name = ваша_локация caption = "ваша_локация" offset = 700.0, 1000.0, -840.0 weathers = [default] id = 183
Затем открываем файл game_maps_single.ltx и прописываем свой уровень в секции [level_maps_single]. Затем создаем примерно такую секцию для нашего уровня:
[ваша_локация] global_rect = 307.0, 90.0, 717.0, 500.000000 weathers = dynamic_default
Всё. Запускайте игру и пробуйте, что получилось.
Соединение с остальными уровнями.
Предлагаю вам не терять зря времени, просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях: на подключенной и на той, на которую вы хотите сделать переход соответственно. На каждой локации нам нужно снять по две координаты (координата самого перехода и координата места, в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим). Как снять координаты, я думаю все знают, поэтому объяснять здесь не буду.
Мы отмерили все необходимые нам координаты.
Затем распаковываем сделанный нами ранее all.spawn. Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна:
[40000] ;свободный номер секции ; cse_abstract properties section_name = level_changer name = escgar_level_changer ;уникальное имя для секции перехода position = 28.060224533081,16.556184768677,685.80151367188 ;координаты перехода direction = 0,0,0 cse_abstract__unk1_h16 = 0x1 ; cse_alife_object properties game_vertex_id = 1142 ;геймвертексы distance = 0 level_vertex_id = 308110 ;левелвертексы object_flags = 0xffffff3e ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 1.25219917297363,0,0 shape0:axis_y = 0,3.09340000152588,0 shape0:axis_z = 0,0,1.25219917297363 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 3 ; cse_alife_level_changer properties dest_game_vertex_id = 1187 ;вертексы локи, на которую ведет переход dest_level_vertex_id = 212769 ;вертексы локи, на которую ведет переход dest_position = 39.396331787109,0.48722490668297,-299.7674505469 ;позиция, куда кидает dest_direction = 0,0,0 ;направление взгляда игрока при появлении dest_level_name = l02_garbage ;имя локации, на которую ведет переход dest_graph_point = start_actor_01 silent_mode = 1 ;режим "тихого" перехода ; se_level_changer properties
Пояснения после знаков ; желательно удалить. RedPython 10:04, 21 ноября 2010 (UTC)
Всё готово. Собираем all.spawn и запихиваем в игру.
Метод исправления лайтмапов
После переноса лок из ТЧ в ЧН/ЗП освещение локации вело себя странным образом, тени были жутко черные, тени от деревьев на зданиях имели странную форму, некоторые объекты вообще светились в темноте. А все дело заключалось в картах освещения, принцип их построения в ТЧ отличается от ЧН/ЗП, поэтому для получения более качественной картинки нужно произвести некоторые манипуляции с ними. Карты освещения хранятся в файлах
- lmap#1_1.dds
- lmap#1_2.dds
- lmap#2_1.dds
- lmap#2_2.dds
- lmap#3_1.dds
- lmap#3_2.dds
- ...
в папке с локацией. Мапы с именем заканчивающимся на _1 менять не нужно а вот заканчивающимся на _2 нужно изменить. Значит так, открываем в фотошопе (ну, или в другом редакторе, не суть важно) карты:
- lmap#1_2.dds
- lmap#2_2.dds
- lmap#3_2.dds
... и меняем местами альфа канал и RGB. Сохраняем. Теперь косяков с освещением не будет. Но в некоторых картах в файлах lmap#*.dds нет альфа канала, поэтому нужно в lmap#*_1.dds добавить черный альфа канал, а в lmap#*_2.dds канал rgb перенести в альфу, и залить rgb черным цветом.
Убедительная просьба к начинающим модмейкерам. Пожалуйста, если вы только начали заниматься модами, то я вам настоятельно не советую заниматься подключением локаций. Наберитесь опыта, подучитесь элементарному. Никто вас учить этому не подписывался.
Да, и еще. Если будете переносить секции спавна, то для массовой замены геймвертексов и левелвертексов можно использовать блокнот: открываем наш файл в блокноте=>правка=>заменить, и пишем, что на что заменять. Также можно использовать Vertex Parser или Spawn Parser 2.0 beta.
Автор статьи: БАТЯ-STALKER
О способе подключения поведал: джЭдай (ака Panisher)
Метод исправления лайтмапов открыт Push85
Если у вас что-то не получается или появились вопросы, есть тема на форуме.