Динамическая генерация мира в RPG Maker!
И да… Вот он, второй пост по проекту «Магеном». Сейчас расскажу обо всём детальнее!
Если что, вот тут есть первая часть этой эпопеи, гляньте обязательно, кто не видел, тогда лучше будите суть.
А пока... Начну с того, что у нас тут не просто рандом, комнаты не накиданы как попало, о нет. В проекте есть сложная логическая система. И сейчас я попытаюсь объяснить её нормальным, человеческим языком, чтобы вы поняли, почему я так с неё кайфую!
Как вообще строится библиотека?
Вспомните, как вы маппите в самом Мейкере: берёте тайлы из тайлсета и стыкуете с другими. Ну, или кто никогда не тыкал Мейкер, представьте себе пазлы. Вот тут принцип тот же, только «тайлом» или «пазлом» выступает целая заготовленная заранее комната.
Я делаю кучу вариаций таких вот «комнат-деталек»: коридоры, залы, тупики, перекрестки, даже фермы или целые людские поселения. А алгоритм уже сам, при старте игры, начинает их стыковать, подставляя пазл к пазлу. Хотя... Сравнение с тайлами всё же более точное, ведь одну и ту же плитку можно положить на карту множество раз, понимаете намёк?)
НО, самое главное — алгоритм не делает откровенных косяков. Система жестко проверяет «коннекторы», а по-русски говоря — входы и выходы у комнат. Если у комнаты выход на Север, алгоритм подставит к ней только ту комнату, у которой есть вход с Юга. Если места для комнаты с кучей проходов нет физически — он туда её и не впихнет. Ну вот никак) А это значит — никаких невидимых стен в проходах. Никаких стыковок нижнего входа с правым)
Плюс, я научил его следить за тупиками. Если алгоритм видит, что длинная ветка уходит в никуда, он может принудительно замкнуть её в кольцо, чтобы вы не бегали туда-сюда по кишке, а могли вернуться к старту другим путем.
А теперь про фишки, которые на этот скелет накручены:
Формы уровней
Плагин умеет не просто лепить комнаты в кучу, а соблюдать общую геометрию этажа. Спираль, квадрат, крест, длинная линия или режим «далекие земли», где ты начинаешь с самого края карты, которая, как воронка, расширяется вглубь.
Пока что на первом уровне библиотеки используется стандартный паттерн «кляксы» (Random), но в будущих обновлениях я планирую новые, верхние и нижние уровни библиотеки, и вот там… Чем дальше, тем причудливее будет сама структура этажей.
Биомы (Система влияния)
Чтобы не было каши, когда ледяная комната стоит вплотную к вулкану, комнаты умеют «излучать» теги.
Допустим, спаунится у нас «Ядро Огня». Оно дает невидимую ауру тега Fire на несколько клеток вокруг. И генератор, видя это, начинает подставлять в соседние слоты только те комнаты, которые «любят» этот тег. И выкидывает то, что появиться никак тут не может. Пустыня? Да! Ледяные земли? Строгое нет! Так формируются целые тематические зоны, порой перетекающие друг в друга.
Обязательные комнаты
Рандом — это важно, но есть локации, которые ДОЛЖНЫ появиться. Как минимум ради сюжета. Или, например, та же Ферма, на которой завязано очень много геймплея (про что посты ещё будут).
Так вот… Тут работает система коэффициентов и множителей. Плагин с самого начала задаёт очень низкий шанс появления такой важной комнаты, и с каждой выставленной деталькой шанс растёт. НО, кроме этого, я могу задать условие, что-то вроде: «Шанс появления Фермы умножается на 100».
Это значит, что алгоритм выберет и поставит её почти сразу, где-то у самого входа.
А могу, наоборот, поставить понижающий коэффициент (например, 0.01), и тогда она появится где-то на самых границах карты.
При этом остальные обязательные комнаты продолжат появляться по стандартному алгоритму.
Миграция НПС
Библиотека не должна быть пустой. Там ходят люди. Для путников есть отдельная карта-пул. Самих персонажей я туда пока не заселил, но механика уже готова и работает: каждый игровой день плагин берет события из этого пула и раскидывает их по случайным точкам уже сгенерированного подземелья. Сегодня торговец здесь, завтра — вообще на другом конце карты. Вот тебе и случайные встречи, и гости на твоей базе.
Хотя, учитывая размеры карты, видеть других путников вы будете крайне редко. Что не так и плохо, ведь будут и оседлые неписи, о которых расскажу как-нибудь потом.
Интерьеры
Ещё генератор понимает разницу между частью библиотеки и помещением в ней. Внутри случайной комнаты может стоять палатка, или домик, или подвал. Вы заходите внутрь (прогружается статичная карта интерьера), выходите — и скрипт возвращает вас ровно в ту же точку лабиринта, сохраняя все координаты.
И тут та же логика, что и с картами-детальками. Одна и та же карта помещения будет считаться разными картами в зависимости от того, с какой комнаты туда заходит игрок. Если он откроет сундук на одной копии этой карты, а потом найдет такой же домик в другом месте, сундук будет цел. И, кстати, лут там будет отличаться. Как и мобы, которые могут игрока встретить)
В итоге с этой системой я выступаю тут кем-то вроде архитектора деталек для конструктора. Я задаю правила их стыковки, описываю логику поведения, веса, теги и наполнение, а игра сама строит приключение. И когда запускаю тест, я сам понятия не имею, как именно сложится карта в этот раз. И это кайф!)
Спасибо, что дочитали, всех люблю, удачки и до встречи! Скоро будет ещё не один пост о других, не менее взрывающих мозг системах!
А подробнее о том, чем я занимаюсь можно почитать в ТГ канале.