Сповіщення
Очистити все

Компіляція -=inGame АІ=-


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 
Отже, приступимо... Якщо ви тут, значить є на те причина:
 
1)або ви нуп, що побачив аі-компілер і вирішив забацать щось круте
2) ви не нуп, але все забули або майже все
3)ви супер-аццький про який вирішив глянути на весь цей дитсадок згори )
4)ви простий модер, який вирішив розширити свої поточні знання. 😉
Основи
Ну що ж ... почнемо з найпростішого, скомпілим левів з аї, монстрами на карті mp_atp . Відкриваємо левел.. перше що треба зробити прибрати все rpoint (мультиплеєрні точки спавна). Прибрали? Чудово. Створюємо Spawn elements -> actor ну і за бажанням у властивостях ( Properties ) в custom data прописуємо йому припустимо ось це:
 
[spawn] 
wpn_ak74
Тим самим при появі гравця у нього вже буде калаш. Далі, створюємо монстра... будь-якого за бажанням, припустимо кровососа та ставимо на рівень. Тепер справа за AI map - сітка, яка необхідна для того, щоб нпс, монстри могли орієнтуватися за рівнем. Тиснемо Object і клацаємо на землі (тим самим ми її "обрали" для подальших маніпуляцій), потім AI Map -> Commands -> Make list from selected , тиснемо add у розділі AI Map Nodes і add для додавання об'єктів зліва вгорі (чайник) і ставимо на карті ноди в потрібному вам порядку (досить одного), тиснемо Generate Full . Все, аі-сітка згенерована. Тепер додаємо на левелів обов'язково! 1 graph point ( Spawns->ai->graph point ), у ньому можна нічого не писати. Зберігаємо рівень, білдім ( build ).
 
після цього не забуваємо скомпилить карту, (не забуваємо створити диск Х, прикладеною прогою)
 
Windows -> start -> run
і в командному рядку пишемо (mp_atp_test,тут назва карти):
 
Запуск рівня компіляції
Після коректної компіляції:
 
 
Завершення компіляції
Наступним кроком буде виправлення конфігів. Редагувати конфіги слід у папці gamedata\configs папки SDK, а потім можна перенести файли в аналогічну папку з грою.
 
Приклад:
 
game_maps_single.ltx
 
[ level_maps_single ] 
... _ _ _ _ _ _ _ /погода
 
 
 
 
 
 
 
 
 
game_levels.ltx
 
[levels] 
... 
level190 
// номер вашого рівня 
 
[level190] 
name = testing_ai 
caption = "testing_ai" 
offset = 2000.0, 800.0, 1000.0 // положення нового рівня на глобальній карті, X, Y, Z 
id = 190 
// ідентифакційний номер повинен бути унікальним
 
game_graphs.ltx
 
018 = "testing_ai"
Тепер відкриваємо AI Compiler, вказуємо папку зі СДК (.../level_editor, або якщо він об'єднаний з грою, шлях до неї). Вибираємо ваш рівень. Проходимо 1ую стадію чорнового прорахунку і карти ( крок 1 ), або якщо ви хочете довго чекати і прорахувати укриття для нпс то вибираємо крок 2 . Далі будуємо граф та крос-таблицю рівня крок 3, потім граф гри крок 4 і нарешті фаїл .spawn крок 5 . Після всіх стадій заходимо в gamedata \ spawns \ і перейменовуємо test.spawn в all.spawn
 
Важливо - Якщо ваш X-Ray SDK НЕ поєднаний з грою, то при перенесенні файлів для старту без вильотів ви повинні перенести з папки з X-Ray SDK наступні файли:
 
gamedata\config\game_maps_single.ltx
gamedata\config\game_graphs.ltx
gamedata\config\game_levels.ltx
gamedata\levels\папка з вашим рівнем
gamedata\spawns\all.spawn
gamedata\game.graph(цей файл багато хто не копіює і отримує виліт при запуску гри)
Lamp.gif Важливі моменти -- Loxotron
При правці конфігів не забувайте вказувати реально існуючу погоду і картинку завантаження, інакше вилетить; також не намагайтеся запустити рівень через .bat фаїл, подібний до зазначеного нижче, теж буде виліт
bin\xr_3da.exe -ltx user.ltx -nointro -external -start server(level/single) client(localhost)
Правильний .bat фаїл
 
@start bin\XR_3DA.exe -start server(%1/single/alife) client(localhost)
%1 - назва левела. Примітка : при запуску з такого батника ім'я спавна має бути не all.spawn, а <назва_левела>.spawn
 
 
Поглиблене вивчення
Далі ми розглянемо як збирати кілька рівнів та встановлювати між ними переходи.
 
Отже, у вас два рівні... на одному з них стоїть actor . Почнемо з нього: створюємо ai->level changer , потім shape->sphere , за допомогою scale збільшуємо до необхідних розмірів, тепер переключаємося в режим редагування spawn element , виділяємо level changer і тиснемо commands->attach object , а потім клацаємо на сферу. .. Все, сфера і рівень changer тепер пов'язані. Далі йдемо в закладку properties , вказуємо назву, наприклад to_atp_2 тепер потрібно прописати в custom data вейпоінт для повернення, у разі відмови гравця від переміщення з локації на локації (обов'язково). Вписуємо ось це:
 
 
[pt_move_if_reject] 
path = atp_1_way_if_reject 
//у разі відмови від переміщення на другу локу, повертаємось назад
У Level to change вписуємо найменування рівня, куди хочемо переміститися з цього левела, наприклад atp_2 . І найголовніше, у параметрах level_changer у пункті "restrictor type" поставити значення "not a restrictor", інакше буде виліт при переході на другу локу
 
