Попробовав делать рогалики я, через какое-то время, решил собрать и прототип игры более похожей по механикам на 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 искр). Когда руна изучена, то она появляется для выбора в инвентаре - с ней можно будет выставить другую комбинацию рун, которая, возможно, изменит заклинание на левой кнопке мыши.

Слоты книги и свитка, пока они оба заполнены, меняют текущие активные заклинания на заклинание от комбинации рун книги и заклинание от комбинации руны книги и руны свитка. На эти, замещающие, заклинания тратится уже не мана, а заряды свитка и когда они закончатся - свиток пропадает, и у героя снова его обычные заклинания, от своих рун и оружия.
Здесь я также реализовал смену оружия в руках персонажей. Специальная пустышка анимирована отдельным, синхронным с движениями персонажа, аниматором, и внутри неё в нужный момент выключается или выключается определённая моделька оружия. Если таких моделей очень много то более оптимальным способом будет уже подгружать/стирать нужную модельку динамически внутрь этой пустышки.
В качестве дефолтного варианта управления выставлена схема, при которой нужно удерживать кнопку (любую из клавиш 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)

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