Складання AI-сітки
Матеріал із Mod Wiki.
Зміст
Список необхідних програм
- AiCompiler 0.1 відNeo
- AiWrapper відbardak'а
- Info LVID/GVID скрипт відbardak'а
- SDK 0.4 відGSC
- SDK Update відNeo+GSC
- Pos Extracter – нова програма для роботи з координатами
Ну що ж. почнемо з найпростішого, скомпілюємо рівень з AI (монстрами) на картіmp_atp. Відкриваємо рівень. Перше, що треба зробити - прибрати все (rpoint (мультиплеєрні точки спавна). Прибрали? Чудово. СтворюємоSpawn elements -> actorну і за бажанням у властивостях (Properties) вcustom dataпрописуємо йому, припустимо, ось це:
Тим самим, при появі гравця у нього в руках вже буде AK74. Далі, створюємо монстра (будь-якого, за бажанням) - припустимо, кровососа, і ставимо на рівень. Тепер справа заAI Map- AI-сіткою, яка необхідна для того, щоб NPC та монстри могли орієнтуватися на рівні. ТиснемоObjectі клацаємо на землі (тим самим ми її "обрали" для подальших маніпуляцій), потімAI Map->Commands->Make list from selected, тиснемоAddу розділіAI Map NodesтаAddдля додавання об'єктів зліва вгорі (чайник), ставимо на карті ноди в потрібному вам порядку (досить одного), після чого тиснемоGenerate Full. Все, AI-сітка згенерована. Тепер додаємо на рівень (обов'язково!) один graph point (Spawns->AI->graph point), в ньому можна нічого не писати. Зберігаємо рівень, білдім (build).
Наступним кроком буде виправлення конфігів.
Тепер відкриваємоAI Compiler, вказуємо папку зSDK(. /level_editor, або якщо він об'єднаний з грою, шлях до неї). Вибираємо вашрівень. Проходимо першу стадію чорнового прорахунку AI-карти (крок 1), або, якщо ви хочете довго чекати і прорахувати укриття для NPC, то вибираємокрок 2. Далі, будуємо сітку (граф) і крос-таблицю рівня (крок 3), потім граф гри (крок 4) і нарешті фаїл .spawn (крок 5). Після всіх стадій заходимо в gamedata\spawns і перейменовуємоtest.spawnнаall.spawn
Правильний .bat файл:
%1 - назва левела
Поглиблене вивчення
Далі ми розглянемо як збирати кілька рівнів та встановлювати між ними переходи.
Отже, у вас є два рівні. одному з них стоїтьactor. Почнемо з нього:
СтворюємоAI->Level changer, потімShape->Sphere, за допомогоюScaleзбільшуємо до необхідних розмірів, тепер переключаємося в режим редагуванняSpawn element, виділяємоLevel changerі тиснемоCommands->Attach object, а потім клацаємо на сферу. Все, сфера та рівень changer тепер пов'язані. Далі йдемо в закладкуProperties, вказуємо назву, наприкладto_atp_2, тепер потрібно прописати вcustom dataвейпоїнт для повернення, у разі відмови гравця від переміщення з локації на локації (Робити це потрібно обов'язково). Вписуємо ось це:
УLevel to changeвписуємо найменування рівня, куди хочемо переміститися з цього левела, наприкладatp_2. У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 datalevel changer'а вейпоінт? Тепер нам доведеться його створити. ВибираємоWay Points-> тиснемо "чайник" і стави 1 вейпоінт поруч із level changer (так ми створили початкову точку шляху), тепер тиснемоpoint modeі ставимо другий. Якщо вони не з'єдналися стрілочкою, тиснемо create 1-link. Тепер у нас вийшов шлях, який ми прописали в custom datalevel changer, заходимо у властивості і обзиваємо його так само як і вcustom data, тобтоatp_1_way_if_reject. Все з першим рівнем покінчили.
Отже, відкриваємо другий рівень та поїхали новою.
Створюємо там шлях із двох вейпоїнтів за схемою вище і обзиваємоatp_2_way_if_reject. Створюємо level changer називаємо йогоto_atp_1, уcustom dataпишемо
Уlevel to changeвказуємо atp_1 //куди переходимо з atp_2 Уlevel point to change-start_actor_01(дада, який ми створили на першому левелі :) )
Тепер тут на atp_2 створюємо graph point з назвоюstart_actor_01. І щеодин де вписуємо наступні значення:
Не забудьте, щоACTORмає бути лише на одній локації (у нашому випадку на atp_1), інакше компілятор видасть помилку. Всі. Зберігаємо, перекомпиляємо.
ЗапускаємоAi Compiler, вибираємо по черзі наші два рівні та прораховуємо крок 1, перевіримо сітку. Тепер створюємотекстовий документі вписуємо туди
зберігаємо його як .bat і запускаємо, в результаті кожного рівня з'явиться свійlevel.graph(граф і крос-таблиця).
Створюємо ще одну текстовику, пишемо
зберігаємо як .bat та стартуємо. Так ми зібралиgame.graphзlevel.graph'ів.
І нарешті.. створюємо третій "бантик" для складанняall.spawn!
Компілім, заходимо вgamedata\spawns\, перейменовуємо спавн вall.spawnі запускаємо через нову гру. Як бачите, ви можете переміщатися з рівня на рівень туди сюди без будь-яких проблем.
Ледве не забув, обов'язково тимчасово, на час компіляції перемістіть решту левелів гри крім ваших в будь-яку іншу папку, інакше можуть бути помилки при зборі графів і спавна.
Для складаннявсіхсингл рівнів з оригінальної гри використовуйте bat фаїл: fullgame.bat Якщо будуть помилки пов'язані з алайфом, тиснемопродовжити. Потім виконуйте процедури, як написано вище, збіркаgame.graph, а потімall.spawn.
Додаємо наш рівень у сингл-плеєр!
Такс, продовжуємо. Мені таки вдалося поєднати свій тестовий левелів з картами гсц. Тож приступимо. По-перше нам необхідний левелів. свій, підготовлений. Якщо ви не читали інструкції вище, далі вам робити нічого. На нашому левелі має бути по-першеconnection point(з'єднувальна точка), вписуємо в неї параметри даного прикладу,припустимо такі:
Тепер створюємо ще один граф на рівні, просто вписуємо його ім'я. наприклад,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'ом з текстом
або вводимо теж в тотал коммандері, за допомогою цього ключа ми оновили всі сингл-рівнів, так як вони не оновлювалися з часів першого патчу.
Тепер вивчаємоlinks.sampleу блокноті. нічого не зрозуміли? пояснюю:aiwrapperмає найкорисніший ключ-m2.
Тобто за допомогою нього ми можемо взяти будь-який існуючий граф на рівні гсц, який "не зайнятий", і додати йому потрібні нам значення, наприклад зробити його коннекшн поінтом (з'єднувальною точкою), а потім все це склеїться в загальний глобальний game. .graph .
Виконуємоaiwrapper -dump_graph graphs.txtбатом чи тоталом. Команда виведе нам список вихідних вершин ІІ-графа у вказаний файл, тобто список скомпилених графів всіх сингл-рівень гсц у фаїлgraphs.txt. Знаходимо там точкуesc_graph_point_0034. Бачите, що вона порожня в плані зв'язків на відміну від exit_escape_01,02? Значить ми можемо її використовувати, в оригіналі розробники їх ставили для шляхів роботів, тобто по них переміщується аі, але ми її заюзаєм для зв'язку з нашим тестовим левелом.
Отже, створюємо текстовикlinks_fixed.txtі вписуємо туди
test_level_x- назва нашого рівня.point_test_location_escape- коннекшн поінт на нашому рівні. Тобто ми прописуємо у графпоінта на ескейпі ці два параметри, які перепрощують його в коннекшн-поінт, пов'язаний з тим, що на нашому левелі; зберігаємо текстовик.
Виконуємо батом або тотал коммандером:
ЗИИ Бажано перед цим дійством тимчасово перемістити кудись не використовувані левели (мультиплеєрні теж) від гріха подалі. Чекаємо поки що зберетьсяgame_graph, помилок бути не повинно.
В результаті у фаїлі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:
В результаті збереться повноціннийall.spawnз усіх рівнів, які є в папціlevels. Але на цьому робота тільки починається, тепер требавідредагуватицей вийшовall.spawnі додатиlevel_changerна рівень гсц, щоб ми змогли перейти з нього на наш. у разі з ескейпу на test_level_x). Копіюємоall.spawnв \utils і створюємо .bat з таким текстом:
В результаті ми розібрали all.spawn на ltx'си, нам потрібенalife_l01_escape.ltx, вписуємо в кінець туди це:
Ще одне визначення двох параметрів для незрозумілих:
У них вписуємо унікальний ID для кожного рівня, тобто в деяких випадках просто дивимося ці два параметри у сусідніх об'єктів цього левела та вписуємо значення. Як правило,level_vertex_idможна поставити-1, але не для всіх об'єктів,game_vertex_id= ід рівня.
Втомилися? =) А ще не все, потрібно створити вейпоінт, який ми прописали вcustom datalevel changer'а. Відкриваємоway_l01_escape.ltxі вписуємо щось на кшталт:
Поставили? Все, залишилося тільки зібратиall.spawn, батом або тотал коммандер виконуємо це:
Тепер копіюємоall.spawn.newвgamedata\spawns\і перейменовуємо його вall.spawn.
Муки закінчилися :) Запускайте нову гру та насолоджуйтесь вашим переходом.