<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=80.91.161.165&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=80.91.161.165&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/80.91.161.165"/>
		<updated>2026-04-29T19:52:47Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_-%3DinGame_%D0%90%D0%98%3D-</id>
		<title>Компиляция -=inGame АИ=-</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_-%3DinGame_%D0%90%D0%98%3D-"/>
				<updated>2009-02-14T14:01:12Z</updated>
		
		<summary type="html">&lt;p&gt;80.91.161.165: /* Углубленное изучение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак, приступим... Раз вы здесь, значит есть на то причина:&lt;br /&gt;
*1)либо вы нуп, увидевший аи-компилер и решивший забацать чтото крутое&lt;br /&gt;
*2)вы не нуп, но всё забыли или почти всё&lt;br /&gt;
*3)вы супер-аццкий про решивший глянуть на весь этот детсад свысока )&lt;br /&gt;
*4)вы обычный модер, решивший расширить свои текущие познания. ;)&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Ну что ж... начнем с самого простого, скомпилим левел с аи, монстрами на&lt;br /&gt;
карте '''mp_atp'''. Открываем левел.. первое что надо сделать убрать все &lt;br /&gt;
'''rpoint'''(мультиплеерные точки спавна). Убрали? Отлично. Создаем&lt;br /&gt;
'''Spawn elements -&amp;gt; actor''' ну и по желанию в свойствах ('''Properties''')&lt;br /&gt;
в '''custom data''' прописываем ему предположим вот это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[spawn]&lt;br /&gt;
wpn_ak74&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым при появлении игрока у него в руках уже будет калаш. Далее,&lt;br /&gt;
создаем монстра... любого по желанию, предположим кровососа и ставим на уровень.&lt;br /&gt;
Теперь дело за '''AI map''' - аи сетка, которая необходима для того, чтобы&lt;br /&gt;
нпс, монстры могли ориентироваться по уровню. Жмем Object и кликаем на  земле(тем самым мы ее &amp;quot;выбрали&amp;quot; для дальнейших манипуляций), затем '''AI Map''' -&amp;gt; '''Commands''' -&amp;gt; '''Make list from selected''', жмем '''add''' в разделе '''AI Map Nodes''' и '''add''' для добавления объектов слева вверху(чайник) и ставим на карте ноды в нужном вам порядке(достаточно одного), жмем '''Generate Full'''. Всё, аи-сетка сгенерированна. Теперь добавляем на левел обязательно! 1 graph point ('''Spawns-&amp;gt;ai-&amp;gt;graph point'''), в нем можно ничего не писать. Сохраняем уровень, билдим ('''build'''). &lt;br /&gt;
&lt;br /&gt;
после этого не забываем скомпилить карту, (не забываем создать диск Х, приложенной прогой)&lt;br /&gt;
&amp;lt;code&amp;gt;Windows -&amp;gt; start -&amp;gt; run&amp;lt;/code&amp;gt; и в командной строке пишем (mp_atp_test,здесь название карты):&lt;br /&gt;
[[image:Docs_wind_run_comp_multiplayer.jpg|Запуск уровня на компиляцию|center|frame|Запуск уровня на компиляцию]]&lt;br /&gt;
После корректной компиляции:&lt;br /&gt;
[[image:Docs_wind_xray_levelcompiler.jpg|Завершение компиляции|center|frame|Завершение компиляции]]&lt;br /&gt;
&lt;br /&gt;
Следующим шагом будет правка конфигов.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
'''game_maps_single.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[level_maps_single]&lt;br /&gt;
...&lt;br /&gt;
testing_ai &lt;br /&gt;
//название вашего уровня&lt;br /&gt;
&lt;br /&gt;
[testing_ai]&lt;br /&gt;
global_rect  = -6,1220.0, 248.0,1481.0&lt;br /&gt;
texture      = map\map_escape&lt;br /&gt;
//текстура при загрузке&lt;br /&gt;
bound_rect  = -502.148,-412.284,379.976,474,479&lt;br /&gt;
weathers  = default&lt;br /&gt;
//погода&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''game_levels.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[levels]&lt;br /&gt;
...&lt;br /&gt;
level190&lt;br /&gt;
//номер вашего уровня&lt;br /&gt;
&lt;br /&gt;
[level190]&lt;br /&gt;
name   = testing_ai&lt;br /&gt;
caption = &amp;quot;testing_ai&amp;quot;&lt;br /&gt;
offset  = 2000.0, 800.0, 1000.0    // положение нового уровня на глобальной карте, X, Y, Z&lt;br /&gt;
id   = 193&lt;br /&gt;
//индентифакционный номер, должен быть уникальным&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''game_graphs.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
018   = &amp;quot;testing_ai&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь открываем AI Compiler, указываем папку с '''сдк'''(.../level_editor, либо если он объединен с игрой, путь до нее). Выбираем ваш уровень.&lt;br /&gt;
Проходим 1ую стадию чернового просчета аи карты('''шаг 1'''), либо если вы хотите долго ждать и просчитать укрытия для нпс то выбираем '''шаг 2'''.&lt;br /&gt;
Далее строим граф и кросс-таблицу уровня шаг 3, потом граф игры '''шаг 4''' и наконец фаил .spawn '''шаг 5'''. После всех стадий заходим в gamedata\spawns\ и переименовываем '''test.spawn''' в '''all.spawn'''&lt;br /&gt;
&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важные моменты -- Loxotron|&lt;br /&gt;
message = При правке конфигов не забывайте указывать реально существующую там погоду и картинку загрузки, иначе вылетит; также не пытайтесь запустить уровень через .bat фаил, подобный указанному ниже, тоже будет вылет&lt;br /&gt;
&amp;lt;pre&amp;gt;bin\xr_3da.exe -ltx user.ltx -nointro -external -start server(level/single) client(localhost)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правильный .bat фаил&lt;br /&gt;
&amp;lt;pre&amp;gt;@start bin\XR_3DA.exe -start server(%1/single/alife) client(localhost)&amp;lt;/pre&amp;gt;&lt;br /&gt;
%1 - название левела&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Углубленное изучение==&lt;br /&gt;
Далее мы рассмотрим как собирать несколько уровней и устанавливать между ними переходы.&lt;br /&gt;
&lt;br /&gt;
Итак у вас два уровня... на одном из них стоит '''actor'''. Начнем с него:&lt;br /&gt;
создаем '''ai-&amp;gt;level changer''', затем '''shape-&amp;gt;sphere''', с помощью '''scale''' увеличиваем до необходимых размеров, теперь переключаемся в режим редактирования '''spawn element''', выделяем '''level changer''' и жмем '''commands-&amp;gt;attach object''', а затем кликаем на сферу... Всё, сфера и level changer теперь связаны. Далее идем в закладку '''properties''', указываем название, например '''to_atp_2''', теперь нужно прописать в '''custom data''' вейпоинт для возврата, в случае отказа игрока от перемещения с локации на локации(обязательно). Вписываем вот это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = atp_1_way_if_reject&lt;br /&gt;
//в случае отказа от перемещения на вторую локу, возвращаемся назад&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В '''Level to change''' вписываем наименование уровня, куда мы хотим переместиться с этого левела, например '''atp_2'''. &lt;br /&gt;
В '''Level Point to change''' указываем точку, в которой игрок появится...&lt;br /&gt;
'''start_actor_01'''. С '''level changer''' на этом уровне всё, пошли далее.&lt;br /&gt;
И самое главное, в параметрах level_changer в пункте &amp;quot;restrictor type&amp;quot; поставить значение &amp;quot;not a restrictor&amp;quot;, в противном случае будет вылет при переходе на вторую локу.&lt;br /&gt;
Создаем '''graph point''' или используем пустой существующий если у вас есть.&lt;br /&gt;
В него вписываем '''start_actor_01''', этот поинт для того чтобы мы смогли со второго левела '''atp_2''' перейти на '''atp_1'''(первый). Создаем еще один '''graph point''' c названием '''exit_atp_1_01''', в разделе '''location''' выбираем, например &amp;quot;экскейп&amp;quot;. В '''Connection -&amp;gt; Level name''' указываем уровень, с которым будет связан '''atp_1''', то есть выбираем '''atp_2''', в '''Connection-&amp;gt;Point Name''' вписываем точку связи из второго уровня, которую мы создадим потом '''exit_atp_2_01'''. С первым уровнем всё...&lt;br /&gt;
&lt;br /&gt;
Для чего нам нужен graph point'ы ''exit_xxx''?&lt;br /&gt;
''exit_xxx'' представляет собой '''connection_point'''(точку связи) - для того, чтобы компилятор знал, какие уровни он соединяет, а если по другому: начальный граф уровня, от него потом считаются все ноды.&lt;br /&gt;
&lt;br /&gt;
'''start_actor_xx''' - точка появления актера после перехода.&lt;br /&gt;
&lt;br /&gt;
Помните мы вписали в '''custom data''' '''level changer''''а вейпоинт? Вот теперь нам придется его создать. Выбираем '''Way Points''' -&amp;gt; жмем &amp;quot;чайник&amp;quot; и стави 1 вейпоинт рядом с level changer(так мы создали начальную точку пути), теперь жмем '''point mode''' и ставим второй. Если они не соеденились стрелочкой, жмем '''create 1-link'''. Теперь у нас получился путь, который мы прописали в custom data '''level changer''', заходим в свойства и обзываем его также как и в '''custom data''', тоесть '''atp_1_way_if_reject'''. Всё с первым уровнем покончили.&lt;br /&gt;
&lt;br /&gt;
Итак, открываем второй уровень и поехали по новой...&lt;br /&gt;
&lt;br /&gt;
Создаем там путь из двух вейпоинтов по схеме выше и обзываем '''atp_2_way_if_reject'''. Создаем level changer называем его '''to_atp_1''',&lt;br /&gt;
в '''custom data''' пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = atp_2_way_if_reject //название вэйпоинта&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В '''level to change''' указываем atp_1 //куда переходим с atp_2&lt;br /&gt;
В '''level point to change''' - '''start_actor_01'''(дада, тот который мы создали на первом левеле :) )&lt;br /&gt;
&lt;br /&gt;
Теперь здесь же на atp_2 создаем graph point с названием '''start_actor_01'''.&lt;br /&gt;
И еще один где вписываем следущие значения:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Name: exit_atp_2_01&lt;br /&gt;
Location: &amp;quot;свалка&amp;quot; //наименование локации&lt;br /&gt;
&lt;br /&gt;
Connection:&lt;br /&gt;
 Level name: atp_1 //первый уровень&lt;br /&gt;
 Point name: exit_atp_1_01 //связующая точка с первого уровня&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Незабудьте, что '''ACTOR''' должен быть только на одной локации(в нашем случае на atp_1), иначе компилятор выдаст ошибку. Всё!... Сохраняем, прекомпилим.&lt;br /&gt;
&lt;br /&gt;
Запускаем '''Ai Compiler''', выбираем по очереди наши два уровня и просчитываем шаг 1, проверям сетку. Теперь создаем ''текстовый документ'' и вписываем туда&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
@start /wait bins\ai\1.exe -g atp_1&lt;br /&gt;
@start /wait bins\ai\1.exe -g atp_2&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
сохраняем его как .bat и запускаем, в результате у каждого уровня &lt;br /&gt;
появится свой '''level.graph'''(граф и кросс-таблица).&lt;br /&gt;
&lt;br /&gt;
Создаем еще один текстовик, пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
@start /wait bins\ai\1.exe -m&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
сохраняем как .bat и стартуем. Так мы собрали '''game.graph''' из '''level.graph''''ов.&lt;br /&gt;
&lt;br /&gt;
И наконец.. создаем 3ий &amp;quot;бантик&amp;quot; для сборки '''all.spawn'''!&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
bins\ai\1.exe -s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компилим, заходим в '''gamedata\spawns\''', переименовываем получившийся спавн в '''all.spawn''' и запускаем через новую игру. Как видите, вы можете перемещаться с уровня на уровень, туда сюда без каких-либо проблем.&lt;br /&gt;
&lt;br /&gt;
Чуть не забыл, обязательно временно, на время компиляции переместите все остальные левелы игры кроме ваших в любую другую папку, иначе &lt;br /&gt;
могут быть ошибки при сборе графов и спавна.&lt;br /&gt;
&lt;br /&gt;
Для сборки '''всех''' сингл уровней из оригинальной игры &lt;br /&gt;
используйте bat фаил: [http://stalkerin.gameru.net/developer/mods/levelgraph_fullgame.bat fullgame.bat]&lt;br /&gt;
Если будут ошибки связанные с алайфом, жмем ''продолжить''. Потом выполняйте процедуры как написано выше, сборка '''game.graph''', а затем '''all.spawn'''.&lt;br /&gt;
&lt;br /&gt;
==Добавляем наш уровень в сингл-плеер!==&lt;br /&gt;
&lt;br /&gt;
Такс, продолжаем. Мне таки удалось наконец-то совместить свой тестовый левел с картами гсц. Итак приступим. Во первых нам необходим левел... свой, подготовленный. Если вы не читали инструкции выше, то дальше вам делать нечего. На нашем левеле должна быть во-первых '''connection point'''(соеденительная точка), вписываем в нее параметры данного примера, предположим такие:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   Name: point_test_location_escape // название коннекшн-поинта&lt;br /&gt;
&lt;br /&gt;
  Connection&lt;br /&gt;
       Level Name:L01_Escape //с каким уровнем его связываем&lt;br /&gt;
       Point Name:esc_graph_point_0034 //соеденительный поинт на эскейпе, как &lt;br /&gt;
                                      //его добавить будет объяснено '''ниже'''.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сделали?&lt;br /&gt;
&lt;br /&gt;
Теперь создаем еще один граф на уровне, вписываем просто его имя...&lt;br /&gt;
например '''Name: start_actor_01'''. Обязательно добавляем на уровень какой-нибудь уникальный объект... предположим '''машину'''. Зачем, узнаете потом. Но на левеле ни в коем случае не должно быть '''ACTOR''''а!! Сохраняем, прекомпилим левел. Компилим с помощью '''xrLC''' весь уровень, теперь открываем '''AICompiler''' от нео и выполняем '''1 или 2 и 3 шаги''' в отношении нашего левела. &lt;br /&gt;
&lt;br /&gt;
Теперь нам нужно заручиться ОСОБЫМИ инструментами, в нашем случае понадобится [http://www.rapidshare.ru/532500 скрипт] от бардака, который позволяет узнать при запуске любого левела его '''level_vertex_id''', '''game_vertex_id''', '''position'''(координаты игрока в данный момент), '''direction'''(координаты направления его &amp;quot;взгляда&amp;quot;), всё это потребуется при работе с '''acdc''' несколькими этапами ниже. Загружаем игру, находим подходящее место где хотим видеть в будущем триггер для перехода уровней и записываем все параметры на бумажку, они нам понадобятся потом. По хорошему, желательно '''отдельно''' потом еще зайти в '''LE(level editor)''', открыть наш уровень, поставив эктора прям на графе с '''start_actor_01''', закомпилировать проект, пройти все шаги компиляции в '''xraicompiler'''(1,3,4,5,6), '''обязательно''' предварительно забэкапив '''game.graph''', начать новую игру и записать координаты '''level_vertex_id''' и '''direction''', но это достаточно нудно и сложно, но '''желательно''', а потом надо будет, вернуть всё в состояние до всех этих действий..., то есть убрать '''эктора''', восстановить оригинальный '''game.graph'''.&lt;br /&gt;
&lt;br /&gt;
Итак... у вас обязательно должна быть распакованна '''вся''' игра, установлен '''aiwrapper''' от бардака(читайте ридми по установке!!!), и '''aicompiler''' он нео.&lt;br /&gt;
&lt;br /&gt;
Создаем .bat фаил в папке с aiwrapper'ом с текстом&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -extract_spawns&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
либо вводим тоже в тотал коммандере, с помощью этого ключа мы обновили '''level.spawn''''ы всех сингл-уровней, так как они не обновлялись со времен первого патча. &lt;br /&gt;
&lt;br /&gt;
Теперь изучаем '''links.sample''' в блокноте. ничего не поняли? поясняю: '''aiwrapper''' обладает полезнейшим ключом '''-m2'''.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 -m2 &amp;lt;файл&amp;gt;	- склеить ИИ-графы карт в глобальный игровой граф с&lt;br /&gt;
		  учётом поправок для связей из указанного файла&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
То есть с помощью него мы можем взять любой существующий граф на уровне гсц, который &amp;quot;не занят&amp;quot;, и добавить ему нужные нам значения, например сделать его коннекшн поинтом(соеденительной точкой), а потом всё это склеится в общий глобальный '''game.graph'''.&lt;br /&gt;
&lt;br /&gt;
Выполняем  ''aiwrapper -dump_graph graphs.txt'' батом или тоталом. Комманда выведет нам  список исходных вершин ИИ-графа в указанный файл, то есть список скомпиленных графов всех сингл-уровней гсц в фаил '''graphs.txt'''. Находим там точку '''esc_graph_point_0034'''. Видите что она пуста в плане связей в отличии от exit_escape_01,02? Значит мы можем ее использовать, в оригинале разрабы их ставили для путей ботов, то есть по ним перемещается аи, но мы ее заюзаем для связи с нашим тестовым левелом.&lt;br /&gt;
&lt;br /&gt;
Итак, создаем например текстовик '''links_fixed.txt''' и вписываем туда&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[l01_escape]&lt;br /&gt;
; добавляем переход для ИИ с Кордона на тестовый уровень.&lt;br /&gt;
esc_graph_point_0034	= test_level_x, point_test_location_escape&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''test_level_x''' - название нашего уровня.&lt;br /&gt;
'''point_test_location_escape''' - коннекшн поинт на нашем уровне.&lt;br /&gt;
То есть мы прописываем у графпоинта на эскейпе эти два параметра, которые препращают его в коннекшн-поинт, связанный с тем, что на нашем левеле; сохраняем текстовик.&lt;br /&gt;
&lt;br /&gt;
Выполняем батом или тотал коммандером:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -m2 links_fixed.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
ЗЫЫ Желательно перед этим действом временно переместить куда-нибудь неиспользуемые левелы(мультиплеерные тоже) от греха подальше.&lt;br /&gt;
Ждем пока соберется '''game_graph''', ошибок быть недолжно.&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важные моменты 2 -- Loxotron|&lt;br /&gt;
message = Найден более простой способ вычисления '''game_vertex_id'''. В папке '''utils''' у компилятора бардака есть тулза '''ggtool.pl''' - утилита для показа межуровневых связей в '''game.graph'''. Копируем к утилите откомпилированный '''game.graph''' из '''gamedata\''' и выполняем прогу (в командной строке или через батник):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ggtool.pl game.graph &amp;gt;svyazi.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате в фаиле '''svyazi.txt''' в скобках будет указан '''game_vertex_id''' для конкретного уровня, таким образом не нужно узнавать '''dest_game_vertex_id''' c помощью перекомпилирования.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
l01_escape (0) --1206.29--&amp;gt; l02_garbage (415)&lt;br /&gt;
&lt;br /&gt;
0 - '''game_vertex_id''', 415 - '''dest_game_vertex_id''',&lt;br /&gt;
1206.29 - '''distance'''(расстояние между точками), не тот который в '''level_changer''''е, а между '''connection_point''''ами.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь дело за '''all.spawn''':&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В результате соберется полноценный '''all.spawn''' из всех уровней которые есть в папке '''levels'''. Но на этом работа только начинается, теперь надо '''отредактировать''' этот получившийся '''all.spawn''' и добавить '''level_changer''' на уровень гсц, чтобы мы смогли перейти с него на наш.(в нашем случае с эскейпа на test_level_x). Копируем получившийся '''all.spawn''' в &amp;lt;туда, куда вы распаковали aiwrapper&amp;gt;\utils и создаем .bat с таким текстом: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
acdc.pl -d all.spawn&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В результате мы разобрали all.spawn на ltx'сы, нам нужен '''alife_l01_escape.ltx''', вписываем в конец туда это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[не забитый номер]&lt;br /&gt;
;например 9000&lt;br /&gt;
section_name = level_changer &lt;br /&gt;
name = exit_to_new_location_from_esc&lt;br /&gt;
;любое_название_на_англ, (только не использованное)&lt;br /&gt;
position =&lt;br /&gt;
;здесь координаты где находиться левел чейнджер&lt;br /&gt;
;помните бумажку с координатами и параметрами, которую мы писали раньше?&lt;br /&gt;
;смотрим ту где параметры и координаты эскейпа и вписываем&lt;br /&gt;
direction = 0,0,0 &lt;br /&gt;
;направление &amp;quot;взгляда&amp;quot; игрока&lt;br /&gt;
;по желанию, можно вписать координаты с бумажки&lt;br /&gt;
game_vertex_id =  &lt;br /&gt;
;номер вершины игрового графа, задаёт первую вершину графа на данной локации&lt;br /&gt;
;с бумажки эскейпа&lt;br /&gt;
distance = 14.6999998092651&lt;br /&gt;
;&amp;quot;Расстояние&amp;quot; между точкой перехода(level_changer) и точкой появления&lt;br /&gt;
;актера на другом уровне (если считать зону неделимой), можно и 0.&lt;br /&gt;
level_vertex_id = &lt;br /&gt;
;Вершина уровневого графа, должно покатить '''-1''', но &lt;br /&gt;
;ставьте лучше то что записано на бумажке с эскейпа&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = esc_way_test_if_reject&lt;br /&gt;
END&lt;br /&gt;
;custom data, где указано имя вейпоинта, который мы потом создадим &lt;br /&gt;
;на карте с помощью acdc, таже '''custom data''', что в начале &lt;br /&gt;
;статьи.&lt;br /&gt;
story_id =&lt;br /&gt;
;поставьте здесь неиспользуемый ID, например 8435&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 5.8284006118774,0,0&lt;br /&gt;
shape0:axis_y = 0,5.0005970001221,0&lt;br /&gt;
shape0:axis_z = 0,0,5.3902206420898&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
;сфера, в данном случае куб, именно в нем будет активироваться наш переход&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
;выставляем здесь все переменные для нового уровня&lt;br /&gt;
dest_game_vertex_id = &lt;br /&gt;
;номер вершины графа нашей новой локации, туда игрок переместится&lt;br /&gt;
;помните '''уникальный''' объект, который я просил вас поставить?&lt;br /&gt;
;открываем '''alife_lxx_unknown.ltx''' и ищем тачку, сдираем значение с нее&lt;br /&gt;
dest_level_vertex_id =&lt;br /&gt;
;вершина уровнего графа нового левела&lt;br /&gt;
;должно покатить -1, но лучше взять с бумажки с параметрами с тестового левела&lt;br /&gt;
dest_position =&lt;br /&gt;
;координаты на нашем уровне, где ты появляешься&lt;br /&gt;
;с бумажки тестового левела, либо наугад, либо используйте открорректированные&lt;br /&gt;
;координаты с любого объекта на вашей карте, то есть например есть дерево&lt;br /&gt;
;c координатами 0, 1 , 2, корректируем относительно дерева и &lt;br /&gt;
;вписываем например 4, 1, 2&lt;br /&gt;
dest_direction = 0,-1.12671363353729,0&lt;br /&gt;
;направление &amp;quot;взгляда игрока на новом уровне&amp;quot;&lt;br /&gt;
;по желанию&lt;br /&gt;
dest_level_name = &lt;br /&gt;
;название вашего уровня, в нашем случае test_level_x&lt;br /&gt;
dest_graph_point = &lt;br /&gt;
;название точки спавна игрока(графа, то есть в нашем случае&lt;br /&gt;
;start_actor_01)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Еще одно определение двух параметров для непонятливых:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
game_vertex_id - ставится как коннекшн поинт ('''graph_point''' c соответствующими настройками)&lt;br /&gt;
level_vertex_id - '''graph_point''' - ставится как обычная граф поинт с уникальным номером без параметров&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В них вписываем уникальный ID для каждого уровня, то есть в некоторых случаях просто смотрим эти два параметра у соседних объектов этого левела и вписываем значения. Как правило, '''level_vertex_id''' можно поставить '''-1''', но не для всех объектов, '''game_vertex_id''' = ид уровня.&lt;br /&gt;
&lt;br /&gt;
Устали? =) А ведь еще не всё, нужно создать вейпоинт, который мы прописали в '''custom data''' '''level changer''''а. Открываем '''way_l01_escape.ltx''' и вписываем чтото типа:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[esc_way_test_if_reject]&lt;br /&gt;
points = p0,p1&lt;br /&gt;
;два вейпоинта&lt;br /&gt;
p0:name = name_test1&lt;br /&gt;
;имя вейпоинта 1&lt;br /&gt;
p0:position = -243.491257,-19.758562,-140.328583&lt;br /&gt;
;его координаты, ставьте их рядом с координатами level_changer&lt;br /&gt;
;но не в нём, корректируйте их, как в примере с деревом &lt;br /&gt;
p0:game_vertex_id = 8&lt;br /&gt;
p0:level_vertex_id = -1&lt;br /&gt;
p0:links = p1(1)&lt;br /&gt;
&lt;br /&gt;
p1:name = name_test2&lt;br /&gt;
;имя вейпоинта 2&lt;br /&gt;
p1:position = -255.491257,-19.758562,-140.328583&lt;br /&gt;
;его координаты, всё тоже самое, только корректируйте относительно позиции&lt;br /&gt;
; вейпоинта 0, как в этом примере.&lt;br /&gt;
p1:game_vertex_id = 9&lt;br /&gt;
p1:level_vertex_id = -1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Поставили? Всё, осталось только собрать '''all.spawn''', батом или тотал коммандером выполняем это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
acdc.pl -c all.ltx&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь копируем получившийся '''all.spawn.new''' в '''gamedata\spawns\''' и переименовываем его в '''all.spawn'''.&lt;br /&gt;
&lt;br /&gt;
Мученья окончились :) Запускайте новую игру и наслаждайтесь вашим переходом...&lt;br /&gt;
&lt;br /&gt;
==В заключении==&lt;br /&gt;
Если вы хотите, чтобы ваша точка перехода отображалась на карте игрока, то лезем в '''level_tasks.script''' и добавляем в '''function add_lchanger_location()''' секцию, подобную представленной ниже:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		-- test_level_x&lt;br /&gt;
		local obj = sim:story_object(8435)&lt;br /&gt;
		if obj then&lt;br /&gt;
			level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;exit_to_new_location_from_esc&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В строке (obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;'''exit_to_new_location_from_esc'''&amp;quot;) выделенный текст - наименование вашего '''level_changer''', а число - его уникальный '''story_id''' на уровне, например на эскейпе или вашем левеле, список занятых '''story_id''' смотреть в '''lua_help.script'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Список необходимых программ ==&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewtheoned&amp;amp;lid=165 AiCompiler 0.1] от '''Neo'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewtheoned&amp;amp;lid=166 AiWrapper] от '''bardak''''а&lt;br /&gt;
*[http://www.rapidshare.ru/532500 Info_LVID_GVID] скрипт от '''bardak''''а&lt;br /&gt;
*[http://files.gsc-game.com/st/xray-sdk-setup-v0.4.exe SDK 0.4] от '''GSC'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewdownload&amp;amp;cid=13 SDK Update] от '''Neo''' + '''GSC'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewdownload&amp;amp;cid=13 Fixed Shaders] от '''Haron'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''written by Loxotron'''&lt;br /&gt;
&lt;br /&gt;
'''updated 11.01.08 by Loxotron'''&lt;br /&gt;
&lt;br /&gt;
'''24/06/08 небольшое добавление о компиляции - Kalinin11'''&lt;br /&gt;
[[Категория:Программы]][[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>80.91.161.165</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_-%3DinGame_%D0%90%D0%98%3D-</id>
		<title>Компиляция -=inGame АИ=-</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_-%3DinGame_%D0%90%D0%98%3D-"/>
				<updated>2009-02-14T13:59:09Z</updated>
		
		<summary type="html">&lt;p&gt;80.91.161.165: /* Углубленное изучение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак, приступим... Раз вы здесь, значит есть на то причина:&lt;br /&gt;
*1)либо вы нуп, увидевший аи-компилер и решивший забацать чтото крутое&lt;br /&gt;
*2)вы не нуп, но всё забыли или почти всё&lt;br /&gt;
*3)вы супер-аццкий про решивший глянуть на весь этот детсад свысока )&lt;br /&gt;
*4)вы обычный модер, решивший расширить свои текущие познания. ;)&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Ну что ж... начнем с самого простого, скомпилим левел с аи, монстрами на&lt;br /&gt;
карте '''mp_atp'''. Открываем левел.. первое что надо сделать убрать все &lt;br /&gt;
'''rpoint'''(мультиплеерные точки спавна). Убрали? Отлично. Создаем&lt;br /&gt;
'''Spawn elements -&amp;gt; actor''' ну и по желанию в свойствах ('''Properties''')&lt;br /&gt;
в '''custom data''' прописываем ему предположим вот это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[spawn]&lt;br /&gt;
wpn_ak74&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым при появлении игрока у него в руках уже будет калаш. Далее,&lt;br /&gt;
создаем монстра... любого по желанию, предположим кровососа и ставим на уровень.&lt;br /&gt;
Теперь дело за '''AI map''' - аи сетка, которая необходима для того, чтобы&lt;br /&gt;
нпс, монстры могли ориентироваться по уровню. Жмем Object и кликаем на  земле(тем самым мы ее &amp;quot;выбрали&amp;quot; для дальнейших манипуляций), затем '''AI Map''' -&amp;gt; '''Commands''' -&amp;gt; '''Make list from selected''', жмем '''add''' в разделе '''AI Map Nodes''' и '''add''' для добавления объектов слева вверху(чайник) и ставим на карте ноды в нужном вам порядке(достаточно одного), жмем '''Generate Full'''. Всё, аи-сетка сгенерированна. Теперь добавляем на левел обязательно! 1 graph point ('''Spawns-&amp;gt;ai-&amp;gt;graph point'''), в нем можно ничего не писать. Сохраняем уровень, билдим ('''build'''). &lt;br /&gt;
&lt;br /&gt;
после этого не забываем скомпилить карту, (не забываем создать диск Х, приложенной прогой)&lt;br /&gt;
&amp;lt;code&amp;gt;Windows -&amp;gt; start -&amp;gt; run&amp;lt;/code&amp;gt; и в командной строке пишем (mp_atp_test,здесь название карты):&lt;br /&gt;
[[image:Docs_wind_run_comp_multiplayer.jpg|Запуск уровня на компиляцию|center|frame|Запуск уровня на компиляцию]]&lt;br /&gt;
После корректной компиляции:&lt;br /&gt;
[[image:Docs_wind_xray_levelcompiler.jpg|Завершение компиляции|center|frame|Завершение компиляции]]&lt;br /&gt;
&lt;br /&gt;
Следующим шагом будет правка конфигов.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
'''game_maps_single.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[level_maps_single]&lt;br /&gt;
...&lt;br /&gt;
testing_ai &lt;br /&gt;
//название вашего уровня&lt;br /&gt;
&lt;br /&gt;
[testing_ai]&lt;br /&gt;
global_rect  = -6,1220.0, 248.0,1481.0&lt;br /&gt;
texture      = map\map_escape&lt;br /&gt;
//текстура при загрузке&lt;br /&gt;
bound_rect  = -502.148,-412.284,379.976,474,479&lt;br /&gt;
weathers  = default&lt;br /&gt;
//погода&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''game_levels.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[levels]&lt;br /&gt;
...&lt;br /&gt;
level190&lt;br /&gt;
//номер вашего уровня&lt;br /&gt;
&lt;br /&gt;
[level190]&lt;br /&gt;
name   = testing_ai&lt;br /&gt;
caption = &amp;quot;testing_ai&amp;quot;&lt;br /&gt;
offset  = 2000.0, 800.0, 1000.0    // положение нового уровня на глобальной карте, X, Y, Z&lt;br /&gt;
id   = 193&lt;br /&gt;
//индентифакционный номер, должен быть уникальным&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''game_graphs.ltx'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
018   = &amp;quot;testing_ai&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь открываем AI Compiler, указываем папку с '''сдк'''(.../level_editor, либо если он объединен с игрой, путь до нее). Выбираем ваш уровень.&lt;br /&gt;
Проходим 1ую стадию чернового просчета аи карты('''шаг 1'''), либо если вы хотите долго ждать и просчитать укрытия для нпс то выбираем '''шаг 2'''.&lt;br /&gt;
Далее строим граф и кросс-таблицу уровня шаг 3, потом граф игры '''шаг 4''' и наконец фаил .spawn '''шаг 5'''. После всех стадий заходим в gamedata\spawns\ и переименовываем '''test.spawn''' в '''all.spawn'''&lt;br /&gt;
&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важные моменты -- Loxotron|&lt;br /&gt;
message = При правке конфигов не забывайте указывать реально существующую там погоду и картинку загрузки, иначе вылетит; также не пытайтесь запустить уровень через .bat фаил, подобный указанному ниже, тоже будет вылет&lt;br /&gt;
&amp;lt;pre&amp;gt;bin\xr_3da.exe -ltx user.ltx -nointro -external -start server(level/single) client(localhost)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правильный .bat фаил&lt;br /&gt;
&amp;lt;pre&amp;gt;@start bin\XR_3DA.exe -start server(%1/single/alife) client(localhost)&amp;lt;/pre&amp;gt;&lt;br /&gt;
%1 - название левела&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Углубленное изучение==&lt;br /&gt;
Далее мы рассмотрим как собирать несколько уровней и устанавливать между ними переходы.&lt;br /&gt;
&lt;br /&gt;
Итак у вас два уровня... на одном из них стоит '''actor'''. Начнем с него:&lt;br /&gt;
создаем '''ai-&amp;gt;level changer''', затем '''shape-&amp;gt;sphere''', с помощью '''scale''' увеличиваем до необходимых размеров, теперь переключаемся в режим редактирования '''spawn element''', выделяем '''level changer''' и жмем '''commands-&amp;gt;attach object''', а затем кликаем на сферу... Всё, сфера и level changer теперь связаны. Далее идем в закладку '''properties''', указываем название, например '''to_atp_2''', теперь нужно прописать в '''custom data''' вейпоинт для возврата, в случае отказа игрока от перемещения с локации на локации(обязательно). Вписываем вот это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = atp_1_way_if_reject&lt;br /&gt;
//в случае отказа от перемещения на вторую локу, возвращаемся назад&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В '''Level to change''' вписываем наименование уровня, куда мы хотим переместиться с этого левела, например '''atp_2'''. &lt;br /&gt;
В '''Level Point to change''' указываем точку, в которой игрок появится...&lt;br /&gt;
'''start_actor_01'''. С '''level changer''' на этом уровне всё, пошли далее.&lt;br /&gt;
И самое главное, в параметрах level_changer в пункте &amp;quot;restrictor type&amp;quot; поставить значение &amp;quot;not a restrictor&amp;quot;&lt;br /&gt;
Создаем '''graph point''' или используем пустой существующий если у вас есть.&lt;br /&gt;
В него вписываем '''start_actor_01''', этот поинт для того чтобы мы смогли со второго левела '''atp_2''' перейти на '''atp_1'''(первый). Создаем еще один '''graph point''' c названием '''exit_atp_1_01''', в разделе '''location''' выбираем, например &amp;quot;экскейп&amp;quot;. В '''Connection -&amp;gt; Level name''' указываем уровень, с которым будет связан '''atp_1''', то есть выбираем '''atp_2''', в '''Connection-&amp;gt;Point Name''' вписываем точку связи из второго уровня, которую мы создадим потом '''exit_atp_2_01'''. С первым уровнем всё...&lt;br /&gt;
&lt;br /&gt;
Для чего нам нужен graph point'ы ''exit_xxx''?&lt;br /&gt;
''exit_xxx'' представляет собой '''connection_point'''(точку связи) - для того, чтобы компилятор знал, какие уровни он соединяет, а если по другому: начальный граф уровня, от него потом считаются все ноды.&lt;br /&gt;
&lt;br /&gt;
'''start_actor_xx''' - точка появления актера после перехода.&lt;br /&gt;
&lt;br /&gt;
Помните мы вписали в '''custom data''' '''level changer''''а вейпоинт? Вот теперь нам придется его создать. Выбираем '''Way Points''' -&amp;gt; жмем &amp;quot;чайник&amp;quot; и стави 1 вейпоинт рядом с level changer(так мы создали начальную точку пути), теперь жмем '''point mode''' и ставим второй. Если они не соеденились стрелочкой, жмем '''create 1-link'''. Теперь у нас получился путь, который мы прописали в custom data '''level changer''', заходим в свойства и обзываем его также как и в '''custom data''', тоесть '''atp_1_way_if_reject'''. Всё с первым уровнем покончили.&lt;br /&gt;
&lt;br /&gt;
Итак, открываем второй уровень и поехали по новой...&lt;br /&gt;
&lt;br /&gt;
Создаем там путь из двух вейпоинтов по схеме выше и обзываем '''atp_2_way_if_reject'''. Создаем level changer называем его '''to_atp_1''',&lt;br /&gt;
в '''custom data''' пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = atp_2_way_if_reject //название вэйпоинта&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В '''level to change''' указываем atp_1 //куда переходим с atp_2&lt;br /&gt;
В '''level point to change''' - '''start_actor_01'''(дада, тот который мы создали на первом левеле :) )&lt;br /&gt;
&lt;br /&gt;
Теперь здесь же на atp_2 создаем graph point с названием '''start_actor_01'''.&lt;br /&gt;
И еще один где вписываем следущие значения:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Name: exit_atp_2_01&lt;br /&gt;
Location: &amp;quot;свалка&amp;quot; //наименование локации&lt;br /&gt;
&lt;br /&gt;
Connection:&lt;br /&gt;
 Level name: atp_1 //первый уровень&lt;br /&gt;
 Point name: exit_atp_1_01 //связующая точка с первого уровня&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Незабудьте, что '''ACTOR''' должен быть только на одной локации(в нашем случае на atp_1), иначе компилятор выдаст ошибку. Всё!... Сохраняем, прекомпилим.&lt;br /&gt;
&lt;br /&gt;
Запускаем '''Ai Compiler''', выбираем по очереди наши два уровня и просчитываем шаг 1, проверям сетку. Теперь создаем ''текстовый документ'' и вписываем туда&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
@start /wait bins\ai\1.exe -g atp_1&lt;br /&gt;
@start /wait bins\ai\1.exe -g atp_2&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
сохраняем его как .bat и запускаем, в результате у каждого уровня &lt;br /&gt;
появится свой '''level.graph'''(граф и кросс-таблица).&lt;br /&gt;
&lt;br /&gt;
Создаем еще один текстовик, пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
@start /wait bins\ai\1.exe -m&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
сохраняем как .bat и стартуем. Так мы собрали '''game.graph''' из '''level.graph''''ов.&lt;br /&gt;
&lt;br /&gt;
И наконец.. создаем 3ий &amp;quot;бантик&amp;quot; для сборки '''all.spawn'''!&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
bins\ai\1.exe -s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компилим, заходим в '''gamedata\spawns\''', переименовываем получившийся спавн в '''all.spawn''' и запускаем через новую игру. Как видите, вы можете перемещаться с уровня на уровень, туда сюда без каких-либо проблем.&lt;br /&gt;
&lt;br /&gt;
Чуть не забыл, обязательно временно, на время компиляции переместите все остальные левелы игры кроме ваших в любую другую папку, иначе &lt;br /&gt;
могут быть ошибки при сборе графов и спавна.&lt;br /&gt;
&lt;br /&gt;
Для сборки '''всех''' сингл уровней из оригинальной игры &lt;br /&gt;
используйте bat фаил: [http://stalkerin.gameru.net/developer/mods/levelgraph_fullgame.bat fullgame.bat]&lt;br /&gt;
Если будут ошибки связанные с алайфом, жмем ''продолжить''. Потом выполняйте процедуры как написано выше, сборка '''game.graph''', а затем '''all.spawn'''.&lt;br /&gt;
&lt;br /&gt;
==Добавляем наш уровень в сингл-плеер!==&lt;br /&gt;
&lt;br /&gt;
Такс, продолжаем. Мне таки удалось наконец-то совместить свой тестовый левел с картами гсц. Итак приступим. Во первых нам необходим левел... свой, подготовленный. Если вы не читали инструкции выше, то дальше вам делать нечего. На нашем левеле должна быть во-первых '''connection point'''(соеденительная точка), вписываем в нее параметры данного примера, предположим такие:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   Name: point_test_location_escape // название коннекшн-поинта&lt;br /&gt;
&lt;br /&gt;
  Connection&lt;br /&gt;
       Level Name:L01_Escape //с каким уровнем его связываем&lt;br /&gt;
       Point Name:esc_graph_point_0034 //соеденительный поинт на эскейпе, как &lt;br /&gt;
                                      //его добавить будет объяснено '''ниже'''.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сделали?&lt;br /&gt;
&lt;br /&gt;
Теперь создаем еще один граф на уровне, вписываем просто его имя...&lt;br /&gt;
например '''Name: start_actor_01'''. Обязательно добавляем на уровень какой-нибудь уникальный объект... предположим '''машину'''. Зачем, узнаете потом. Но на левеле ни в коем случае не должно быть '''ACTOR''''а!! Сохраняем, прекомпилим левел. Компилим с помощью '''xrLC''' весь уровень, теперь открываем '''AICompiler''' от нео и выполняем '''1 или 2 и 3 шаги''' в отношении нашего левела. &lt;br /&gt;
&lt;br /&gt;
Теперь нам нужно заручиться ОСОБЫМИ инструментами, в нашем случае понадобится [http://www.rapidshare.ru/532500 скрипт] от бардака, который позволяет узнать при запуске любого левела его '''level_vertex_id''', '''game_vertex_id''', '''position'''(координаты игрока в данный момент), '''direction'''(координаты направления его &amp;quot;взгляда&amp;quot;), всё это потребуется при работе с '''acdc''' несколькими этапами ниже. Загружаем игру, находим подходящее место где хотим видеть в будущем триггер для перехода уровней и записываем все параметры на бумажку, они нам понадобятся потом. По хорошему, желательно '''отдельно''' потом еще зайти в '''LE(level editor)''', открыть наш уровень, поставив эктора прям на графе с '''start_actor_01''', закомпилировать проект, пройти все шаги компиляции в '''xraicompiler'''(1,3,4,5,6), '''обязательно''' предварительно забэкапив '''game.graph''', начать новую игру и записать координаты '''level_vertex_id''' и '''direction''', но это достаточно нудно и сложно, но '''желательно''', а потом надо будет, вернуть всё в состояние до всех этих действий..., то есть убрать '''эктора''', восстановить оригинальный '''game.graph'''.&lt;br /&gt;
&lt;br /&gt;
Итак... у вас обязательно должна быть распакованна '''вся''' игра, установлен '''aiwrapper''' от бардака(читайте ридми по установке!!!), и '''aicompiler''' он нео.&lt;br /&gt;
&lt;br /&gt;
Создаем .bat фаил в папке с aiwrapper'ом с текстом&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -extract_spawns&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
либо вводим тоже в тотал коммандере, с помощью этого ключа мы обновили '''level.spawn''''ы всех сингл-уровней, так как они не обновлялись со времен первого патча. &lt;br /&gt;
&lt;br /&gt;
Теперь изучаем '''links.sample''' в блокноте. ничего не поняли? поясняю: '''aiwrapper''' обладает полезнейшим ключом '''-m2'''.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 -m2 &amp;lt;файл&amp;gt;	- склеить ИИ-графы карт в глобальный игровой граф с&lt;br /&gt;
		  учётом поправок для связей из указанного файла&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
То есть с помощью него мы можем взять любой существующий граф на уровне гсц, который &amp;quot;не занят&amp;quot;, и добавить ему нужные нам значения, например сделать его коннекшн поинтом(соеденительной точкой), а потом всё это склеится в общий глобальный '''game.graph'''.&lt;br /&gt;
&lt;br /&gt;
Выполняем  ''aiwrapper -dump_graph graphs.txt'' батом или тоталом. Комманда выведет нам  список исходных вершин ИИ-графа в указанный файл, то есть список скомпиленных графов всех сингл-уровней гсц в фаил '''graphs.txt'''. Находим там точку '''esc_graph_point_0034'''. Видите что она пуста в плане связей в отличии от exit_escape_01,02? Значит мы можем ее использовать, в оригинале разрабы их ставили для путей ботов, то есть по ним перемещается аи, но мы ее заюзаем для связи с нашим тестовым левелом.&lt;br /&gt;
&lt;br /&gt;
Итак, создаем например текстовик '''links_fixed.txt''' и вписываем туда&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[l01_escape]&lt;br /&gt;
; добавляем переход для ИИ с Кордона на тестовый уровень.&lt;br /&gt;
esc_graph_point_0034	= test_level_x, point_test_location_escape&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''test_level_x''' - название нашего уровня.&lt;br /&gt;
'''point_test_location_escape''' - коннекшн поинт на нашем уровне.&lt;br /&gt;
То есть мы прописываем у графпоинта на эскейпе эти два параметра, которые препращают его в коннекшн-поинт, связанный с тем, что на нашем левеле; сохраняем текстовик.&lt;br /&gt;
&lt;br /&gt;
Выполняем батом или тотал коммандером:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -m2 links_fixed.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
ЗЫЫ Желательно перед этим действом временно переместить куда-нибудь неиспользуемые левелы(мультиплеерные тоже) от греха подальше.&lt;br /&gt;
Ждем пока соберется '''game_graph''', ошибок быть недолжно.&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важные моменты 2 -- Loxotron|&lt;br /&gt;
message = Найден более простой способ вычисления '''game_vertex_id'''. В папке '''utils''' у компилятора бардака есть тулза '''ggtool.pl''' - утилита для показа межуровневых связей в '''game.graph'''. Копируем к утилите откомпилированный '''game.graph''' из '''gamedata\''' и выполняем прогу (в командной строке или через батник):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ggtool.pl game.graph &amp;gt;svyazi.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате в фаиле '''svyazi.txt''' в скобках будет указан '''game_vertex_id''' для конкретного уровня, таким образом не нужно узнавать '''dest_game_vertex_id''' c помощью перекомпилирования.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
l01_escape (0) --1206.29--&amp;gt; l02_garbage (415)&lt;br /&gt;
&lt;br /&gt;
0 - '''game_vertex_id''', 415 - '''dest_game_vertex_id''',&lt;br /&gt;
1206.29 - '''distance'''(расстояние между точками), не тот который в '''level_changer''''е, а между '''connection_point''''ами.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь дело за '''all.spawn''':&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
aiwrapper -s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В результате соберется полноценный '''all.spawn''' из всех уровней которые есть в папке '''levels'''. Но на этом работа только начинается, теперь надо '''отредактировать''' этот получившийся '''all.spawn''' и добавить '''level_changer''' на уровень гсц, чтобы мы смогли перейти с него на наш.(в нашем случае с эскейпа на test_level_x). Копируем получившийся '''all.spawn''' в &amp;lt;туда, куда вы распаковали aiwrapper&amp;gt;\utils и создаем .bat с таким текстом: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
acdc.pl -d all.spawn&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В результате мы разобрали all.spawn на ltx'сы, нам нужен '''alife_l01_escape.ltx''', вписываем в конец туда это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[не забитый номер]&lt;br /&gt;
;например 9000&lt;br /&gt;
section_name = level_changer &lt;br /&gt;
name = exit_to_new_location_from_esc&lt;br /&gt;
;любое_название_на_англ, (только не использованное)&lt;br /&gt;
position =&lt;br /&gt;
;здесь координаты где находиться левел чейнджер&lt;br /&gt;
;помните бумажку с координатами и параметрами, которую мы писали раньше?&lt;br /&gt;
;смотрим ту где параметры и координаты эскейпа и вписываем&lt;br /&gt;
direction = 0,0,0 &lt;br /&gt;
;направление &amp;quot;взгляда&amp;quot; игрока&lt;br /&gt;
;по желанию, можно вписать координаты с бумажки&lt;br /&gt;
game_vertex_id =  &lt;br /&gt;
;номер вершины игрового графа, задаёт первую вершину графа на данной локации&lt;br /&gt;
;с бумажки эскейпа&lt;br /&gt;
distance = 14.6999998092651&lt;br /&gt;
;&amp;quot;Расстояние&amp;quot; между точкой перехода(level_changer) и точкой появления&lt;br /&gt;
;актера на другом уровне (если считать зону неделимой), можно и 0.&lt;br /&gt;
level_vertex_id = &lt;br /&gt;
;Вершина уровневого графа, должно покатить '''-1''', но &lt;br /&gt;
;ставьте лучше то что записано на бумажке с эскейпа&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[pt_move_if_reject]&lt;br /&gt;
path = esc_way_test_if_reject&lt;br /&gt;
END&lt;br /&gt;
;custom data, где указано имя вейпоинта, который мы потом создадим &lt;br /&gt;
;на карте с помощью acdc, таже '''custom data''', что в начале &lt;br /&gt;
;статьи.&lt;br /&gt;
story_id =&lt;br /&gt;
;поставьте здесь неиспользуемый ID, например 8435&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 5.8284006118774,0,0&lt;br /&gt;
shape0:axis_y = 0,5.0005970001221,0&lt;br /&gt;
shape0:axis_z = 0,0,5.3902206420898&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
;сфера, в данном случае куб, именно в нем будет активироваться наш переход&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
;выставляем здесь все переменные для нового уровня&lt;br /&gt;
dest_game_vertex_id = &lt;br /&gt;
;номер вершины графа нашей новой локации, туда игрок переместится&lt;br /&gt;
;помните '''уникальный''' объект, который я просил вас поставить?&lt;br /&gt;
;открываем '''alife_lxx_unknown.ltx''' и ищем тачку, сдираем значение с нее&lt;br /&gt;
dest_level_vertex_id =&lt;br /&gt;
;вершина уровнего графа нового левела&lt;br /&gt;
;должно покатить -1, но лучше взять с бумажки с параметрами с тестового левела&lt;br /&gt;
dest_position =&lt;br /&gt;
;координаты на нашем уровне, где ты появляешься&lt;br /&gt;
;с бумажки тестового левела, либо наугад, либо используйте открорректированные&lt;br /&gt;
;координаты с любого объекта на вашей карте, то есть например есть дерево&lt;br /&gt;
;c координатами 0, 1 , 2, корректируем относительно дерева и &lt;br /&gt;
;вписываем например 4, 1, 2&lt;br /&gt;
dest_direction = 0,-1.12671363353729,0&lt;br /&gt;
;направление &amp;quot;взгляда игрока на новом уровне&amp;quot;&lt;br /&gt;
;по желанию&lt;br /&gt;
dest_level_name = &lt;br /&gt;
;название вашего уровня, в нашем случае test_level_x&lt;br /&gt;
dest_graph_point = &lt;br /&gt;
;название точки спавна игрока(графа, то есть в нашем случае&lt;br /&gt;
;start_actor_01)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Еще одно определение двух параметров для непонятливых:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
game_vertex_id - ставится как коннекшн поинт ('''graph_point''' c соответствующими настройками)&lt;br /&gt;
level_vertex_id - '''graph_point''' - ставится как обычная граф поинт с уникальным номером без параметров&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В них вписываем уникальный ID для каждого уровня, то есть в некоторых случаях просто смотрим эти два параметра у соседних объектов этого левела и вписываем значения. Как правило, '''level_vertex_id''' можно поставить '''-1''', но не для всех объектов, '''game_vertex_id''' = ид уровня.&lt;br /&gt;
&lt;br /&gt;
Устали? =) А ведь еще не всё, нужно создать вейпоинт, который мы прописали в '''custom data''' '''level changer''''а. Открываем '''way_l01_escape.ltx''' и вписываем чтото типа:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[esc_way_test_if_reject]&lt;br /&gt;
points = p0,p1&lt;br /&gt;
;два вейпоинта&lt;br /&gt;
p0:name = name_test1&lt;br /&gt;
;имя вейпоинта 1&lt;br /&gt;
p0:position = -243.491257,-19.758562,-140.328583&lt;br /&gt;
;его координаты, ставьте их рядом с координатами level_changer&lt;br /&gt;
;но не в нём, корректируйте их, как в примере с деревом &lt;br /&gt;
p0:game_vertex_id = 8&lt;br /&gt;
p0:level_vertex_id = -1&lt;br /&gt;
p0:links = p1(1)&lt;br /&gt;
&lt;br /&gt;
p1:name = name_test2&lt;br /&gt;
;имя вейпоинта 2&lt;br /&gt;
p1:position = -255.491257,-19.758562,-140.328583&lt;br /&gt;
;его координаты, всё тоже самое, только корректируйте относительно позиции&lt;br /&gt;
; вейпоинта 0, как в этом примере.&lt;br /&gt;
p1:game_vertex_id = 9&lt;br /&gt;
p1:level_vertex_id = -1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Поставили? Всё, осталось только собрать '''all.spawn''', батом или тотал коммандером выполняем это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
acdc.pl -c all.ltx&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь копируем получившийся '''all.spawn.new''' в '''gamedata\spawns\''' и переименовываем его в '''all.spawn'''.&lt;br /&gt;
&lt;br /&gt;
Мученья окончились :) Запускайте новую игру и наслаждайтесь вашим переходом...&lt;br /&gt;
&lt;br /&gt;
==В заключении==&lt;br /&gt;
Если вы хотите, чтобы ваша точка перехода отображалась на карте игрока, то лезем в '''level_tasks.script''' и добавляем в '''function add_lchanger_location()''' секцию, подобную представленной ниже:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		-- test_level_x&lt;br /&gt;
		local obj = sim:story_object(8435)&lt;br /&gt;
		if obj then&lt;br /&gt;
			level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;exit_to_new_location_from_esc&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В строке (obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;'''exit_to_new_location_from_esc'''&amp;quot;) выделенный текст - наименование вашего '''level_changer''', а число - его уникальный '''story_id''' на уровне, например на эскейпе или вашем левеле, список занятых '''story_id''' смотреть в '''lua_help.script'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Список необходимых программ ==&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewtheoned&amp;amp;lid=165 AiCompiler 0.1] от '''Neo'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewtheoned&amp;amp;lid=166 AiWrapper] от '''bardak''''а&lt;br /&gt;
*[http://www.rapidshare.ru/532500 Info_LVID_GVID] скрипт от '''bardak''''а&lt;br /&gt;
*[http://files.gsc-game.com/st/xray-sdk-setup-v0.4.exe SDK 0.4] от '''GSC'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewdownload&amp;amp;cid=13 SDK Update] от '''Neo''' + '''GSC'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewdownload&amp;amp;cid=13 Fixed Shaders] от '''Haron'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''written by Loxotron'''&lt;br /&gt;
&lt;br /&gt;
'''updated 11.01.08 by Loxotron'''&lt;br /&gt;
&lt;br /&gt;
'''24/06/08 небольшое добавление о компиляции - Kalinin11'''&lt;br /&gt;
[[Категория:Программы]][[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>80.91.161.165</name></author>	</entry>

	</feed>