- швидше за все, тип рестриктора був використаний на версії раніше 1.0004. На версії 1.0004 тип рестриктора не має значення і рестриктор відповідає лише за внутрішні налаштування локації - Еее...
 
У Level Point to change вказуємо точку, де гравець з'явиться... start_actor_01 . З level changer на цьому рівні все пішли далі. Створюємо graph point або використовуємо порожній існуючий, якщо у вас є. У нього вписуємо start_actor_01 , цей поінт для того, щоб ми змогли з другого левела atp_2 перейти на atp_1 (перший). Створюємо ще один graph point з назвою exit_atp_1_01 , у розділі location вибираємо, наприклад "екскейп". У Connection -> Level name вказуємо рівень, з яким буде пов'язаний atp_1 , тобто вибираємо atp_2 , Connection->Point Name вписуємо точку зв'язку з другого рівня, яку ми створимо потім exit_atp_2_01 . З першим рівнем все...
 
 
Навіщо нам потрібен graph point'ы exit_xxx ? exit_xxx є connection_point (точку зв'язку) - у тому, щоб компілятор знав, які рівні він з'єднує, і якщо інакше: початковий граф рівня, від нього потім вважаються все ноды.
 
 
start_actor_xx – точка появи актора після переходу.
 
Пам'ятаєте ми вписали у custom data level changer' а вейпоінт? Тепер нам доведеться його створити. Вибираємо Way Points -> тиснемо "чайник" і ставь 1 вейпоінт поруч з level changer (так ми створили початкову точку шляху), тепер тиснемо point mode і ставимо другий. Якщо вони не з'єдналися стрілочкою, тиснемо create 1-link . Тепер у нас вийшов шлях, який ми прописали в custom data level changer , заходимо у властивості і обзиваем його також як і в custom data , тобто atp_1_way_if_reject . Все з першим рівнем покінчили.
 
Отже, відкриваємо другий рівень і поїхали новою...
 
Створюємо там шлях із двох вейпоінтів за схемою вище та обзиваємо atp_2_way_if_reject . Створюємо level changer називаємо його to_atp_1 , в custom data пишемо
 
[pt_move_if_reject] 
path = atp_2_way_if_reject // Назва вейпоінта
У level to change вказуємо atp_1 //куди переходимо з atp_2 У level point to change - start_actor_01 (дада, який ми створили на першому левелі 🙂 )
 
Тепер тут на atp_2 створюємо graph point з назвою start_actor_01 . І ще один де вписуємо наступні значення:
 
Name: exit_atp_2_01 
Location: "сміттєзвалище" // найменування локації 
 
Connection: 
Level name: atp_1 // перший рівень 
Point name: exit_atp_1_01 // сполучна точка з першого рівня
 
Не забудьте, що ACTOR повинен бути лише на одній локації (у нашому випадку на atp_1), інакше компілятор випустить помилку. Все!... Зберігаємо, покомпиляємо.
 
