Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

Кто не знаком с моей историей: мне 24, я композитор (и писатель) который устал ждать приглашение в Hotline Maiami 3 (поскольку я пишу музыку в духе Carpenter Brut) - и пошел в геймдев. Ну вы знаете, как это у нас, у композиторов бывает. Так вот, я собрал некоторый отчёт за последние 4 месяца работы над проектом, планировал который довольно давно. Изначально этот проект был моей серией незаконченных книг и текстовых набросков, потом планировался как отдельная игра, но команда развалилась. Спустя пару лет я решился взяться за него в соло, т.к терять мне больше нечего - жить аскетичнее меня невозможно.
Но давайте к сути:

Враг побежденный без ошибок побежден дважды - (с) Сунь Дзи
Враг побежденный без ошибок побежден дважды - (с) Сунь Дзи

Главные вопросы об игре:

Система частей тела (вместо экипировки) и брони.
Система частей тела (вместо экипировки) и брони.

Называется игра - Age Of Noise. Noise - это как радиация из сталкера, но идет из цифрового мира в реальность.

Добиться я хочу одного: опыта игры в MMORPG из аниме и книжек вроде SoloLeveling (или Дема Михайлова, если у вас хоть немного есть вкус)

0.0 - Сколько времени это всё заняло? - 16-19 часов в сутки в течении 4х месяцев с перерывами на создание видео для моего ютуб-канала. Последние дни я поймал ротовирус, и филонил.

0. Какого жанра игра? В чем геймплей? - Жанр игры я бы описал как Roguelike с длительным циклом. Строго-одиночный 3Д-Low-Poly Action-RPG от 3го лица, боёвка и мувмент полностью скопированы с Risk Of Rain 2.

Тематика и стиль: игра вдохновлена мангой BLAME! и аниме Sword Art Online (а так же Легендарным Лунным скульптором, Solo Leveling, и ещё кучей вещей о которых вы наверное не слышали) - в общем, всем жанром низкокачественной бульварной литературы LitRPG (без негатива, сам читаю).

В центре игры - огромная техно-фэнтези МЕГАСТРУКТУРА. Главный герой и все прочие персонажи - модульные, гуманоидные роботы, а так же "роботы-звери" по аналогии с Горизонт Нулевой Дурак. Фэнтези в данном контексте является просто продвинутой технологией.

Ранний скриншот из воксельной версии игры (сейчас уже Low-Poly)
Ранний скриншот из воксельной версии игры (сейчас уже Low-Poly)

Игровой цикл: появляешься в парящем городе на стартовом персонаже (роботе) -> получаешь цель (пройти башню в центре мира) -> получаешь летающий корабль -> исследуешь процедурно-генерирующиеся летающие острова -> выполняешь задачи на островах, тем самым открывая доступ к башне (изначально она закрыта) -> проходишь испытания в башне, profit.
Самый близкий геймплейный референс - Path Of Exile, и, внезапно - Kenshi. Делаешь персонажа, выполняешь ряд софткорных и хардкорных целей; есть общий лор, есть некоторый минимальный сюжет. Понимаю, что звучит очень обобщённо, но и концепт сложный. Подробнее о геймплее будет ниже.

1. Сколько людей в команде? Планируешь брать ещё? - всё, что будет описано ниже, я делал один, в основном с нуля (не считая движка конечно). Это было моей принципиальной позицией, но сейчас, получше разобравшись в 3д - я думаю, что в будущем мне может понадобиться один аниматор, и очень заряженный.

2. Какой у тебя опыт в программировании? Почему Godot? - Опыт у меня нулевой, до этого работал около 7ми месяцев с Unity но ничего оттуда не вынес + работал в 2д. До этого кучу раз пытался вкатиться в Java, в СиСи++, в Раст и Ассемблер, но рано забивал. На Godot у меня случился прорыв, потому что движок дает фантастическое ощущение "создания игры". Где-то за месяц с GDScript я понял большинство базовых вещей о функциональном программировании, об ООП, немного потрогал ECS (слишком сложно). Сейчас чувствую себя относительно уверенно со всем, что не касается операций с кватернионами и векторами.
3. Не слишком амбициозная игра? - Слишком, но меня это не волнует. За эти 4 месяца я уже получил больше опыта, чем за половину жизни. Мне действительно кажется странным, что я могу открыть теперь код на жабе или на расте, и п��имерно понять че там куда вызывается, где какой тип и что примерно случится. Даже если вся разработка зря и я слишком амбициозен - обучение, это безумно интересно. А теперь к делу.

