Дизайн рівнів та генератор випадкового контенту - Kitchen Riots
Мені цей матеріал видався цікавим і я вирішила його перекласти для читачів нашого блогу.
За професією я левел-дизайнер. Я займалася і системним плануванням, і геймдизайном, і сценарним плануванням, але моє серце належить контент-дизайну. Найбільше задоволення я одержувала від створення саморобних вражень. Тому я трохи занервувала, коли в Kitfox вирішили, що ми як маленька команда, яка виживає на переповненому ринку, вкладемо всі сили в автоматизацію контенту.
Для початку я розповім трохи про структуру наших даних, продемонструю, як ми використовувалиUnity для створення дизайнерських «інструментів», і покажу, як із простої ідеї виросла складна структура. Пам'ятайте, що я дизайнер — у нашій грі я не написала жодного рядка коду.
Моя робота як дизайнер полягає в тому, щоб визначити, чого ми хочемо від гравця, і разом з програмістами перевести все це в робочі правила для движка гри. Паралельно ми з художником створювали естетично приємні декорації із модульних складових на основі цих правил. Так що на мій погляд тут описаний досить поверхневий погляд на логіку системи, на відміну від коду, який управляє генератором рівнів, або спрайтів, які він використовує, щоб відрендерити графіку.
Тож без зайвих слів… почнемо із самого початку.
Незабаром було визначено три кити, на яких стоятимуть усі наші дизайнерські рішення (з деякою поправкою на арт):
- Інтрига : пробуджує цікавість, нагороджує за експерименти та дослідження;
- Стратегія : нагороджує за тактичне мислення, має на увазі кілька різних шляхів досягнення переваги у бою;
- Доступність :миттєво захоплює багато фідбеку, заохочень, додаткової інформації.
Всі ці стовпи, звісно, мають власні недоліки, особливо якщо їх погано реалізувати. Якщо «інтригуючий» контент надто загадковий, то гравці його не помічатимуть або просто звірітимуть. Якщо стратегічна складова занадто сильна, це відштовхне чи злякає гравців, особливо планшетну аудиторію (якщо ми, звісно, не плануємо зманити фанатівParadox ). З іншого боку, якщо гра доступна, але в ній немає ні інтриги, ні стратегії, то вона буде лише пустушкою, якою нема чим зачепити хардкорних гравців.
З орієнтирами визначились. Тепер, щоб розпочати зведення рівнів, нам знадобляться будівельні блоки.
Структура кімнат
Ми хотіли почерпнути інформацію про алгоритми генерації рівнів з усього різноманіття інформації, що можна знайти в Інтернеті. Здебільшого це були алгоритми для "підземель", що будуються з прямокутних "кімнат" та "коридорів". На жаль, для створення враження "розколотої планети" нам потрібно було щось природніше. Ми прочитали і освоїли стільки, скільки змогли, і в результаті дійшли висновку, що використовувати існуючі алгоритми наша команда не зможе. (Хоча буквально через пару місяців було написано цей генератор печер).
Отже, ми задали для кожної кімнати мінімальні та максимальні значення довжини та ширини, використовуючи квадратні плитки. Наприклад, мінімальний розмір кімнати може бути 2х2, а максимальний 4х4. У результаті це дає різноманітність варіантів. Ось як насправді виглядав інструмент визначення розміру кімнат (для кожного рівня були задані 4-5 кімнат):
(без контексту не дуже ясно, так що пояснюю: Min та Max “Num Rooms” насправді лише показують, як багатокімнат цього типу з'явиться на рівні)
Я, як дизайнер рівнів, хотіла, щоб різні за розміром кімнати викликали у гравця різні емоції. Маленькі (2х2) кімнати більш клаустрофобічні, натомість дають більше тактичних можливостей, щоб перемогти ІІ, блокуючи та замикаючи ворогів у коридорі. Навпаки, великі кімнати відчуваються більш широкими та вільними, але з іншого боку, на них гравець може бути оточений з усіх боків. Ваш алгоритм стає більш непередбачуваним, коли різні рівні стають різними за емоційним сприйняттям. Нам було дуже важливо зберігати алгоритм непередбачуваним, даючи унікальне відчуття кожному за рівня.
Картинка вище – частина базового набору, а такі варіанти можна отримати, якщо додати ще кілька правил – наприклад, “дірки” для відображення прірв і озер:
Як бачите, у кожному варіанті є можливість появи прірв. Це повністю вирішується двигуном - як дизайнер я лише зазначаю, повинні в цій кімнаті бути дірки чи ні. Залежно від оточення (пустеля, лабораторія тощо), дірка перетворюється на воду, лазери, кислотне болото і т.д. Також я вирішую, які матеріали будуть використані в кімнаті (бруд та трава, камінь та трава чи всі разом) та які перешкоди (камені, гриби, всі разом). Скріншот ще одного інструменту: (GenDirt = бруд, Des Sandstone = пісковик, StoneDirt – навпіл і того й іншого, цей тип утворює межу між основними та другорядними типами матеріалів).
У кожній кімнаті також є від 2 до 4 видів "плитки", що працюють як тайли переходу. Як тільки вони з'єднуються з іншими кімнатами, гра використовує алгоритм пошуку шляху, вирішуючи де "безпечно" ставити перешкоди - так, щоб вони не заважали гравцеві досліджувати кімнату або знаходити скарби. Ось так,використовуючи ці нариси та мій досвід у традиційному левелдизайні, ми створили вихідний алгоритм побудови рівнів.
Якщо ви дизайнер рівнів, то ви знаєте що «критичний шлях» – це відрізок, повз який гравець ніяк не пройде, якщо він хоче завершити рівень (без урахування відгалужень та сайд-квестів). Зазвичай, щоб змусити гравця продовжувати йти у правильному напрямку, дизайнери розставляють нагороди (бонуси, вороги). Такий шлях може здатися не зовсім інтуїтивним, але враховуючи, що бої — веселе заняття і взагалі центральна особливість гри (якщо мова не про стелс), то швидше за все гравці шукатимуть собі пригод на гострий кінець клинка. Саме цей фактор змушує їх іти далі.
Закриті Двері
Щоб урізноманітнити гру та переконати гравця дослідити закутки, ми додали зачинені двері з ключами, розкиданими за рівнем. Щоб не зупиняти процес розвитку, ми вирішили використовувати механіку зачинених дверей тільки для додаткових нагород (і монстрів), тому зачинені двері ніколи не з'являлися на критичному шляху. Так як ми знаємо, які кімнати знаходяться на критичному шляху, а які ні, можна просто повністю прибрати один з коридорів поза основним шляхом і замінити його на двері (ви також можете побачити закриті двері на першій картинці триптиху зверху, якщо добре придивитеся):
На цьому етапі є ще кілька поліпшень алгоритму. Наприклад, ми хотіли переконатися, що в закритій кімнаті майже завжди знайдеться додаткова нагорода, і що ключ з'являється не в тій кімнаті, де стоїть двері.
Альтернативні Шляхи
І все одно, як тільки ми перестали робити критичний шлях і побічні кімнати із зачиненими дверима, ми усвідомили, що рівні у нас виходять нудні. Виникало занадто багато глухих кутів, щопризводило до постійного повернення на вихідну позицію, що особливо дратувало тих, хто хотів відшукати всі скарби… зовсім не те, що ми хотіли. Насправді, у кімнати могло максимум бути 2 виходи - не так вже й багато варіантів!
Щоб додати різноманітності, ми прикрутили зв'язки між кімнатами, перетворюючи тупики на наскрізні проходи. Пам'ятаєте, у параграфі «Структура Кімнат» я сказала, що ми помічаємо кілька дверей для кожної кімнати? Так ось, їх ми і використовуємо! Ми (тобто алгоритми движка) знаходимо пару дверей поблизу і малюємо лінію між ними, повертаючи там, де потрібно. Це вирішило проблему глухих кутів і зробило дослідження набагато цікавішим.
Будь-яке правило завжди має винятки. Навіть у геймдизайні. Особливо у геймдизайні. Хоча більшість нашої гри генерується автоматично, нам довелося вручну намалювати кілька рівнів – на кшталт космічного корабля, який є базою для гравця, секретних рівнів та боїв з босами. Ми намагалися використовувати ті самі дані настільки часто, наскільки це можливо. Так, наприклад, для плиток я використовувала ті ж куби як і в прикладах вище - погляньте, на цьому скріншоті я просто взяла звичайну плитку і замінила текстури з прикладів вище.
Засвоєні уроки та плани на майбутнє
Попереду ще багато роботи. Дизайн рівнів для Shattered Planet майже закінчений, але ми хочемо (як ви могли помітити на ілюстраціях вище) додати альтернативні телепорти, які дозволять перейти до спеціальних/секретних рівнів, а також дати гравцеві можливість прокладати власний шлях через провалля.
За допомогою всіх цих експериментів за останні кілька місяців ми з'ясували:
- Застосовуйте традиційні принципи геймдизайну (з деякимизмінами) – це досі працює!
- Алгоритмічна генерація забирає багато часу на тестування! Просте відтворення помилки забирає годинник запусків і перезапусків, щоб ізолювати необхідну частину алгоритму.
- Не намагайтеся уникати можливих нововведень, навіть після того, як ви «закінчили» розробку алгоритмів. Як і в будь-якій іншій області планування, ви навряд чи колись закінчите.
Дякую за читання!