Запускаємо Ai Compiler , вибираємо по черзі наші два рівні та прораховуємо крок 1, перевіримо сітку. Тепер створюємо текстовий документ та вписуємо туди
 
@start /wait bins\ai\1.exe -g atp_1 
@start /wait bins\ai\1.exe -g atp_2
зберігаємо його як .bat і запускаємо, в результаті кожного рівня з'явиться свій level.graph (граф і крос-таблиця).
 
Створюємо ще одну текстовику, пишемо
 
@start /wait bins\ai\1.exe -m
зберігаємо як .bat та стартуємо. Так ми зібрали game.graph з level.graph'ів .
 
І нарешті.. створюємо третій "бантик" для складання all.spawn !
 
bins\ai\1.exe -s
Компілім, заходимо в gamedata \ spawns \ , перейменовуємо спавн в all.spawn і запускаємо через нову гру. Як бачите, ви можете переміщатися з рівня на рівень туди сюди без будь-яких проблем.
 
Ледве не забув, обов'язково тимчасово, на час компіляції перемістіть решту левелів гри крім ваших в будь-яку іншу папку, інакше можуть бути помилки при зборі графів і спавна.
 
 
Для складання всіх сингл рівнів з оригінальної гри використовуйте bat фаїл: fullgame.bat Якщо будуть помилки пов'язані з алайфом, тиснемо продовжити . Потім виконуйте процедури як написано вище, складання game.graph , а потім all.spawn .
 