И ещё - перед началом статьи я хочу попросить у читателя скидку. Я не игровой разработчик, или, по крайней мере - никогда таковым не был до этого года. У меня никогда не получалось в математику и код, я пол жизни провёл в церковном хоре, и всё происходящее сейчас - для меня очень в новинку.

Базис

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

Для начала перечислю вещи, которые я реализовал в первую очередь, и с которыми было больше всего проблем . Понимание реализации двух этих вещей сделали большинство других задач для меня - "относительно прозрачными".

1. Система загрузки и сохранения - эта система была тем, из-за чего я изначально бросил разрабатывать свою первую игру ( теперь я начал с неё в первую очередь).

Но тогда - уж слишком неинтуитивным мне казалось понятие, что сохраняем мы данные а не состояния, и при загрузке состояния репродуцируются на основе данных. Это вроде бы и на поверхности, но мне при всём моём гигантском игровом опыте (9к часов ПОЕ хахах) было неочевидно. Я наломал очень много дров, изматывал Chat GPT около месяца, и примерно 6 раз полностью рефакторил saveLoad систему. Итоговый вариант оказался настолько простым в реализации, что даже грустно, но за то я понимаю его от знака до знака, и он работает лучше не придумаешь.

2. Процедурная система чанков и островов - я хотел процедурной генерации, но не хотел скучной процедурной генерации. Разница в том, что "интересная" процедурка обычно использует не только алгоритмы, но и ручной контент. Изначально я конечно об этом не подумал, и пытался повторить генератор мира из Minecraft в годоте. У меня получилось, но воксели.... Я не буду здесь ничего говорить о дравколлах и тем более полигонаже с GI - кто знает, тот знает.

К слову, шейдер облаков который вы видите на скриншоте ниже я по итогу тоже убрал из проекта, потому как он осуществляется термоядерным реймарчингом, а при попытке оптимизировать - значительно ухудшается визуал. Мне он очень нравился, но... увы. Я хочу, что бы игра работала на любой картошке.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

В итоге я пришел к следующей идее: есть некоторое количество сделанных ручками островов (чем больше тем лучше) - эти острова в зависимости от своего размера (они разделены на группы) появляются либо кластерами, либо по 1 штуке в чанках подобно чанкам Minecraft. Я так-же реализовал для них систему "Процесс-лодов" (хз как это называется) - когда в зависимости от удаления, любая логика на них полностью выключается.

С этой системой я возился не меньше месяца, и она всё ещё далека от идеала - у меня даже есть предчувствие, что мне, возможно, придется от неё отказаться в будущем, если я не смогу достаточно хорошо её оптимизировать (избежав 15000 вызовов distanceTo в секунду) - но надеюсь, что нет. В крайнем случае - у меня есть запасные планы для запасных планов на тему ворлд-билдинга.3. Бонусный пункт: "Локализация!" - Я её очень боялся, но оказалось, что всё решается одной таблицей и ключами. До кучи я написал ещё синглтон-менеджер диалогов, что бы удобно работать с таблицей, и теперь могу делать визуальную новеллу XDD.

Системы

Теперь поговорим о том - что я уже успел сделать. Здесь я опущу некоторые очевидные вещи вроде блендинга анимаций (в моей игре можно бить / стрелять, и бежать одновременно) а так-же ряд других вещей, о которых я просто мог забыть.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

0.0 💢 Система Шума (Радиации) - Система шума должна быть основной в игре, поскольку она определяет зоны в которых игрок может находиться, и в каких не может (если он не позаботился о снаряжении). Как понятно из описания - шум, это просто радиация стилизованная под сай-фай. Аномалии - тоже самое. Поскольку в игре уже есть модульная система частей тела - я придумал кучу интересных и относительно простых в реализации аномалий.
Проблема в том, что я не знаю, как реализовать ШУМ оптимально по зонам, и потому система пока не готова. Я пока что очень плох во всём, что касается 3д преобразований, а здесь явно понадобятся маски для зон (не делать же это через триггеры и distance to?) Если кто знает, как в сталкере делали радиацию - отпишите, будет очень полезно.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

