Панделириум: игра в жанре диаблоид на движке Godot

Попробовав делать рогалики я, через какое-то время, решил собрать и прототип игры более похожей по механикам на Diablo.

Панделириум: игра в жанре диаблоид на движке Godot

Этот прототип как раз реализует некоторые из игромеханик, упомянутых в предыдущей статье (и более ранних).

Какие-то вещи уже делал в прочих arpg-прототипах (та же Сферамида, например), которые предполагали разовые забеги, без сохранения лута. Этот прототип, фокусируется уже на концепции сохранения лута и прогресса зачистки врагов, сам лут уже с генерируемыми параметрами (разной редкости, зарядами и прочим), предполагает заготовки для прогрессии персонажа и прочий, более диаблоподобный подход к происходящему.

Здесь я рассказываю основные моменты и показываю процесс в видеоформате:

Запустить прототип в браузере или скачать версии для windows/linux можно на этой странице:

Панделирий | Pandeliriumthenonsense.itch.io

Особенности, общее

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

Уровень в редакторе движка
Уровень в редакторе движка

Инвентарь реализован проще чем в сферическом проекте, предметы опять занимают 1 ячейку и не оказывают влияния на соседние клетки.

Маленькие бутылки здоровья и маны дают разную концентрацию шкалы, как это было в Сферамиде. В то же время видов бутылок здесь меньше — 4 вида, против 6 в сферическом прототипе. В наиболее раннем, Chaosborn, были просто 1 бутылка здоровья и 1 бутылка маны.

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

Слева от здоровья полоска концентрации пока средняя и сейчас упадёт ниже, само здоровье при этом станет серым, а использование большой бутылки восполнит здоровье не сразу. Справа от маны концентрация максимальная, три деления, мана регенерирует.
Слева от здоровья полоска концентрации пока средняя и сейчас упадёт ниже, само здоровье при этом станет серым, а использование большой бутылки восполнит здоровье не сразу. Справа от маны концентрация максимальная, три деления, мана регенерирует.

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

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

item = [A,B,C,D,E,…,O,P,Q] , где А — номер картинки предмета, B — тип предмета, С — число редкости, D — прогресс в идентификации, E — степень изученности способности, F/G/H/I — параметры атаки для оружия (для не-оружия может содержать что-то другое), J/K — номер первого возможного бонуса и его количество, и так далее, например, число некоего заряда (для каких-то «заряжаемых» предметов или эмуляции параметра прочности).

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

Тем не менее, тот же тип предмета решено было оставить в массиве, для удобства. Да, его можно вычислить от картинки каждый раз, но проверки по типу — вещь довольно частая и лучше сделать их попроще.

Что касается свойств — те самые дьябловские аффексы (префиксы/суффиксы) — решил двигаться в сторону первой Diablo, где одна строчка сразу содержит свойство с фиксированным количеством бонуса. В первой части, опять же, все аффиксы целиком отражались в названии рандомного предмета, а далее от этого частично отошли.

Собственно, я подумал одно свойство выносить в префикс, в название предмета, а возможные дополнительные — уже нет. В прототипе, помимо обычных версий некоторых предметов дропаются редкие: зелёные и синие, у которых название меняется.

Геймплей более ранней версии игры (за первого персонажа — грибочеловека):

Экипированный посох отображается на персонаже, даёт возможность стрелять магией, а ещё им можно просто бить (кнопка Q). При простом ударе посох наносит врагу одну из своих позиций атаки (у него их 4, как и у всего предполагаемого ближнего оружия, если его вводить тоже). В целом такой подход изначально был удобнее для использования в тактической настолке, когда такая вещь, как броски на попадание, полностью упразднена и все исходы сразу зашиты в один бросок (поверх которого уже могут добавляться бонусы). То есть вместо бросок на попадание + бросок на повреждения — совершается всего 1 бросок, дающий сразу информацию о том, было ли попадание, попадание без повреждений или попадание с какими-то повреждениями. В ПК-варианте это не настолько актуально, как за столом, где удаление лишнего броска даёт очень большой буст к скорости сражений, но, почему бы и нет. Враги, кстати, атакуют героя по схожей схеме — у них есть набор из повреждений разной величины.

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

Персонаж выучил руну М (Е - доступна на старте), О - встроена в текущий посох. Наведя курсор на другое такое же оружие, видим, что оно пока ещё не идентифицировано (надо 3 искры) и показан прогресс изучения руны О (надо ещё 8 искр, чтобы изучить её)
Персонаж выучил руну М (Е — доступна на старте), О — встроена в текущий посох. Наведя курсор на другое такое же оружие, видим, что оно пока ещё не идентифицировано (надо 3 искры) и показан прогресс изучения руны О (надо ещё 8 искр, чтобы изучить её)