Додаємо наш рівень у сингл-плеєр!
Такс, продовжуємо. Мені таки вдалося поєднати свій тестовий левелів з картами гсц. Тож приступимо. По-перше нам необхідний левів... свій, підготовлений. Якщо ви не читали інструкції вище, далі вам робити нічого. На нашому левелі має бути по-перше connection point (з'єднувальна точка), вписуємо в неї параметри даного прикладу, припустимо такі:
 
Name: point_test_location_escape // назва коннекшн-поїнта 
 
  Connection 
       Level Name:L01_Escape //з яким рівнем його зв'язуємо 
       Point Name:esc_graph_point_0034 //з'єднувальний поінт на ескейпі, як 
                                      //його додати буде пояснено '''нижче'''.
Зробили?
 
Тепер створюємо ще один граф на рівні, просто вписуємо його ім'я... наприклад Name: start_actor_01 . Обов'язково додаємо на рівень якийсь унікальний об'єкт... припустимо машину . Навіщо дізнаєтеся потім. Але на левелі в жодному разі не повинно бути ACTOR'а !! Зберігаємо, перекомпилямо левів. Компилим за допомогою xrLC весь рівень, тепер відкриваємо AICompiler від нео і виконуємо 1 або 2 і 3 кроки щодо нашого левела.
 
Тепер нам потрібно заручитися ОСОБЛИВИМИ інструментами, в нашому випадку знадобиться скрипт від бардаку, який дозволяє дізнатися при запуску будь-якого левелу level_vertex_id , game_vertex_id , position (координати гравця в даний момент), direction (координати напряму його "погляду"), все це буде потрібно при роботи з ACDC кількома етапами нижче. Завантажуємо гру, знаходимо відповідне місце, де хочемо бачити в майбутньому тригер для переходу рівнів і записуємо всі параметри на папірець, вони нам знадобляться потім. По хорошому, бажано окремо потім ще зайти в LE(level editor) , відкрити наш рівень, поставивши ектора прямо на графі з start_actor_01 , закомпілювати проект, пройти всі кроки компіляції в xraicompiler (1,3,4,5,6), обов'язково попередньо забекапив game.graph , почати нову гру і записати координати level_vertex_id і direction , але це досить нудно і складно, але бажано , а потім треба буде, повернути все до всіх цих дій ..., тобто прибрати ектора , відновити оригінальний game .graph .
 
Отже... у вас обов'язково має бути розпакована вся гра, встановлений aiwrapper від бардака(читайте рідмі по установці!!!), і aicompiler він нео.
 
Створюємо .bat фаїл у папці з aiwrapper'ом з текстом
 
aiwrapper -extract_spawns
або вводимо теж у тотал коммандері, за допомогою цього ключа ми оновили level.spawn'и всіх сингл-рівнів, так як вони не оновлювалися з часів першого патчу.
 
Тепер вивчаємо links.sample у блокноті. нічого не зрозуміли? поясню: aiwrapper має найкорисніший ключ -m2 .
 
-m2 <файл> - склеїти ІІ-графи карт у глобальний ігровий граф з 
  урахуванням поправок для зв'язків із зазначеного файлу
Тобто за допомогою нього ми можемо взяти будь-який існуючий граф на рівні гсц, який "не зайнятий", і додати йому потрібні нам значення, наприклад зробити його коннекшн поінтом, а потім все це склеїться в загальний глобальний game.graph .
 
Виконуємо aiwrapper -dump_graph graphs.txt батом чи тоталом. Команда виведе нам список вихідних вершин ІІ-графа у вказаний файл, тобто список скомпилених графів всіх сингл-рівень гсц у файл graphs.txt . Знаходимо там точку esc_graph_point_0034 . Бачите, що вона порожня в плані зв'язків на відміну від exit_escape_01,02? Значить ми можемо її використовувати, в оригіналі розробники їх ставили для шляхів роботів, тобто по них переміщується аі, але ми її заюзаєм для зв'язку з нашим тестовим левелом.
 
Отже, створюємо текстовик links_fixed.txt і вписуємо туди
 
[l01_escape] 
; додаємо перехід для ІІ з Кордону на тестовий рівень. 
esc_graph_point_0034 = test_level_x, point_test_location_escape
test_level_x – назва нашого рівня. point_test_location_escape - коннекшн поінт на нашому рівні. Тобто ми прописуємо у графпоінта на ескейпі ці два параметри, які перепрощують його в коннекшн-поінт, пов'язаний з тим, що на нашому левелі; зберігаємо текстовик.
 
Виконуємо батом або тотал коммандером:
 
aiwrapper -m2 links_fixed.txt
ЗИИ Бажано перед цим дійством тимчасово перемістити кудись не використовувані левели (мультиплеєрні теж) від гріха подалі. Чекаємо поки збереться game_graph , помилок бути не повинно.
 
Lamp.gif Важливі моменти 2 - Loxotron
Знайдено простіший спосіб обчислення game_vertex_id . У папці utils компілятора бардака є тулза ggtool.pl - утиліта для показу міжрівневих зв'язків в game.graph . Копіюємо до утиліти відкомпільований game.graph з gamedata\ і виконуємо прогу (у командному рядку або через батник):
ggtool.pl game.graph >svyazi.txt
В результаті у фаїлі svyazi.txt у дужках буде вказано game_vertex_id для конкретного рівня, таким чином не потрібно впізнавати dest_game_vertex_id за допомогою перекомпілювання.
 
Приклад: l01_escape (0) --1206.29--> l02_garbage (415)
 
0 - game_vertex_id , 415 - dest_game_vertex_id , 1206.29 - distance (відстань між точками), не той що у level_changer' е, а між connection_point' ами.
 
 
Тепер справа за all.spawn :
 
aiwrapper -s
В результаті збереться повноцінний all.spawn з усіх рівнів, які є в папці levels . Але на цьому робота тільки починається, тепер треба відредагувати цей all.spawn, що вийшов , і додати level_changer на рівень гсц, щоб ми змогли перейти з нього на наш. (У нашому випадку з ескейпу на test_level_x). Копіюємо all.spawn в <туди, куди ви розпакували aiwrapper>\utils і створюємо .bat з таким текстом:
 
acdc.pl -d all.spawn
В результаті ми розібрали all.spawn на ltx'си, нам потрібен alife_l01_escape.ltx , вписуємо в кінець туди це:
 
[не забитий номер] 
;наприклад 9000 
section_name = level_changer 
name = exit_to_new_location_from_esc 
;будь-яка_назва_на_англ, (тільки не використане) 
position = 
;тут координати де знаходитися левів чейнджер ; 
пам'ятаєте папірець з координатами ;пам'ятаєте папірець з координатами ; 
;дивимося ту де параметри і координати ескейпу і вписуємо 
direction = 0,0,0 
;напрямок "погляду" гравця 
;за бажанням, можна вписати координати з папірця game_vertex_id 
=   
;номер вершини ігрового графа, задає першу вершину графа на даній локації; 
ескейпу 
distance = 14.6999998092651 
;"Відстань" між точкою переходу(level_changer) і точкою появи 
;актора на іншому рівні (якщо вважати зону неподільною), можна і 0. 
level_vertex_id = 
;Вершина рівневого графа''', , але 
;ставте краще те що записано на папірці з ескейпу 
object_flags = 0xffffff3e 
custom_data = <<END 
[pt_move_if_reject] 
path = esc_way_test_if_reject 
END 
;custom data, де вказано ім'я вейпоінта, який ми потім 
створимо 'custom data''', що на початку 
; статті. 
story_id = 
;поставте тут ID, що не використовується, наприклад 8435 
shapes = shape0 
shape0:type = box 
shape0:axis_x = 5.8284006118774,0,0 
shape0:axis_y 
= 0,5.0002505,00. 3902206420898 
shape0:offset = 0 ,0,0 
;сфера, в даному випадку куб, саме в ньому буде активуватися наш перехід 
restrictor_type = 3 
 
;виставляємо тут всі змінні для нового рівня 
dest_game_vertex_id = 
;номер вершини графа нашої нової локації, туди гравець переміститься 
;пам'ятайте '''унікальний'' '' об'єкт, який я просив вас поставити? 
;відкриваємо '''alife_lxx_unknown.ltx''' і шукаємо тачку, здираємо значення з неї 
dest_level_vertex_id = 
;вершина рівня графа нового левела 
;має покотити -1, але краще взяти з папірця з параметрами з тестового левела de_ 
, де ти з'являєшся 
;з папірця тестового левела, або навмання, або використовуйте відкроректовані 
;координати з будь-якого об'єкта на вашій карті, тобто є дерево 
;c координатами 0, 1 , 2, коригуємо щодо дерева і 
;вписуємо наприклад 4, 1, 2 
dest_direction = 0,-1.12671363353729,
 
 
 
назва вашого рівня, в нашому випадку test_level_x 
dest_graph_point = 
назва точки спавна гравця (графа, тобто в нашому випадку 
; start_actor_01)
Ще одне визначення двох параметрів для незрозумілих:
 
game_vertex_id - ставиться як коннекшн поінт ('''graph_point''' з відповідними налаштуваннями)
level_vertex_id - '''graph_point''' - ставиться як звичайна граф поінт з унікальним номером без параметрів
У них вписуємо унікальний ID для кожного рівня, тобто в деяких випадках просто дивимося ці два параметри у сусідніх об'єктів цього левела та вписуємо значення. Як правило, level_vertex_id можна поставити -1 , але не для всіх об'єктів, game_vertex_id = ід рівня.
 
Втомилися? =) А ще не все, потрібно створити вейпоінт, який ми прописали в custom data level changer'а . Відкриваємо way_l01_escape.ltx та вписуємо щось типу:
 