0💢. Боевая система - "готова"(никогда не говори гоп). Рассчитана на стрельбу и ближний бой одновременно. Игрок может носить 2 пистолета, и 1-ручное / 2-ручное оружие, парировать и блокировать, а так же потенциально (!!!) кастить магию. Количество выстрелов ограничено, пополняются в милли. Система полностью расширяема под любые типы анимаций и любые типы оружия (всё сделано на энумераторах и мэтчах, бойтесь ООПэшники, я фанат Джонатана Блоу)

👉1. Полностью реализована система заменяемых частей тела и разных состояний (выше был уже скрин - видео в ТГ, здесь не помещается). Если у персонажа нет ног - он падает на пол, и его сет анимаций меняется на ползающий (предполагается, что ещё сможет бегать на руках, но не сейчас) - если нет рук то не может бить и стрелять. Остальные синергии пока оставлю в тайне, но там интересно.

Фишка в том, что из за блендинга анимаций есть строгое разделение между мувсетом атаки и мувсетом движения - это с одной стороны приводит к проблемам (некоторые анимации выглядят нелепо) но так же позволяет адаптировать разные атаки для других стейтов движения, вроде ползанья. Костыль, да, но я в конце концов работаю один, а анимации не бесконечные.

💢1.1 - Важный нюанс касательно частей тела: у них есть прочность, и в зависимости от того, как и где игрок получает урон (упал, наступил в лужу, ударили по голове) - разные элементы тела по разному теряют прочность. Шум тоже значительно влияет на прочность, и есть шанс, что отправляясь в вылазку в шум - игрок может не выйти от туда на своих двоих. Если предмет ломается - он становится не-активен, пока не будет починен. В игре будет система "опыта и прокачки" оружия и элементов тела, так что прочность напрямую относится к этой системе.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

🤯2. на 70% реализована вся система "процедурной" генерации предметов. На самом деле я намеренно сделал её более "ручной", и она не будет ощущаться как "куча случайных предметов" из за системы "брендов" - всего в игре 5 таких брендов (стилей) предметов:

1. Black - (предметы в классическом киберпанк-стиле)

2. Noise - (визуально-странная категория экипировки отсылающая к архитектуре брутализма, которая заложена в основу игры)

3. Scrap - в этой категории все предметы отсылающие на Воллей, Бордерлендс, и любой другой ржавый сайфай.

4. Knight - Орден Техно-Рыцарей и предметы соответствующей тематики. Сильно вдохновлено вархаммером (т.к я читал ересь хоруса). Занимает ключевую часть в тематике игры.

5. Gotic - это как Knight, но больше, темнее, и тяжелее. Антипод, те самые хаоситы (т.к я читал ересь хоруса)

При генерации предмета, в зависимости от источника генерации и типа предмета - из соответствующего тематического пула выбирается набор мешей. Мечи обычно состоят из двух частей (2 меша / 2 модели) а руки и ноги из трёх. Материал в игре один (не считая шейдеры эффектов) - этот материал содержит альбедо-текстурный атлас на 64 градиента (выбирал палитру по опыту из пиксельарта).

На данный момент эта система является bottle-neck проекта, поскольку один персонаж требует 24 дравколла из за составных частей, даже при учете, что материал один. Поскольку NPC тоже генерируются на основе этой системы - потенциально, в местах вроде городов можно получить 500+ дравколлов только за счет NPC. Я частично решил это куллингом + Godot сам отсекает некоторые вещи, но ещё буду тестировать, когда закончу AI для нпс.

😄3. На 30% реализована система характеристик (Всего 3 основных характеристики, как в Fallout но в 2 раза меньше). Характеристики можно получать только за счет частей тела и разблокировки классов (да, как в корейских исекаях). Характеристики влияют друг на друга - например "fortitude" повышает переносимый вес, вес влияет на скорость и т.д. Пока что не реализована система техно-магии и доджей, так что 2 других стата в разработке.

🥺4. Полностью реализована система статус-эффектов, как в зельде или геншин-импакте. Осталось только прикрутить им нормальные VFX, когда я научусь их делать (сейчас в игре есть только эффект Шока, потому что я придумал, как его сделать). Планируется около 15 статусных эффектов, включая комбинации среднего и высшего порядка (т.е комбо-эффекты, которые очень сложно получить). Эффекты скейлятся от типов урона и реализованы через очень(очень) модульную систему компонентов, так что могут работать буквально с любым объектом, у которого есть флаг.

