|
|
Строка 1: |
Строка 1: |
− | На днях пообщался с человеком (!), узнал как подключать локации к ЗП\ЧН через программу от AKМ Team.В данном уроке мы полностью подключим локацию к игре.
| + | вйцапцупцпу |
− | | + | |
− | == Инструменты. ==
| + | |
− | | + | |
− | '''Чем будем ковырять:'''
| + | |
− | | + | |
− | Собственно, сама [http://www.st-khb27.ru/ggtool.rar программа] для редактирования файла game.graph.
| + | |
− | | + | |
− | [http://narod.ru/disk/17377026020/ACDC%20Cop.rar.html ACDC(Для ЗП)]
| + | |
− | | + | |
− | [http://narod.ru/disk/17377359000/ACDC%20Cs.rar.html ACDC(Для ЧН)]
| + | |
− | | + | |
− | [http://stalkerin.gameru.net/developer/mods/acdc13oct.rar ACDC(Для ТЧ)]
| + | |
− | | + | |
− | Распакованные ТЧ или мод из которого взят уровень.(Если вы берете уровень из мода, то вам не подойдет простой ACDC от ТЧ.)
| + | |
− | | + | |
− | Active perl(Необходим для работы ACDC, входит в два первых архива с ACDC).
| + | |
− | | + | |
− | == Подготовка. ==
| + | |
− | Устанавливаем active perl.
| + | |
− | | + | |
− | Заходим в папку с программой ggEditor_01.Создаем там папки Cs или Cop(Смотря на какую игру делаете) и папку Soc.В папке Soc создаем папку gamedata и кидаем в нее файл game.graph(Важно чтобы game.graph лежал там, иначе программа не прочитает.) из мода, или от ТЧ.В папке gamedata создаем папку levels и кидаем туда папку с уровнем, который мы хотим портировать. Далее возвращаемся в папку Soc и туда кидаем папку с ACDC для ТЧ, туда же ложим all.spawn.Запускаем соответствующий батник для распаковки all.spawn`а.
| + | |
− | | + | |
− | Далее в папку ggEditor_01\Cs или Cop, кидаем папку с соответствующим 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, ждем некоторое время, после чего появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией(в ЧН это скорее всего будет 1620, а в ЗП 934).Далее разворачиваем alife_ файл с нашей локацией, ищем там строку «game_vertex_id» и пишем там число которое появилось рядом с нашей локацией при запуске батника ggtool.Затем обращаем свой взор на строку «level_vertex_id».К исходному значению строки прибавляем число, которое мы записали в строку «game_vertex_id», полученное число записываем. Далее, в добавляемых потом секциях спавна нужно писать эти числа. Мы подогнали вертексы.
| + | |
− | | + | |
− | Затем открываем файл 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.
| + | |
− | | + | |
− | В этих файлах ищем такие строки(для ЗП):
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | 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' },
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | И если у вас число когда мы запускали батник ggtool тоже 934 то прописываем так:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | 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' },
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | А в файле level.pm от ACDC ЧН вы увидите такой текст:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | 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' },
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | Прописать там свой уровень нужно точно так-же как в файле от ACDC ЗП:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | 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' },
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | Всё.Собираем all.spawn.
| + | |
− | | + | |
− | == Сборка геймдаты. ==
| + | |
− | Осталось собрать gamedat`у для игры и смотреть что получилось.
| + | |
− | Итак, приступим:
| + | |
− | | + | |
− | В папке с игрой создаем папку 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 для ЧН должен выглядеть так:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | [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 = "ваша_локация"
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | game_graphs для ЗП должен выглядеть так:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | [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
| + | |
− | | + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | Далее лезем в game_levels.ltx.
| + | |
− | Там в самом начале, где список уровней, вписываем "level183"(число не менее 183.)
| + | |
− | Листаем файл до самого конца и в конце пишем следующее:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | [level183]
| + | |
− | name = ваша_локация
| + | |
− | caption = "ваша_локация"
| + | |
− | offset = 700.0, 1000.0, -840.0
| + | |
− | weathers = [default]
| + | |
− | id = 183
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | Затем открываем файл game_maps_single.ltx и прописываем свой уровень в секции "[level_maps_single]", а затем создаем примерно такую секцию для нашего уровня:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | [ваша_локация]
| + | |
− | global_rect = 307.0, 90.0, 717.0, 500.000000
| + | |
− | weathers = dynamic_default
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | ----
| + | |
− | | + | |
− | Всё.Запускайте игру и пробуйте, что получилось.
| + | |
− | | + | |
− | | + | |
− | == Соединение с остальными уровнями. ==
| + | |
− | Предлагаю вам не терять зря времени просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях:на подключенной и на той на которую вы хотите сделать переход соответственно.На каждой локации нам нужно снять по две координаты(координата самого перехода и координата места в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим.).Как снять координаты, я думаю все знают, поэтому объяснять здесь не буду.
| + | |
− | | + | |
− | Мы отмерили все необходимые нам координаты.
| + | |
− | | + | |
− | Затем распаковываем сделанный нами ранее all.spawn.Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна:
| + | |
− | | + | |
− | <code>
| + | |
− | | + | |
− | [1]
| + | |
− | ; 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
| + | |
− | | + | |
− | </code>
| + | |
− | | + | |
− | Изменяем только те места, которые я прокомментировал, комментарии соответственно, удаляем.
| + | |
− | Всё готово.Собираем all.spawn и запихиваем в игру.
| + | |
− | | + | |
− | '''Автор статьи: БАТЯ-STALKER'''
| + | |
− | | + | |
− | '''О способе подключения поведал: Panisher'''
| + | |
− | | + | |
− | Если у вас что-то не получается или появились вопросы, есть [http://www.gameru.net/forum/index.php?showtopic=32654 тема] на форуме.
| + | |