[esc_way_test_if_reject] 
points = p0, p1 
; два вейпоінта 
p0: name = name_test1 
; ім'я вейпоінта 1 
p0: position = -243.491257,-19.758562,-140.328583 
; його координат, його координат 
; коригуйте їх , як у прикладі з деревом 
p0:game_vertex_id = 8 
p0:level_vertex_id = -1 
p0:links = p1(1) 
 
p1:name = name_test2 
;ім'я вейпоінта 2 
p1:position = -255.491257,-19.758532 
,-5 все те саме, тільки коригуйте щодо позиції 
; вейпоїнта 0, як у цьому прикладі. 
p1: game_vertex_id = 9 
p1: level_vertex_id = -1
Поставили? Все, залишилося тільки зібрати all.spawn , батом або тотал коммандер виконуємо це:
 
acdc.pl -c all.ltx
Тепер копіюємо all.spawn.new в gamedata \ spawns \ і перейменовуємо його в all.spawn .
 
Муки скінчилися 🙂 Запускайте нову гру і насолоджуйтесь вашим переходом.
 
В ув'язненні
Якщо ви хочете, щоб ваша точка переходу відображалася на карті гравця, то ліземо в level_tasks.script і додаємо у function add_lchanger_location() секцію, подібну до наведеної нижче:
 
-- test_level_x 
local obj = sim:story_object(8435) 
if obj then 
level.map_add_object_spot(obj.id, "level_changer", "exit_to_new_location_from_esc") 
end
У рядку (obj.id, "level_changer", " exit_to_new_location_from_esc ") виділений текст - найменування вашого level_changer , а число - його унікальний story_id на рівні, наприклад на ескейпі або левелі, список зайнятих story_id дивитися необов'язково. Брати будь-яке число від 10000

   
Цитата