Слоты книги и свитка, пока они оба заполнены, меняют текущие активные заклинания на заклинание от комбинации рун книги и заклинание от комбинации руны книги и руны свитка. В данном случае на эти заклинание тратится не мана, а заряды свитка и когда они закончатся — свиток пропадает, и у героя снова его обычные заклинания, от своих рун и оружия.

Здесь я также реализовал смену оружия в руках персонажей. Специальная пустышка анимирована отдельным, синхронным с движениями персонажа, аниматором, и внутри неё в нужный момент выключается или выключается определённая моделька оружия. Если таких моделей очень много то более оптимальным способом будет уже подгружать/стирать нужную модельку динамически внутрь этой пустышки.

В качестве дефолтного варианта управления выставлена схема, при которой нужно удерживать кнопку (любую из клавиш WASD, или пробел), чтобы двигаться в сторону указателя мыши. В противном случае персонаж стоит на месте и поворачивается за мышью. Это достаточно удобный вариант для диаблоида, как по мне — и не совсем WASD и не свешивание управления на одну только мышь. В настройках можно немного изменить эту схему — делать по нажатию кнопки просто переключение в режим «стоять» или «автобег», чтобы не надо было удерживать для движения. Или же включить чисто WASD-движение.

Эффект просвечивания персонажа, как было в сферическом прототипе, здесь тоже имеется и он немного улучшен — теперь герой за препятствием становится как бы голографическим, а не пятном сплошного цвета.

Если нажать на портрет персонажа, то вылезает список параметров, которые сейчас ни на что не влияют — первичные (Ловкость, Сила, Разум, Интуиция) и производные/вторичные (вроде силы заклинаний, разных защит).

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

Второй персонаж, тень, на торговой точке. Включена английская локализация и открыт инвентарь. Если нажать кнопку, то откроется интерфейс распыления предметов и покупки бутылок.
Второй персонаж, тень, на торговой точке. Включена английская локализация и открыт инвентарь. Если нажать кнопку, то откроется интерфейс распыления предметов и покупки бутылок.

Слои с монстрами

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

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

При переходе на другой уровень, допустим, второй — сцена первого уровня удаляется и загружается сцена нового уровня. Текущий слой с монстрами не удаляется, но отсоединяется от родительской ветки и вместо него к ней присоединяется другой (соответствующий новому уровню), который мы словно достаём из стазиса.

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

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

Что касается редактирования объектов слоя — для этого в редакторе префаб сцены нужного уровня временно забрасывается в специальную пустышку на слое, чтобы видеть сам уровень, поверх которого этот слой и будет накладываться. После расстановки объектов префаб уровня отсюда удаляется и слой сохраняется.

Элементы уровня

Фрагмент с колоннами
Фрагмент с колоннами
"улолок"
«улолок»

Под основную архитектуру уровня базово выделена одна текстура, атлас, включающий в себя рисунок пола, колонн и прочих элементов. Некоторое исключение — области с лифтом, которые пока не планируется менять под разные стили уровней. Самих стилей пока два — новый, с рисованными текстурами (на первом уровне) и старый, с текстурой более «реалистичного» вида (второй третий уровни). По идее, каждые 2-3 этажа стиль уровня желательно менять на следующий, но это в дальнейшей перспективе.

Один из текстурных атласов
Один из текстурных атласов

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

Сборка "паззла" в редакторе
Сборка «паззла» в редакторе

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

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

Инструменты

Не только для конкретно этого проекта, а в целом что касается Godot-разработки в моём случае:

Собственно, сам игровой движок — Godot 3.5 (для некоторых прочих проектов Godot 4+)

Модели и текстуры — Blender 2.79 (для рендеров/мини роликов в том числе и Blender 3/4+)

Листы с иконками, эффектами и прочее 2д — Krita актуальной версии (удобно, что есть и векторные слои и растровые). Также в линуксе Pinta, для простого редактирования картинок.

Логи разработки — Zim Desktop Wiki и/или CherryTree (в первом сами файлы хранятся в виде иерархии простых текстовых документов в папках — удобно редактировать отдельно от программы, во втором пакете тексты зашиты внутрь его формата)

Захват видео — vokoscreenNG (на Manjaro Linux) и/или ShareX (на Win), который также хорош для скриншотов (а в линуксах хватает встроенных скриншотилок, например, отличнейший Spectacle)

Склейка видео — Shotcut (иногда Blender, обычно для склейки сделанных в нём же серий рендеров в avi)

 

Источник

Читайте также