Складання 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.

Муки закінчилися :) Запускайте нову гру та насолоджуйтесь вашим переходом.