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

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

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

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

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

Прошлый вариант "лайт-диаблоида", arpg Сферамида, видеообзор

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

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

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

Инвентарь реализован проще чем в сферическом проекте, предметы опять занимают 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)

Комментарии (2)


  1. Jijiki
    10.02.2025 07:33

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


    1. thenonsense Автор
      10.02.2025 07:33

      Спасибо :)