😄5. Все обозначенные выше пункты я спроектировал и написал так, что бы они работали с любыми NPC и потенциально с монстрами. С монстрами сложнее, т.к они не на столько похожи на игрока, как НПС.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

🤓6. Начал работать над противниками - сейчас в игре есть только маленький техно-паучок. Он генерируется из модульных частей, предпочитает нападать в стае, и в него хер попадешь двуручником ;). А ещё у него анимации не процедурные, потому что я очень боюсь даже приближаться к IK-Кинематике в годоте (пауки анимированы просто через node3d ручками без скелета, не спрашивайте).
По итогу, паучок, к сожалению, не очень умный, но что бы сделать его умнее - мне придется прокачаться в 3д моделировании и особенно в анимации.

🫵7. Начал работать над своим Рэдиант-AI в стиле Обливиона или Скайрима. Успехи есть, но пока не покажу. Планирую так-же применять его к противникам, но это может быть избыточно, так что пока думаю... размышляю.

🌎8. Начал писать саундтрек, но потом вспомнил что у меня в загашнике лежит 20 альбомов написанных, так что может быть выдерну что-то из них. Пока рано думать т.к врагов нормальных ещё нет.

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

☕9. Немного про упомянутые гильдии - одним из референсов игры является другая игра: Kenshi, и аниме Sword Art Online (а так же все прочие ЛИТРПГ) - я хочу перенести некоторые концепты из них в одиночную игру, и создать симуляцию, где НПС будут отыгрывать роль игроков (значительно глупее, конечно, но вы поиграйте с реальными людьми...). Систему гильдий я уже начал реализовывать, и вокруг неё крутится весомая часть сюжета. Игрок будет в своей гильдии единственным ГМом и участником - это такая отсылка на всех, кто заходя в мморпг без друзей, делал свою ГИ и сидел в ней один.

😍10. Классы - С классами всё несколько печально. По аналогии с пунктом 9, я хотел добавить классы из ЛИТРПГ, которые даются в основном за разные неочевидные действия на островах или гриндовые достижения. Ну вы знаете... "Легендарный лунный скульптор" за продажу 999 "Мраморных статуэток". ПРОБЛЕМА в том, что поскольку у меня нон-таргет боёвка, и делаю я игру один - у меня нет возможности добавить кучу скиллов для каждого класса (Это требует отдельных анимаций и кучи всего ещё). Так что классовые бонусы будут прокачивать в основном статы игрока и некоторые другие геймплейные фичи.

😳11. Приколы и фичи - В игре будет возможность "открыть лавку" на городской площади как в Perfect World, что бы НПС что-то у тебя купили (если захотят). NPC тоже так умеют, и могут трейдиться между собой. В игре будет (уже есть) возможность летать на жопе. Это достигается за счёт удаления ног, и экипировки специального тела с реактивным дном. В игре будет заточка до +25 с возможностью полностью сломать предмет, если не повезет (и разумеется с возможностью этого не допустить trollface)

Делаю одиночную MMORPG на Godot в стиле LitRpg (4 месяца) - Лонг | Long

Итог! (Заключение)

Я постараюсь не сойти с ума и дальше продолжать разработку - желания останавливаться нет, кроме поджимающих кредитов на еду и водопроводную воду. Возможно, скоро мне понадобится устраиваться в пятерочку, т.к найти работу программиста с моим очень специфическим опытом и партфолио нереально (а учить питон ради парсинга авито я не хочу). Но даже работа в пятерочке - это не на долго.

На самом деле я несколько расстроен своим прогрессом - хотелось бы делать всё быстрее, но разные проблемы то тут то там жрут много времени. А первые 2 месяца я вообще тратил на решение глупых ошибок с адресацией или ссылками, потому что не понимал, как работает движок и программирование в целом. Сейчас уже лучше, но всё равно, чувствую, что стоит поднажать.

Если вы по какой-то причине не верите, что я делаю игру сам - приходите на мои геймдев стримы на канале , и следите за видео/текстовыми девлогами в телеграмме

Вне зависимости от того, что из этого получится в итоге - мне действительно интересно работать над этим проектом, и надеюсь - что вам было интересно читать. Всех обнял - приподнял.

P.S - поддержать меня можно здесь:

15
8
4
1
1
27 комментариев